From ebfa510c78117b00dca0823273543839af6ba2b4 Mon Sep 17 00:00:00 2001 From: colin Date: Wed, 3 Dec 2025 11:27:10 +0800 Subject: [PATCH] feat(wechat): Optimize the Enterprise wechat module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增通讯录应用集成模块,通讯录相关接口事件移动到通讯录模块 - 新增办公应用集成模块,办公应用相关接口事件移动到办公模块 - 新增部分单元测试模块 --- .../LINGYUN.MicroService.WechatManagement.sln | 32 +- ...INGYUN.Abp.WeChat.SettingManagement.csproj | 3 +- .../AbpWeChatSettingManagementModule.cs | 2 + .../WeChatSettingAppService.cs | 13 + .../LINGYUN.Abp.WeChat.Work.Common.csproj | 2 +- .../Work/Common/AbpWeChatWorkCommonModule.cs | 24 -- .../Members}/Models/ExternalAttribute.cs | 2 +- .../ExternalAttributeDeserializeFactory.cs | 2 +- .../Members}/Models/ExternalAttributeType.cs | 2 +- .../Models/ExternalMiniProgramAttribute.cs | 2 +- .../Common/Members}/Models/ExternalProfile.cs | 2 +- .../Members}/Models/ExternalTextAttribute.cs | 2 +- .../Members}/Models/ExternalWebAttribute.cs | 2 +- .../Work/Common/Members/Models/Gender.cs | 25 ++ .../Models/MemberExtendAttribute.cs | 2 +- .../Common/Members}/Models/WechatChannel.cs | 2 +- .../Members}/Models/WechatChannelStatus.cs | 2 +- .../Json/EnumToNumberStringConverter.cs | 62 ++++ .../ExternalProfileNewtonsoftJsonConverter.cs | 7 +- .../Newtonsoft/Json/IntToBoolConverter.cs | 31 ++ .../EnumToNumberStringConverter.cs | 45 +++ .../ExternalProfileSystemTextJsonConverter.cs | 2 +- .../Serialization/IntToBoolJsonConverter.cs | 26 ++ .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 ++ .../LINGYUN.Abp.WeChat.Work.Contacts.csproj | 27 ++ .../Contacts/AbpWeChatWorkContactModule.cs | 45 +++ .../IWeChatWorkDepartmentProvider.cs | 87 +++++ .../Contacts/Departments/Models/Department.cs | 25 ++ .../Departments/Models/DepartmentInfo.cs | 39 +++ .../Departments/Models/SubDepartment.cs | 32 ++ .../WeChatWorkCreateDepartmentRequest.cs | 68 ++++ .../WeChatWorkDeleteDepartmentRequest.cs | 25 ++ .../WeChatWorkGetDepartmentListRequest.cs | 25 ++ .../Request/WeChatWorkGetDepartmentRequest.cs | 25 ++ .../WeChatWorkGetSubDepartmentListRequest.cs | 25 ++ .../WeChatWorkUpdateDepartmentRequest.cs | 60 ++++ .../WeChatWorkCreateDepartmentResponse.cs | 21 ++ .../WeChatWorkGetDepartmentListResponse.cs | 22 ++ .../WeChatWorkGetDepartmentResponse.cs | 22 ++ .../WeChatWorkGetSubDepartmentListResponse.cs | 22 ++ .../WeChatWorkDepartmentProvider.cs | 108 ++++++ ...atWorkContactsFeatureDefinitionProvider.cs | 31 ++ .../WeChatWorkContactsFeatureNames.cs | 14 + .../Contacts/Localization/Resources/en.json | 9 + .../Localization/Resources/zh-Hans.json | 9 + .../Members/IWeChatWorkMemberProvider.cs | 199 +++++++++++ .../Contacts/Members/Models/AttributeType.cs | 20 ++ .../Members/Models/DepartmentMember.cs | 39 +++ .../Contacts/Members/Models/DepartmentUser.cs | 25 ++ .../Work/Contacts/Members/Models/EmailType.cs | 20 ++ .../Members/Models/MemberAttribute.cs | 25 ++ .../MemberAttributeDeserializeFactory.cs | 33 ++ .../Members/Models/MemberExternalAttribute.cs | 18 + .../Contacts/Members/Models/MemberInfo.cs | 173 +++++++++ .../Contacts/Members/Models/MemberStatus.cs | 30 ++ .../Members/Models/MemberTextAttribute.cs | 29 ++ .../Members/Models/MemberWebAttribute.cs | 36 ++ .../Contacts/Members/Models/QrCodeSizeType.cs | 30 ++ .../WeChatWorkBulkDeleteMemberRequest.cs | 39 +++ .../WeChatWorkBulkInviteMemberRequest.cs | 63 ++++ .../WeChatWorkConvertToOpenIdRequest.cs | 26 ++ .../WeChatWorkConvertToUserIdRequest.cs | 27 ++ .../Request/WeChatWorkCreateMemberRequest.cs | 230 ++++++++++++ .../WeChatWorkGetUserIdByEmailRequest.cs | 35 ++ .../WeChatWorkGetUserIdByMobileRequest.cs | 26 ++ .../Request/WeChatWorkGetUserIdListRequest.cs | 42 +++ .../Request/WeChatWorkUpdateMemberRequest.cs | 236 +++++++++++++ .../WeChatWorkBulkInviteMemberResponse.cs | 35 ++ .../WeChatWorkConvertToOpenIdResponse.cs | 21 ++ .../WeChatWorkConvertToUserIdResponse.cs | 21 ++ .../WeChatWorkCreateMemberResponse.cs | 22 ++ .../WeChatWorkGetJoinQrCodeResponse.cs | 21 ++ .../WeChatWorkGetMemberListResponse.cs | 22 ++ .../Response/WeChatWorkGetMemberResponse.cs | 170 +++++++++ .../WeChatWorkGetSimpleMemberListResponse.cs | 22 ++ .../WeChatWorkGetUserIdListResponse.cs | 29 ++ .../Response/WeChatWorkGetUserIdResponse.cs | 18 + .../Members/WeChatWorkMemberProvider.cs | 209 +++++++++++ .../Messages/Models/BatchJobResultEvent.cs | 24 +- .../Messages/Models/CreateDepartmentEvent.cs | 3 +- .../Messages/Models/CreateUserEvent.cs | 3 +- .../Messages/Models/DeleteDepartmentEvent.cs | 3 +- .../Messages/Models/DeleteUserEvent.cs | 3 +- .../Messages/Models/DepartmentUpdateEvent.cs | 5 +- .../Messages/Models/UpdateDepartmentEvent.cs | 3 +- .../Messages/Models/UpdateUserEvent.cs | 3 +- .../Messages/Models/UserChangeEvent.cs | 6 +- .../Messages/Models/UserTagChangeEvent.cs | 3 +- ...hatWorkContactSettingDefinitionProvider.cs | 30 ++ .../Settings/WeChatWorkContactSettingNames.cs | 12 + .../Contacts}/Tags/IWeChatWorkTagProvider.cs | 20 +- .../Work/Contacts}/Tags/Models/TagInfo.cs | 2 +- .../Work/Contacts}/Tags/Models/TagUserInfo.cs | 2 +- .../Tags/Request/WeChatWorkGetTagRequest.cs | 2 +- .../WeChatWorkTagChangeMemberRequest.cs | 4 +- .../Request/WeChatWorkTagCreateRequest.cs | 4 +- .../Request/WeChatWorkTagUpdateRequest.cs | 4 +- .../WeChatWorkTagChangeMemberResponse.cs | 5 +- .../Response/WeChatWorkTagCreateResponse.cs | 2 +- .../Response/WeChatWorkTagListResponse.cs | 7 +- .../WeChatWorkTagMemberInfoResponse.cs | 9 +- .../Contacts}/Tags/WeChatWorkTagProvider.cs | 59 ++-- .../Token/IWeChatWorkContactTokenProvider.cs | 23 ++ .../Token/WeChatWorkContactTokenProvider.cs | 140 ++++++++ .../README.md | 37 ++ ...WeChatWorkRequestExtensions.Departments.cs | 141 ++++++++ ...ientWeChatWorkRequestExtensions.Members.cs | 329 ++++++++++++++++++ ...ClientWeChatWorkRequestExtensions.Tags.cs} | 61 ++-- .../HttpClientWeChatWorkRequestExtensions.cs | 21 ++ .../Http/HttpResponseDeserializeExtensions.cs | 19 + .../AbpWeChatWorkExternalContactModule.cs | 4 +- .../Customers/Models/ExternalContactInfo.cs | 2 +- .../LINGYUN.Abp.WeChat.Work.Handlers.csproj | 1 + .../Handlers/AbpWeChatWorkHandlersModule.cs | 2 + .../Messages/WeChatWorkEventEventHandler.cs | 1 + .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 ++ .../LINGYUN.Abp.WeChat.Work.OA.csproj | 27 ++ .../WeChat/Work/OA/AbpWeChatWorkOAModule.cs | 36 ++ .../IWeChatWorkApprovalTemplateProvider.cs | 7 +- .../OA}/Approvals/Models/ApprovalApplyData.cs | 2 +- .../Approvals/Models/ApprovalApplyProcess.cs | 2 +- .../Models/ApprovalApplyProcessNode.cs | 2 +- .../OA}/Approvals/Models/ApprovalApplyer.cs | 2 +- .../Approvals/Models/ApprovalApproverAttr.cs | 2 +- .../OA}/Approvals/Models/ApprovalComment.cs | 2 +- .../Approvals/Models/ApprovalControlData.cs | 2 +- .../Approvals/Models/ApprovalControlValue.cs | 2 +- .../Work/OA}/Approvals/Models/ApprovalData.cs | 2 +- .../Approvals/Models/ApprovalDetailInfo.cs | 2 +- .../Approvals/Models/ApprovalInfoFilter.cs | 2 +- .../OA}/Approvals/Models/ApprovalProcess.cs | 2 +- .../Approvals/Models/ApprovalProcessNode.cs | 2 +- .../Models/ApprovalProcessNodeStatus.cs | 2 +- .../Models/ApprovalProcessNodeType.cs | 2 +- .../Models/ApprovalProcessSubNode.cs | 2 +- .../OA}/Approvals/Models/ApprovalSpRecord.cs | 2 +- .../Models/ApprovalSpRecordDetail.cs | 2 +- .../Models/ApprovalSpRecordStatus.cs | 2 +- .../OA}/Approvals/Models/ApprovalSpStatus.cs | 2 +- .../OA}/Approvals/Models/ApprovalSummary.cs | 2 +- .../Approvals/Models/ApprovalSummaryInfo.cs | 2 +- .../Work/OA}/Approvals/Models/ApprovalUser.cs | 2 +- .../Models/AttendanceControlConfig.cs | 2 +- .../Models/AttendanceControlValue.cs | 2 +- .../Approvals/Models/ContactControlConfig.cs | 2 +- .../Approvals/Models/ContactControlValue.cs | 2 +- .../Work/OA}/Approvals/Models/Control.cs | 2 +- .../OA}/Approvals/Models/ControlConfig.cs | 2 +- .../Approvals/Models/ControlConfigFactory.cs | 2 +- .../Work/OA}/Approvals/Models/ControlData.cs | 2 +- .../Work/OA}/Approvals/Models/ControlInfo.cs | 2 +- .../Approvals/Models/ControlPlaceholder.cs | 2 +- .../Work/OA}/Approvals/Models/ControlTtile.cs | 2 +- .../Work/OA}/Approvals/Models/ControlValue.cs | 2 +- .../OA}/Approvals/Models/DateControlConfig.cs | 2 +- .../OA}/Approvals/Models/DateControlValue.cs | 2 +- .../OA}/Approvals/Models/DateRangeConfig.cs | 2 +- .../Models/DateRangeControlConfig.cs | 2 +- .../Approvals/Models/DateRangeControlValue.cs | 2 +- .../Models/DepartmentControlValue.cs | 2 +- .../OA}/Approvals/Models/FileControlConfig.cs | 2 +- .../OA}/Approvals/Models/FileControlValue.cs | 2 +- .../Approvals/Models/FormulaControlValue.cs | 2 +- .../Approvals/Models/LocationControlConfig.cs | 2 +- .../Approvals/Models/LocationControlValue.cs | 2 +- .../Approvals/Models/MemberControlValue.cs | 2 +- .../OA}/Approvals/Models/MoneyControlValue.cs | 2 +- .../Approvals/Models/NumberControlValue.cs | 2 +- .../Models/RelatedApprovalControlConfig.cs | 2 +- .../Models/RelatedApprovalControlValue.cs | 2 +- .../Approvals/Models/SelectorControlConfig.cs | 2 +- .../Approvals/Models/SelectorControlValue.cs | 2 +- .../Approvals/Models/TableControlConfig.cs | 2 +- .../OA}/Approvals/Models/TableControlValue.cs | 2 +- .../OA}/Approvals/Models/TemplateContent.cs | 2 +- .../Work/OA}/Approvals/Models/TemplateName.cs | 2 +- .../OA}/Approvals/Models/TextControlValue.cs | 2 +- .../Approvals/Models/TextareaControlValue.cs | 2 +- .../OA}/Approvals/Models/TipsControlConfig.cs | 2 +- .../Approvals/Models/VacationControlValue.cs | 2 +- .../Request/WeChatWorkApplyEventRequest.cs | 8 +- .../WeChatWorkCreateTemplateRequest.cs | 8 +- .../WeChatWorkGetApprovalDetailRequest.cs | 6 +- .../WeChatWorkGetApprovalInfoRequest.cs | 8 +- .../Request/WeChatWorkGetTemplateRequest.cs | 6 +- .../WeChatWorkUpdateTemplateRequest.cs | 6 +- .../Response/WeChatWorkApplyEventResponse.cs | 4 +- .../WeChatWorkCreateTemplateResponse.cs | 4 +- .../WeChatWorkGetApprovalDetailResponse.cs | 6 +- .../WeChatWorkGetApprovalInfoResponse.cs | 4 +- .../Response/WeChatWorkTemplateResponse.cs | 6 +- .../WeChatWorkApprovalTemplateProvider.cs | 54 +-- .../WeChatWorkOAFeatureDefinitionProvider.cs | 32 ++ .../OA/Features/WeChatWorkOAFeatureNames.cs | 14 + .../Work/OA/Localization/Resources/en.json | 7 + .../OA/Localization/Resources/zh-Hans.json | 7 + .../IWeChatWorkMeetingRoomProvider.cs | 132 +++++++ .../Models/MeetingRoomBookingInfo.cs | 25 ++ .../Models/MeetingRoomCoordinate.cs | 30 ++ .../OA/MeetingRooms/Models/MeetingRoomInfo.cs | 83 +++++ .../MeetingRooms/Models/MeetingRoomRange.cs | 30 ++ .../Models/MeetingRoomSchedule.cs | 53 +++ .../Models/MeetingRoomScheduleStatus.cs | 25 ++ ...ChatWorkBookMeetingRoomByMeetingRequest.cs | 45 +++ ...hatWorkBookMeetingRoomByScheduleRequest.cs | 45 +++ .../WeChatWorkBookMeetingRoomRequest.cs | 99 ++++++ .../WeChatWorkCancelBookMeetingRoomRequest.cs | 49 +++ .../WeChatWorkCreateMeetingRoomRequest.cs | 138 ++++++++ .../WeChatWorkDeleteMeetingRoomRequest.cs | 26 ++ .../WeChatWorkGetMeetingRoomBookRequest.cs | 34 ++ ...hatWorkGetMeetingRoomBookingListRequest.cs | 68 ++++ .../WeChatWorkGetMeetingRoomListRequest.cs | 92 +++++ .../WeChatWorkUpdateMeetingRoomRequest.cs | 147 ++++++++ ...hatWorkBookMeetingRoomByMeetingResponse.cs | 28 ++ ...atWorkBookMeetingRoomByScheduleResponse.cs | 28 ++ .../WeChatWorkBookMeetingRoomResponse.cs | 28 ++ .../WeChatWorkCreateMeetingRoomResponse.cs | 21 ++ .../WeChatWorkGetMeetingRoomBookResponse.cs | 22 ++ ...atWorkGetMeetingRoomBookingListResponse.cs | 22 ++ .../WeChatWorkGetMeetingRoomListResponse.cs | 22 ++ .../WeChatWorkMeetingRoomProvider.cs | 148 ++++++++ .../Messages/Models/BookMeetingRoomEvent.cs | 3 +- .../Messages/Models/CancelMeetingRoomEvent.cs | 3 +- .../OA/Messages/Models/DeleteCalendarEvent.cs | 26 ++ .../OA/Messages/Models/DeleteScheduleEvent.cs | 31 ++ .../Messages/Models/RespondScheduleEvent.cs | 31 ++ .../OA/Messages/Models/UpdateCalendarEvent.cs | 26 ++ .../OA/Messages/Models/UpdateScheduleEvent.cs | 31 ++ .../Schedules/IWeChatWorkCalendarProvider.cs | 60 ++++ .../Schedules/IWeChatWorkScheduleProvider.cs | 96 +++++ .../OA/Schedules/Models/CalendarFailResult.cs | 18 + .../OA/Schedules/Models/CalendarFailShare.cs | 32 ++ .../Work/OA/Schedules/Models/CalendarInfo.cs | 78 +++++ .../Schedules/Models/CalendarPublicRange.cs | 30 ++ .../Schedules/Models/CalendarScheduleInfo.cs | 18 + .../Work/OA/Schedules/Models/CalendarShare.cs | 25 ++ .../Models/CalendarSharePermission.cs | 20 ++ .../OA/Schedules/Models/CreateCalendar.cs | 11 + .../Models/CreateOrUpdateCalendar.cs | 128 +++++++ .../Models/CreateOrUpdateSchedule.cs | 128 +++++++ .../OA/Schedules/Models/CreateSchedule.cs | 13 + .../OA/Schedules/Models/ScheduleAttendee.cs | 23 ++ .../Schedules/Models/ScheduleAttendeeInfo.cs | 25 ++ .../Models/ScheduleAttendeeResponseStatus.cs | 35 ++ .../OA/Schedules/Models/ScheduleDeleteMode.cs | 25 ++ .../Work/OA/Schedules/Models/ScheduleInfo.cs | 103 ++++++ .../OA/Schedules/Models/ScheduleReminder.cs | 139 ++++++++ .../Models/ScheduleReminderExcludeTime.cs | 18 + .../Models/ScheduleReminderRepeatType.cs | 35 ++ .../OA/Schedules/Models/ScheduleStatus.cs | 20 ++ .../OA/Schedules/Models/ScheduleUpdateMode.cs | 25 ++ .../OA/Schedules/Models/UpdateCalendar.cs | 29 ++ .../OA/Schedules/Models/UpdateSchedule.cs | 30 ++ .../WeChatWorkCreateCalendarRequest.cs | 41 +++ .../WeChatWorkCreateScheduleRequest.cs | 41 +++ .../WeChatWorkDeleteCalendarRequest.cs | 26 ++ .../WeChatWorkDeleteScheduleRequest.cs | 67 ++++ .../WeChatWorkGetCalendarListRequest.cs | 47 +++ ...hatWorkGetScheduleListByCalendarRequest.cs | 51 +++ .../WeChatWorkGetScheduleListRequest.cs | 47 +++ .../WeChatWorkScheduleAddAttendeesRequest.cs | 13 + ...eChatWorkScheduleChangeAttendeesRequest.cs | 69 ++++ ...eChatWorkScheduleDeleteAttendeesRequest.cs | 13 + .../WeChatWorkUpdateCalendarRequest.cs | 42 +++ .../WeChatWorkUpdateScheduleRequest.cs | 84 +++++ .../WeChatWorkCreateCalendarResponse.cs | 29 ++ .../WeChatWorkCreateScheduleResponse.cs | 21 ++ .../WeChatWorkGetCalendarListResponse.cs | 22 ++ ...atWorkGetScheduleListByCalendarResponse.cs | 22 ++ .../WeChatWorkGetScheduleListResponse.cs | 22 ++ .../WeChatWorkUpdateCalendarResponse.cs | 22 ++ .../WeChatWorkUpdateScheduleResponse.cs | 24 ++ .../Schedules/WeChatWorkCalendarProvider.cs | 76 ++++ .../Schedules/WeChatWorkScheduleProvider.cs | 112 ++++++ .../Json/ControlNewtonsoftJsonConverter.cs | 12 +- .../LINGYUN.Abp.WeChat.Work.OA/README.md | 38 ++ .../System/DateTimeTimeStampExtenssions.cs | 15 + ...entWeChatWorkRequestExtensions.Approval.cs | 52 ++- ...eChatWorkRequestExtensions.MeetingRooms.cs | 231 ++++++++++++ ...ntWeChatWorkRequestExtensions.Schedules.cs | 253 ++++++++++++++ .../HttpClientWeChatWorkRequestExtensions.cs | 6 + .../Http/HttpResponseDeserializeExtensions.cs | 19 + .../ControlSystemTextJsonConverter.cs | 4 +- .../Messages/IWeChatWorkMessageManager.cs | 2 +- .../Work/Messages/IWeChatWorkMessageSender.cs | 6 +- .../Work/Token/IWeChatWorkTokenProvider.cs | 1 - ...rvice.WechatManagement.HttpApi.Host.csproj | 2 + .../WechatManagementHttpApiHostModule.cs | 4 + .../GlobalUsings.cs | 2 + ...GYUN.Abp.WeChat.Work.Contacts.Tests.csproj | 20 ++ .../Contacts/AbpWeChatWorkContactTestBase.cs | 6 + .../AbpWeChatWorkContactTestModule.cs | 22 ++ .../Members/WeChatWorkMemberProvider_Tests.cs | 24 ++ .../GlobalUsings.cs | 2 + .../LINGYUN.Abp.WeChat.Work.OA.Tests.csproj | 20 ++ .../WeChat/Work/OA/AbpWeChatWorkOATestBase.cs | 6 + .../Work/OA/AbpWeChatWorkOATestModule.cs | 22 ++ .../WeChatWorkMeetingRoomProvider_Tests.cs | 174 +++++++++ ...bpWeChatWorkMessageResolveOptions_Tests.cs | 26 ++ .../WeChatWorkCalendarProvider_Tests.cs | 114 ++++++ .../WeChatWorkScheduleProvider_Tests.cs | 122 +++++++ 303 files changed, 9012 insertions(+), 302 deletions(-) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact => LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members}/Models/ExternalAttribute.cs (91%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact => LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members}/Models/ExternalAttributeDeserializeFactory.cs (96%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact => LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members}/Models/ExternalAttributeType.cs (88%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact => LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members}/Models/ExternalMiniProgramAttribute.cs (95%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact => LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members}/Models/ExternalProfile.cs (95%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact => LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members}/Models/ExternalTextAttribute.cs (90%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact => LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members}/Models/ExternalWebAttribute.cs (93%) create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/Gender.cs rename aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/{Messages => Members}/Models/MemberExtendAttribute.cs (96%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact => LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members}/Models/WechatChannel.cs (91%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact => LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members}/Models/WechatChannelStatus.cs (86%) create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/Newtonsoft/Json/EnumToNumberStringConverter.cs rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.ExternalContact => LINGYUN.Abp.WeChat.Work.Common}/Newtonsoft/Json/ExternalProfileNewtonsoftJsonConverter.cs (90%) create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/Newtonsoft/Json/IntToBoolConverter.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/System/Text/Json/Serialization/EnumToNumberStringConverter.cs rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.ExternalContact => LINGYUN.Abp.WeChat.Work.Common}/System/Text/Json/Serialization/ExternalProfileSystemTextJsonConverter.cs (97%) create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/System/Text/Json/Serialization/IntToBoolJsonConverter.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/FodyWeavers.xml create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/FodyWeavers.xsd create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN.Abp.WeChat.Work.Contacts.csproj create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/AbpWeChatWorkContactModule.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/IWeChatWorkDepartmentProvider.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Models/Department.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Models/DepartmentInfo.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Models/SubDepartment.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkCreateDepartmentRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkDeleteDepartmentRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkGetDepartmentListRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkGetDepartmentRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkGetSubDepartmentListRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkUpdateDepartmentRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Response/WeChatWorkCreateDepartmentResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Response/WeChatWorkGetDepartmentListResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Response/WeChatWorkGetDepartmentResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Response/WeChatWorkGetSubDepartmentListResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/WeChatWorkDepartmentProvider.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Features/WeChatWorkContactsFeatureDefinitionProvider.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Features/WeChatWorkContactsFeatureNames.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Localization/Resources/en.json create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Localization/Resources/zh-Hans.json create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/IWeChatWorkMemberProvider.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/AttributeType.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/DepartmentMember.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/DepartmentUser.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/EmailType.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberAttribute.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberAttributeDeserializeFactory.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberExternalAttribute.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberInfo.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberStatus.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberTextAttribute.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberWebAttribute.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/QrCodeSizeType.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkBulkDeleteMemberRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkBulkInviteMemberRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkConvertToOpenIdRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkConvertToUserIdRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkCreateMemberRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkGetUserIdByEmailRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkGetUserIdByMobileRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkGetUserIdListRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkUpdateMemberRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkBulkInviteMemberResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkConvertToOpenIdResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkConvertToUserIdResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkCreateMemberResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetJoinQrCodeResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetMemberListResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetMemberResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetSimpleMemberListResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetUserIdListResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetUserIdResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/WeChatWorkMemberProvider.cs rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Messages/Models/BatchJobResultEvent.cs (61%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Messages/Models/CreateDepartmentEvent.cs (82%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Messages/Models/CreateUserEvent.cs (75%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Messages/Models/DeleteDepartmentEvent.cs (82%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Messages/Models/DeleteUserEvent.cs (82%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Messages/Models/DepartmentUpdateEvent.cs (77%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Messages/Models/UpdateDepartmentEvent.cs (76%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Messages/Models/UpdateUserEvent.cs (83%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Messages/Models/UserChangeEvent.cs (96%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Messages/Models/UserTagChangeEvent.cs (92%) create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Settings/WeChatWorkContactSettingDefinitionProvider.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Settings/WeChatWorkContactSettingNames.cs rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Tags/IWeChatWorkTagProvider.cs (79%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Tags/Models/TagInfo.cs (89%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Tags/Models/TagUserInfo.cs (90%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Tags/Request/WeChatWorkGetTagRequest.cs (89%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Tags/Request/WeChatWorkTagChangeMemberRequest.cs (93%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Tags/Request/WeChatWorkTagCreateRequest.cs (89%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Tags/Request/WeChatWorkTagUpdateRequest.cs (89%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Tags/Response/WeChatWorkTagChangeMemberResponse.cs (82%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Tags/Response/WeChatWorkTagCreateResponse.cs (89%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Tags/Response/WeChatWorkTagListResponse.cs (72%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Tags/Response/WeChatWorkTagMemberInfoResponse.cs (78%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts}/Tags/WeChatWorkTagProvider.cs (52%) create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Token/IWeChatWorkContactTokenProvider.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Token/WeChatWorkContactTokenProvider.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/README.md create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Departments.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Members.cs rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Tag.cs => LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Tags.cs} (59%) create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpClientWeChatWorkRequestExtensions.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpResponseDeserializeExtensions.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/FodyWeavers.xml create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/FodyWeavers.xsd create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN.Abp.WeChat.Work.OA.csproj create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/AbpWeChatWorkOAModule.cs rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/IWeChatWorkApprovalTemplateProvider.cs (93%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalApplyData.cs (92%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalApplyProcess.cs (91%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalApplyProcessNode.cs (97%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalApplyer.cs (87%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalApproverAttr.cs (85%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalComment.cs (95%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalControlData.cs (97%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalControlValue.cs (97%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalData.cs (92%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalDetailInfo.cs (98%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalInfoFilter.cs (96%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalProcess.cs (87%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalProcessNode.cs (95%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalProcessNodeStatus.cs (95%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalProcessNodeType.cs (88%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalProcessSubNode.cs (95%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalSpRecord.cs (94%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalSpRecordDetail.cs (95%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalSpRecordStatus.cs (94%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalSpStatus.cs (94%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalSummary.cs (91%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalSummaryInfo.cs (94%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ApprovalUser.cs (86%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/AttendanceControlConfig.cs (95%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/AttendanceControlValue.cs (97%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ContactControlConfig.cs (96%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ContactControlValue.cs (66%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/Control.cs (92%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ControlConfig.cs (59%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ControlConfigFactory.cs (97%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ControlData.cs (99%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ControlInfo.cs (98%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ControlPlaceholder.cs (94%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ControlTtile.cs (94%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/ControlValue.cs (58%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/DateControlConfig.cs (93%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/DateControlValue.cs (96%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/DateRangeConfig.cs (95%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/DateRangeControlConfig.cs (90%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/DateRangeControlValue.cs (97%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/DepartmentControlValue.cs (96%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/FileControlConfig.cs (94%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/FileControlValue.cs (97%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/FormulaControlValue.cs (93%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/LocationControlConfig.cs (94%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/LocationControlValue.cs (96%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/MemberControlValue.cs (96%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/MoneyControlValue.cs (91%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/NumberControlValue.cs (91%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/RelatedApprovalControlConfig.cs (95%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/RelatedApprovalControlValue.cs (94%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/SelectorControlConfig.cs (98%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/SelectorControlValue.cs (98%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/TableControlConfig.cs (95%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/TableControlValue.cs (95%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/TemplateContent.cs (89%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/TemplateName.cs (92%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/TextControlValue.cs (91%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/TextareaControlValue.cs (91%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/TipsControlConfig.cs (98%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Models/VacationControlValue.cs (98%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Request/WeChatWorkApplyEventRequest.cs (92%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Request/WeChatWorkCreateTemplateRequest.cs (78%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Request/WeChatWorkGetApprovalDetailRequest.cs (68%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Request/WeChatWorkGetApprovalInfoRequest.cs (88%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Request/WeChatWorkGetTemplateRequest.cs (70%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Request/WeChatWorkUpdateTemplateRequest.cs (86%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Response/WeChatWorkApplyEventResponse.cs (76%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Response/WeChatWorkCreateTemplateResponse.cs (76%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Response/WeChatWorkGetApprovalDetailResponse.cs (69%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Response/WeChatWorkGetApprovalInfoResponse.cs (84%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/Response/WeChatWorkTemplateResponse.cs (84%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Approvals/WeChatWorkApprovalTemplateProvider.cs (53%) create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Features/WeChatWorkOAFeatureDefinitionProvider.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Features/WeChatWorkOAFeatureNames.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Localization/Resources/en.json create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Localization/Resources/zh-Hans.json create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/IWeChatWorkMeetingRoomProvider.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomBookingInfo.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomCoordinate.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomInfo.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomRange.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomSchedule.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomScheduleStatus.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkBookMeetingRoomByMeetingRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkBookMeetingRoomByScheduleRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkBookMeetingRoomRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkCancelBookMeetingRoomRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkCreateMeetingRoomRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkDeleteMeetingRoomRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkGetMeetingRoomBookRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkGetMeetingRoomBookingListRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkGetMeetingRoomListRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkUpdateMeetingRoomRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkBookMeetingRoomByMeetingResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkBookMeetingRoomByScheduleResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkBookMeetingRoomResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkCreateMeetingRoomResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkGetMeetingRoomBookResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkGetMeetingRoomBookingListResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkGetMeetingRoomListResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/WeChatWorkMeetingRoomProvider.cs rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Messages/Models/BookMeetingRoomEvent.cs (89%) rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common => LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA}/Messages/Models/CancelMeetingRoomEvent.cs (90%) create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/DeleteCalendarEvent.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/DeleteScheduleEvent.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/RespondScheduleEvent.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/UpdateCalendarEvent.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/UpdateScheduleEvent.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/IWeChatWorkCalendarProvider.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/IWeChatWorkScheduleProvider.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarFailResult.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarFailShare.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarInfo.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarPublicRange.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarScheduleInfo.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarShare.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarSharePermission.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CreateCalendar.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CreateOrUpdateCalendar.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CreateOrUpdateSchedule.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CreateSchedule.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleAttendee.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleAttendeeInfo.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleAttendeeResponseStatus.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleDeleteMode.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleInfo.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleReminder.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleReminderExcludeTime.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleReminderRepeatType.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleStatus.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleUpdateMode.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/UpdateCalendar.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/UpdateSchedule.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkCreateCalendarRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkCreateScheduleRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkDeleteCalendarRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkDeleteScheduleRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkGetCalendarListRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkGetScheduleListByCalendarRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkGetScheduleListRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkScheduleAddAttendeesRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkScheduleChangeAttendeesRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkScheduleDeleteAttendeesRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkUpdateCalendarRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkUpdateScheduleRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkCreateCalendarResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkCreateScheduleResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkGetCalendarListResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkGetScheduleListByCalendarResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkGetScheduleListResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkUpdateCalendarResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkUpdateScheduleResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/WeChatWorkCalendarProvider.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/WeChatWorkScheduleProvider.cs rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work => LINGYUN.Abp.WeChat.Work.OA}/Newtonsoft/Json/ControlNewtonsoftJsonConverter.cs (74%) create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/README.md create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/DateTimeTimeStampExtenssions.cs rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work => LINGYUN.Abp.WeChat.Work.OA}/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Approval.cs (61%) create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Net/Http/HttpClientWeChatWorkRequestExtensions.MeetingRooms.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Schedules.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Net/Http/HttpClientWeChatWorkRequestExtensions.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Net/Http/HttpResponseDeserializeExtensions.cs rename aspnet-core/framework/wechat/{LINGYUN.Abp.WeChat.Work => LINGYUN.Abp.WeChat.Work.OA}/System/Text/Json/Serialization/ControlSystemTextJsonConverter.cs (93%) create mode 100644 aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/GlobalUsings.cs create mode 100644 aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests.csproj create mode 100644 aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/LINGYUN/Abp/WeChat/Work/Contacts/AbpWeChatWorkContactTestBase.cs create mode 100644 aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/LINGYUN/Abp/WeChat/Work/Contacts/AbpWeChatWorkContactTestModule.cs create mode 100644 aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/LINGYUN/Abp/WeChat/Work/Contacts/Members/WeChatWorkMemberProvider_Tests.cs create mode 100644 aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/GlobalUsings.cs create mode 100644 aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN.Abp.WeChat.Work.OA.Tests.csproj create mode 100644 aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/AbpWeChatWorkOATestBase.cs create mode 100644 aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/AbpWeChatWorkOATestModule.cs create mode 100644 aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/WeChatWorkMeetingRoomProvider_Tests.cs create mode 100644 aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/Messages/AbpWeChatWorkMessageResolveOptions_Tests.cs create mode 100644 aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/Schedules/WeChatWorkCalendarProvider_Tests.cs create mode 100644 aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/Schedules/WeChatWorkScheduleProvider_Tests.cs diff --git a/aspnet-core/LINGYUN.MicroService.WechatManagement.sln b/aspnet-core/LINGYUN.MicroService.WechatManagement.sln index 22ef88c5e..52d42375d 100644 --- a/aspnet-core/LINGYUN.MicroService.WechatManagement.sln +++ b/aspnet-core/LINGYUN.MicroService.WechatManagement.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31903.59 +# Visual Studio Version 18 +VisualStudioVersion = 18.0.11205.157 d18.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "framework", "framework", "{BD5616DF-D493-4170-8E78-46486BE77FC2}" EndProject @@ -127,6 +127,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.WeChat.Work.Ext EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.WeChat.Work.Handlers", "framework\wechat\LINGYUN.Abp.WeChat.Work.Handlers\LINGYUN.Abp.WeChat.Work.Handlers.csproj", "{E0DFCAD9-8AFE-A816-10F7-B4CA6691E910}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.WeChat.Work.Contacts", "framework\wechat\LINGYUN.Abp.WeChat.Work.Contacts\LINGYUN.Abp.WeChat.Work.Contacts.csproj", "{69419D6B-9DA5-D9BD-1D6C-61BBAE331057}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.WeChat.Work.Contacts.Tests", "tests\LINGYUN.Abp.WeChat.Work.Contacts.Tests\LINGYUN.Abp.WeChat.Work.Contacts.Tests.csproj", "{C3BEBB5D-EF3A-4387-8357-0C3829756E41}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.WeChat.Work.OA", "framework\wechat\LINGYUN.Abp.WeChat.Work.OA\LINGYUN.Abp.WeChat.Work.OA.csproj", "{BA80572F-49BD-41E3-89D8-AE5BF15B00F9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.WeChat.Work.OA.Tests", "tests\LINGYUN.Abp.WeChat.Work.OA.Tests\LINGYUN.Abp.WeChat.Work.OA.Tests.csproj", "{0209DBBA-CF63-4538-AB8D-452E9A591336}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -325,6 +333,22 @@ Global {E0DFCAD9-8AFE-A816-10F7-B4CA6691E910}.Debug|Any CPU.Build.0 = Debug|Any CPU {E0DFCAD9-8AFE-A816-10F7-B4CA6691E910}.Release|Any CPU.ActiveCfg = Release|Any CPU {E0DFCAD9-8AFE-A816-10F7-B4CA6691E910}.Release|Any CPU.Build.0 = Release|Any CPU + {69419D6B-9DA5-D9BD-1D6C-61BBAE331057}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {69419D6B-9DA5-D9BD-1D6C-61BBAE331057}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69419D6B-9DA5-D9BD-1D6C-61BBAE331057}.Release|Any CPU.ActiveCfg = Release|Any CPU + {69419D6B-9DA5-D9BD-1D6C-61BBAE331057}.Release|Any CPU.Build.0 = Release|Any CPU + {C3BEBB5D-EF3A-4387-8357-0C3829756E41}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C3BEBB5D-EF3A-4387-8357-0C3829756E41}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C3BEBB5D-EF3A-4387-8357-0C3829756E41}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C3BEBB5D-EF3A-4387-8357-0C3829756E41}.Release|Any CPU.Build.0 = Release|Any CPU + {BA80572F-49BD-41E3-89D8-AE5BF15B00F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BA80572F-49BD-41E3-89D8-AE5BF15B00F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BA80572F-49BD-41E3-89D8-AE5BF15B00F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BA80572F-49BD-41E3-89D8-AE5BF15B00F9}.Release|Any CPU.Build.0 = Release|Any CPU + {0209DBBA-CF63-4538-AB8D-452E9A591336}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0209DBBA-CF63-4538-AB8D-452E9A591336}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0209DBBA-CF63-4538-AB8D-452E9A591336}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0209DBBA-CF63-4538-AB8D-452E9A591336}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -388,6 +412,10 @@ Global {9DC2A982-8FA2-93BE-5FE1-3D7F7C105C39} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} {6628FB84-66C0-4023-9AA0-AAC4C0CC5917} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} {E0DFCAD9-8AFE-A816-10F7-B4CA6691E910} = {EDBB7BC1-46F0-4803-A572-7F8FEF433BE2} + {69419D6B-9DA5-D9BD-1D6C-61BBAE331057} = {EDBB7BC1-46F0-4803-A572-7F8FEF433BE2} + {C3BEBB5D-EF3A-4387-8357-0C3829756E41} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {BA80572F-49BD-41E3-89D8-AE5BF15B00F9} = {EDBB7BC1-46F0-4803-A572-7F8FEF433BE2} + {0209DBBA-CF63-4538-AB8D-452E9A591336} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {EC9D01C1-EA3C-48C7-A279-4D35C8AD312E} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.SettingManagement/LINGYUN.Abp.WeChat.SettingManagement.csproj b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.SettingManagement/LINGYUN.Abp.WeChat.SettingManagement.csproj index b78c3524e..a4be432da 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.SettingManagement/LINGYUN.Abp.WeChat.SettingManagement.csproj +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.SettingManagement/LINGYUN.Abp.WeChat.SettingManagement.csproj @@ -1,4 +1,4 @@ - + @@ -30,6 +30,7 @@ + diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.SettingManagement/LINGYUN/Abp/WeChat/SettingManagement/AbpWeChatSettingManagementModule.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.SettingManagement/LINGYUN/Abp/WeChat/SettingManagement/AbpWeChatSettingManagementModule.cs index 5edfa835a..a7e549ccd 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.SettingManagement/LINGYUN/Abp/WeChat/SettingManagement/AbpWeChatSettingManagementModule.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.SettingManagement/LINGYUN/Abp/WeChat/SettingManagement/AbpWeChatSettingManagementModule.cs @@ -2,6 +2,7 @@ using LINGYUN.Abp.WeChat.MiniProgram; using LINGYUN.Abp.WeChat.Official; using LINGYUN.Abp.WeChat.Work; +using LINGYUN.Abp.WeChat.Work.Contacts; using LINGYUN.Abp.WeChat.Work.Localization; using Localization.Resources.AbpUi; using Microsoft.Extensions.DependencyInjection; @@ -16,6 +17,7 @@ namespace LINGYUN.Abp.WeChat.SettingManagement; typeof(AbpWeChatOfficialModule), typeof(AbpWeChatMiniProgramModule), typeof(AbpWeChatWorkModule), + typeof(AbpWeChatWorkContactModule), typeof(AbpAspNetCoreMvcModule))] public class AbpWeChatSettingManagementModule : AbpModule { diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.SettingManagement/LINGYUN/Abp/WeChat/SettingManagement/WeChatSettingAppService.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.SettingManagement/LINGYUN/Abp/WeChat/SettingManagement/WeChatSettingAppService.cs index f157733d6..9721f5436 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.SettingManagement/LINGYUN/Abp/WeChat/SettingManagement/WeChatSettingAppService.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.SettingManagement/LINGYUN/Abp/WeChat/SettingManagement/WeChatSettingAppService.cs @@ -5,6 +5,8 @@ using LINGYUN.Abp.WeChat.MiniProgram.Settings; using LINGYUN.Abp.WeChat.Official.Features; using LINGYUN.Abp.WeChat.Official.Settings; using LINGYUN.Abp.WeChat.Settings; +using LINGYUN.Abp.WeChat.Work.Contacts.Features; +using LINGYUN.Abp.WeChat.Work.Contacts.Settings; using LINGYUN.Abp.WeChat.Work.Features; using LINGYUN.Abp.WeChat.Work.Settings; using System.Threading.Tasks; @@ -173,6 +175,17 @@ public class WeChatSettingAppService : ApplicationService, IWeChatSettingAppServ await SettingManager.GetOrNullAsync(WeChatWorkSettingNames.Connection.Secret, providerName, providerKey), ValueType.String, providerName); + + if (await FeatureChecker.IsEnabledAsync(WeChatWorkContactsFeatureNames.Enable)) + { + workConnectionSetting.AddDetail( + await SettingDefinitionManager.GetAsync(WeChatWorkContactSettingNames.Secret), + StringLocalizerFactory, + await SettingManager.GetOrNullAsync(WeChatWorkContactSettingNames.Secret, providerName, providerKey), + ValueType.String, + providerName); + } + workConnectionSetting.AddDetail( await SettingDefinitionManager.GetAsync(WeChatWorkSettingNames.Connection.Token), StringLocalizerFactory, diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN.Abp.WeChat.Work.Common.csproj b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN.Abp.WeChat.Work.Common.csproj index 44a9562dc..992ac8080 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN.Abp.WeChat.Work.Common.csproj +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN.Abp.WeChat.Work.Common.csproj @@ -1,4 +1,4 @@ - + diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/AbpWeChatWorkCommonModule.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/AbpWeChatWorkCommonModule.cs index 5fa41c334..32ee58512 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/AbpWeChatWorkCommonModule.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/AbpWeChatWorkCommonModule.cs @@ -27,7 +27,6 @@ public class AbpWeChatWorkCommonModule : AbpModule options.MapEvent("enter_agent", context => context.GetWeChatMessage()); options.MapEvent("LOCATION", context => context.GetWeChatMessage()); options.MapEvent("location_select", context => context.GetWeChatMessage()); - options.MapEvent("batch_job_result", context => context.GetWeChatMessage()); options.MapEvent("open_approval_change", context => context.GetWeChatMessage()); options.MapEvent("sys_approval_change", context => context.GetWeChatMessage()); options.MapEvent("share_agent_change", context => context.GetWeChatMessage()); @@ -36,29 +35,6 @@ public class AbpWeChatWorkCommonModule : AbpModule options.MapEvent("template_card_menu_event", context => context.GetWeChatMessage()); options.MapEvent("close_inactive_agent", context => context.GetWeChatMessage()); options.MapEvent("reopen_inactive_agent", context => context.GetWeChatMessage()); - options.MapEvent("change_contact", context => - { - //static UserChangeEvent CreateUserChangeEvent(string originXml) where TEvent : UserChangeEvent - //{ - // var events = new XmlDeserializationEvents(); - // return originXml.DeserializeWeChatMessage(events); - //} - - var changeType = context.GetMessageData("ChangeType"); - return changeType switch - { - "create_user" => context.GetWeChatMessage(), - "update_user" => context.GetWeChatMessage(), - "delete_user" => context.GetWeChatMessage(), - "create_party" => context.GetWeChatMessage(), - "update_party" => context.GetWeChatMessage(), - "delete_party" => context.GetWeChatMessage(), - "update_tag" => context.GetWeChatMessage(), - _ => throw new AbpWeChatException($"Contact change event {changeType} is not mounted!"), - }; - }); - options.MapEvent("book_meeting_room", context => context.GetWeChatMessage()); - options.MapEvent("cancel_meeting_room", context => context.GetWeChatMessage()); options.MapMessage("text", context => context.GetWeChatMessage()); options.MapMessage("image", context => context.GetWeChatMessage()); diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalAttribute.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalAttribute.cs similarity index 91% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalAttribute.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalAttribute.cs index ef161f3c2..9c3ec674b 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalAttribute.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalAttribute.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.ExternalContact.Models; +namespace LINGYUN.Abp.WeChat.Work.Common.Members.Models; /// /// 成员对外属性 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalAttributeDeserializeFactory.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalAttributeDeserializeFactory.cs similarity index 96% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalAttributeDeserializeFactory.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalAttributeDeserializeFactory.cs index fb0975217..4bfef0522 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalAttributeDeserializeFactory.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalAttributeDeserializeFactory.cs @@ -2,7 +2,7 @@ using System; using System.Text.Json; -namespace LINGYUN.Abp.WeChat.Work.ExternalContact.Models; +namespace LINGYUN.Abp.WeChat.Work.Common.Members.Models; internal static class ExternalAttributeDeserializeFactory { /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalAttributeType.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalAttributeType.cs similarity index 88% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalAttributeType.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalAttributeType.cs index 8b003cf05..c52aae592 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalAttributeType.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalAttributeType.cs @@ -1,6 +1,6 @@ using System.ComponentModel; -namespace LINGYUN.Abp.WeChat.Work.ExternalContact.Models; +namespace LINGYUN.Abp.WeChat.Work.Common.Members.Models; /// /// 属性类型 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalMiniProgramAttribute.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalMiniProgramAttribute.cs similarity index 95% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalMiniProgramAttribute.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalMiniProgramAttribute.cs index 5935b1ebf..203b3cd9c 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalMiniProgramAttribute.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalMiniProgramAttribute.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.ExternalContact.Models; +namespace LINGYUN.Abp.WeChat.Work.Common.Members.Models; /// /// 小程序类型属性 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalProfile.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalProfile.cs similarity index 95% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalProfile.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalProfile.cs index 2b625199c..09771e8a1 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalProfile.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalProfile.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.ExternalContact.Models; +namespace LINGYUN.Abp.WeChat.Work.Common.Members.Models; /// /// 成员对外信息 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalTextAttribute.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalTextAttribute.cs similarity index 90% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalTextAttribute.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalTextAttribute.cs index b8f3f7d70..71f9ad287 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalTextAttribute.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalTextAttribute.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.ExternalContact.Models; +namespace LINGYUN.Abp.WeChat.Work.Common.Members.Models; /// /// 文本类型属性 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalWebAttribute.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalWebAttribute.cs similarity index 93% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalWebAttribute.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalWebAttribute.cs index e882697a2..b95b45d0d 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/ExternalWebAttribute.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/ExternalWebAttribute.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.ExternalContact.Models; +namespace LINGYUN.Abp.WeChat.Work.Common.Members.Models; /// /// 网页类型属性 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/Gender.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/Gender.cs new file mode 100644 index 000000000..21795603c --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/Gender.cs @@ -0,0 +1,25 @@ +using System.ComponentModel; + +namespace LINGYUN.Abp.WeChat.Work.Common.Members.Models; +/// +/// 性别 +/// +[Description("性别")] +public enum Gender +{ + /// + /// 未知 + /// + [Description("未知")] + None = 0, + /// + /// 男性 + /// + [Description("男性")] + Male = 1, + /// + /// 女性 + /// + [Description("女性")] + FeMale = 2, +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/MemberExtendAttribute.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/MemberExtendAttribute.cs similarity index 96% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/MemberExtendAttribute.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/MemberExtendAttribute.cs index e2e52d7e3..d76dbd70e 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/MemberExtendAttribute.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/MemberExtendAttribute.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Xml.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models; +namespace LINGYUN.Abp.WeChat.Work.Common.Members.Models; [XmlRoot("Item")] public class MemberExtendAttribute diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/WechatChannel.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/WechatChannel.cs similarity index 91% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/WechatChannel.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/WechatChannel.cs index 953c929fa..41d013c36 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/WechatChannel.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/WechatChannel.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.ExternalContact.Models; +namespace LINGYUN.Abp.WeChat.Work.Common.Members.Models; /// /// 视频号属性 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/WechatChannelStatus.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/WechatChannelStatus.cs similarity index 86% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/WechatChannelStatus.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/WechatChannelStatus.cs index 3d994e996..df8df00af 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Models/WechatChannelStatus.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Members/Models/WechatChannelStatus.cs @@ -1,6 +1,6 @@ using System.ComponentModel; -namespace LINGYUN.Abp.WeChat.Work.ExternalContact.Models; +namespace LINGYUN.Abp.WeChat.Work.Common.Members.Models; /// /// 视频号状态 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/Newtonsoft/Json/EnumToNumberStringConverter.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/Newtonsoft/Json/EnumToNumberStringConverter.cs new file mode 100644 index 000000000..316b4d887 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/Newtonsoft/Json/EnumToNumberStringConverter.cs @@ -0,0 +1,62 @@ +using System; + +namespace Newtonsoft.Json; + +#nullable enable +public class EnumToNumberStringConverter : JsonConverter where T : struct, Enum +{ + public override bool CanConvert(Type objectType) + { + return objectType == typeof(T?); + } + + public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return null; + } + + try + { + if (reader.TokenType == JsonToken.String) + { + var stringValue = reader.Value?.ToString(); + if (string.IsNullOrEmpty(stringValue)) + { + return null; + } + + if (int.TryParse(stringValue, out var intValue)) + { + return (T?)Enum.ToObject(typeof(T), intValue); + } + } + else if (reader.TokenType == JsonToken.Integer) + { + return (T?)Enum.ToObject(typeof(T), Convert.ToInt32(reader.Value)); + } + } + catch (Exception ex) + { + throw new JsonSerializationException($"Error converting value {reader.Value} to type '{objectType}'.", ex); + } + + throw new JsonSerializationException($"Unexpected token {reader.TokenType} when parsing enum."); + } + + public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) + { + if (value == null) + { + writer.WriteNull(); + } + else + { + var enumValue = (T)value; + writer.WriteValue(Convert.ToInt32(enumValue).ToString()); + } + } +} +#nullable disable + diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/Newtonsoft/Json/ExternalProfileNewtonsoftJsonConverter.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/Newtonsoft/Json/ExternalProfileNewtonsoftJsonConverter.cs similarity index 90% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/Newtonsoft/Json/ExternalProfileNewtonsoftJsonConverter.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/Newtonsoft/Json/ExternalProfileNewtonsoftJsonConverter.cs index e3521bde5..9e6f35e68 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/Newtonsoft/Json/ExternalProfileNewtonsoftJsonConverter.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/Newtonsoft/Json/ExternalProfileNewtonsoftJsonConverter.cs @@ -1,4 +1,5 @@ -using LINGYUN.Abp.WeChat.Work.ExternalContact.Models; + +using LINGYUN.Abp.WeChat.Work.Common.Members.Models; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; @@ -8,7 +9,7 @@ internal class ExternalProfileNewtonsoftJsonConverter : JsonConverter true; - public override void WriteJson(JsonWriter writer, ExternalProfile? value, JsonSerializer serializer) + public override void WriteJson(JsonWriter writer, ExternalProfile value, JsonSerializer serializer) { writer.WriteStartObject(); @@ -33,7 +34,7 @@ internal class ExternalProfileNewtonsoftJsonConverter : JsonConverter : JsonConverter where T : struct, Enum +{ + public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) + { + return null; + } + + if (reader.TokenType == JsonTokenType.String) + { + var stringValue = reader.GetString(); + if (string.IsNullOrEmpty(stringValue)) + { + return null; + } + if (int.TryParse(stringValue, out var intValue)) + { + return (T)Enum.ToObject(typeof(T), intValue); + } + } + else if (reader.TokenType == JsonTokenType.Number) + { + return (T)Enum.ToObject(typeof(T), reader.GetInt32()); + } + + throw new JsonException($"Unable to convert value to enum {typeof(T).Name}"); + } + + public override void Write(Utf8JsonWriter writer, T? value, JsonSerializerOptions options) + { + if (value == null) + { + writer.WriteNullValue(); + } + else + { + writer.WriteStringValue(Convert.ToInt32(value).ToString()); + } + } +} +#nullable disable diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Text/Json/Serialization/ExternalProfileSystemTextJsonConverter.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/System/Text/Json/Serialization/ExternalProfileSystemTextJsonConverter.cs similarity index 97% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Text/Json/Serialization/ExternalProfileSystemTextJsonConverter.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/System/Text/Json/Serialization/ExternalProfileSystemTextJsonConverter.cs index ec532e9f1..16a1aa2c1 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/System/Text/Json/Serialization/ExternalProfileSystemTextJsonConverter.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/System/Text/Json/Serialization/ExternalProfileSystemTextJsonConverter.cs @@ -1,4 +1,4 @@ -using LINGYUN.Abp.WeChat.Work.ExternalContact.Models; +using LINGYUN.Abp.WeChat.Work.Common.Members.Models; using System.Collections.Generic; namespace System.Text.Json.Serialization; diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/System/Text/Json/Serialization/IntToBoolJsonConverter.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/System/Text/Json/Serialization/IntToBoolJsonConverter.cs new file mode 100644 index 000000000..ced8f2a39 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/System/Text/Json/Serialization/IntToBoolJsonConverter.cs @@ -0,0 +1,26 @@ +namespace System.Text.Json.Serialization; + +public class IntToBoolJsonConverter : JsonConverter +{ + public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + switch (reader.TokenType) + { + case JsonTokenType.Number: + var intValue = reader.GetInt64(); + return intValue == 1; + case JsonTokenType.True: + return true; + case JsonTokenType.False: + return false; + } + + throw new JsonException($"Cannot convert {reader.TokenType} to bool."); + } + + public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options) + { + writer.WriteNumberValue(value ? 1 : 0); + } +} + diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/FodyWeavers.xml b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/FodyWeavers.xml new file mode 100644 index 000000000..1715698cc --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/FodyWeavers.xsd b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN.Abp.WeChat.Work.Contacts.csproj b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN.Abp.WeChat.Work.Contacts.csproj new file mode 100644 index 000000000..9c6642216 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN.Abp.WeChat.Work.Contacts.csproj @@ -0,0 +1,27 @@ + + + + + + + netstandard2.0;netstandard2.1;net8.0;net9.0 + LINGYUN.Abp.WeChat.Work.Contacts + LINGYUN.Abp.WeChat.Work.Contacts + false + false + false + True + enable + + + + + + + + + + + + + diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/AbpWeChatWorkContactModule.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/AbpWeChatWorkContactModule.cs new file mode 100644 index 000000000..34328f0bb --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/AbpWeChatWorkContactModule.cs @@ -0,0 +1,45 @@ +using LINGYUN.Abp.WeChat.Common; +using LINGYUN.Abp.WeChat.Common.Messages; +using LINGYUN.Abp.WeChat.Work.Common.Messages; +using LINGYUN.Abp.WeChat.Work.Contacts.Messages.Models; +using LINGYUN.Abp.WeChat.Work.Localization; +using Volo.Abp.Localization; +using Volo.Abp.Modularity; + +namespace LINGYUN.Abp.WeChat.Work.Contacts; +/// +/// 企业微信通讯录模块 +/// +[DependsOn(typeof(AbpWeChatWorkModule))] +public class AbpWeChatWorkContactModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.MapEvent("change_contact", context => + { + var changeType = context.GetMessageData("ChangeType"); + return changeType switch + { + "create_user" => context.GetWeChatMessage(), + "update_user" => context.GetWeChatMessage(), + "delete_user" => context.GetWeChatMessage(), + "create_party" => context.GetWeChatMessage(), + "update_party" => context.GetWeChatMessage(), + "delete_party" => context.GetWeChatMessage(), + "update_tag" => context.GetWeChatMessage(), + _ => throw new AbpWeChatException($"Contact change event {changeType} is not mounted!"), + }; + }); + options.MapEvent("batch_job_result", context => context.GetWeChatMessage()); + }); + + Configure(options => + { + options.Resources + .Get() + .AddVirtualJson("/LINGYUN/Abp/WeChat/Work/Contacts/Localization/Resources"); + }); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/IWeChatWorkDepartmentProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/IWeChatWorkDepartmentProvider.cs new file mode 100644 index 000000000..e0cedfd10 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/IWeChatWorkDepartmentProvider.cs @@ -0,0 +1,87 @@ +using LINGYUN.Abp.WeChat.Work.Contacts.Departments.Request; +using LINGYUN.Abp.WeChat.Work.Contacts.Departments.Response; +using System.Threading; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Departments; +/// +/// 企业微信部门管理接口 +/// +public interface IWeChatWorkDepartmentProvider +{ + /// + /// 获取部门列表 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task GetDepartmentListAsync( + WeChatWorkGetDepartmentListRequest request, + CancellationToken cancellationToken = default); + /// + /// 获取子部门ID列表 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task GetSubDepartmentListAsync( + WeChatWorkGetSubDepartmentListRequest request, + CancellationToken cancellationToken = default); + /// + /// 获取单个部门详情 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task GetDepartmentAsync( + WeChatWorkGetDepartmentRequest request, + CancellationToken cancellationToken = default); + /// + /// 创建部门 + /// + /// + /// 此接口使用通讯录应用Token
+ /// 详情见: + ///
+ /// 请求参数 + /// + /// + Task CreateDepartmentAsync( + WeChatWorkCreateDepartmentRequest request, + CancellationToken cancellationToken = default); + /// + /// 更新部门 + /// + /// + /// 此接口使用通讯录应用Token
+ /// 详情见: + ///
+ /// 请求参数 + /// + /// + Task UpdateDepartmentAsync( + WeChatWorkUpdateDepartmentRequest request, + CancellationToken cancellationToken = default); + /// + /// 删除部门 + /// + /// + /// 此接口使用通讯录应用Token
+ /// 详情见: + ///
+ /// 请求参数 + /// + /// + Task DeleteDepartmentAsync( + WeChatWorkDeleteDepartmentRequest request, + CancellationToken cancellationToken = default); +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Models/Department.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Models/Department.cs new file mode 100644 index 000000000..fa099ff1a --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Models/Department.cs @@ -0,0 +1,25 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Departments.Models; +/// +/// 部门 +/// +public class Department +{ + /// + /// 部门名称 + /// + [NotNull] + [JsonProperty("name")] + [JsonPropertyName("name")] + public string Name { get; set; } + /// + /// 部门id + /// + [NotNull] + [JsonProperty("id")] + [JsonPropertyName("id")] + public string Id { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Models/DepartmentInfo.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Models/DepartmentInfo.cs new file mode 100644 index 000000000..75004d468 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Models/DepartmentInfo.cs @@ -0,0 +1,39 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Departments.Models; +/// +/// 部门详情 +/// +public class DepartmentInfo : Department +{ + /// + /// 部门英文名称 + /// + [CanBeNull] + [JsonProperty("name_en")] + [JsonPropertyName("name_en")] + public string? NameEn { get; set; } + /// + /// 部门负责人的UserID,返回在应用可见范围内的部门负责人列表 + /// + [NotNull] + [JsonProperty("department_leader")] + [JsonPropertyName("department_leader")] + public string[] DepartmentLeader { get; set; } + /// + /// 父部门id。根部门为1 + /// + [NotNull] + [JsonProperty("parentid")] + [JsonPropertyName("parentid")] + public int ParentId { get; set; } + /// + /// 在父部门中的次序值。order值大的排序靠前。值范围是[0, 2^32) + /// + [NotNull] + [JsonProperty("order")] + [JsonPropertyName("order")] + public int Order { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Models/SubDepartment.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Models/SubDepartment.cs new file mode 100644 index 000000000..ae9733f20 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Models/SubDepartment.cs @@ -0,0 +1,32 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Departments.Models; +/// +/// 子部门 +/// +public class SubDepartment +{ + /// + /// 部门id + /// + [NotNull] + [JsonProperty("id")] + [JsonPropertyName("id")] + public string Id { get; set; } + /// + /// 父部门id。根部门为1。 + /// + [NotNull] + [JsonProperty("parentid")] + [JsonPropertyName("parentid")] + public int ParentId { get; set; } + /// + /// 在父部门中的次序值。order值大的排序靠前。值范围是[0, 2^32)。 + /// + [NotNull] + [JsonProperty("order")] + [JsonPropertyName("order")] + public int Order { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkCreateDepartmentRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkCreateDepartmentRequest.cs new file mode 100644 index 000000000..918e4fe5c --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkCreateDepartmentRequest.cs @@ -0,0 +1,68 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; +using System.Xml.Linq; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Departments.Request; +/// +/// 创建部门请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkCreateDepartmentRequest : WeChatWorkRequest +{ + /// + /// 部门名称。同一个层级的部门名称不能重复。长度限制为1~64个UTF-8字符 + /// + [NotNull] + [JsonProperty("name")] + [JsonPropertyName("name")] + public string Name { get; } + /// + /// 英文名称。同一个层级的部门名称不能重复。需要在管理后台开启多语言支持才能生效。长度限制为1~64个字符 + /// + [CanBeNull] + [JsonProperty("name_en")] + [JsonPropertyName("name_en")] + public string? NameEn { get; set; } + /// + /// 父部门id,32位整型 + /// + [NotNull] + [JsonProperty("parentid")] + [JsonPropertyName("parentid")] + public int ParentId { get; } + /// + /// 在父部门中的次序值。order值大的排序靠前。有效的值范围是[0, 2^32) + /// + [CanBeNull] + [JsonProperty("order")] + [JsonPropertyName("order")] + public int? Order { get; set; } + /// + /// 部门id,32位整型,指定时必须大于1。若不填该参数,将自动生成id + /// + [CanBeNull] + [JsonProperty("id")] + [JsonPropertyName("id")] + public int? Id { get; set; } + public WeChatWorkCreateDepartmentRequest(string name, int parentId = 0, string? nameEn = null, int? order = null, int? id = null) + { + Check.NotNullOrWhiteSpace(name, nameof(name), 64, 1); + Check.Length(nameEn, nameof(nameEn), 64, 1); + + Name = name; + NameEn = nameEn; + ParentId = parentId; + Order = order; + Id = id; + } + + protected override void Validate() + { + Check.NotNullOrWhiteSpace(Name, nameof(Name), 64, 1); + Check.Length(NameEn, nameof(NameEn), 64, 1); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkDeleteDepartmentRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkDeleteDepartmentRequest.cs new file mode 100644 index 000000000..a95f7ef64 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkDeleteDepartmentRequest.cs @@ -0,0 +1,25 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Departments.Request; +/// +/// 删除部门请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkDeleteDepartmentRequest : WeChatWorkRequest +{ + /// + /// 部门id + /// + [NotNull] + [JsonProperty("id")] + [JsonPropertyName("id")] + public int Id { get; } + public WeChatWorkDeleteDepartmentRequest(int id) + { + Id = id; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkGetDepartmentListRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkGetDepartmentListRequest.cs new file mode 100644 index 000000000..3e4a87030 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkGetDepartmentListRequest.cs @@ -0,0 +1,25 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Departments.Request; +/// +/// 获取部门列表请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetDepartmentListRequest : WeChatWorkRequest +{ + /// + /// 部门id。获取指定部门及其下的子部门(以及子部门的子部门等等,递归)。 如果不填,默认获取全量组织架构 + /// + [CanBeNull] + [JsonProperty("id")] + [JsonPropertyName("id")] + public int? Id { get; } + public WeChatWorkGetDepartmentListRequest(int? id = null) + { + Id = id; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkGetDepartmentRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkGetDepartmentRequest.cs new file mode 100644 index 000000000..6cea8d6da --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkGetDepartmentRequest.cs @@ -0,0 +1,25 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Departments.Request; +/// +/// 获取单个部门详情请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetDepartmentRequest : WeChatWorkRequest +{ + /// + /// 部门id + /// + [NotNull] + [JsonProperty("id")] + [JsonPropertyName("id")] + public int Id { get; } + public WeChatWorkGetDepartmentRequest(int id) + { + Id = id; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkGetSubDepartmentListRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkGetSubDepartmentListRequest.cs new file mode 100644 index 000000000..2db319a35 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkGetSubDepartmentListRequest.cs @@ -0,0 +1,25 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Departments.Request; +/// +/// 获取子部门ID列表请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetSubDepartmentListRequest : WeChatWorkRequest +{ + /// + /// 部门id。获取指定部门及其下的子部门(以及子部门的子部门等等,递归)。 如果不填,默认获取全量组织架构 + /// + [CanBeNull] + [JsonProperty("id")] + [JsonPropertyName("id")] + public int? Id { get; } + public WeChatWorkGetSubDepartmentListRequest(int? id = null) + { + Id = id; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkUpdateDepartmentRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkUpdateDepartmentRequest.cs new file mode 100644 index 000000000..01a0c18ea --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Request/WeChatWorkUpdateDepartmentRequest.cs @@ -0,0 +1,60 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Departments.Request; +/// +/// 更新部门请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkUpdateDepartmentRequest : WeChatWorkRequest +{ + /// + /// 部门id + /// + [NotNull] + [JsonProperty("id")] + [JsonPropertyName("id")] + public int Id { get; } + /// + /// 部门名称。长度限制为1~64个UTF-8字符 + /// + [CanBeNull] + [JsonProperty("name")] + [JsonPropertyName("name")] + public string? Name { get; set; } + /// + /// 英文名称,需要在管理后台开启多语言支持才能生效。长度限制为1~64个字符 + /// + [CanBeNull] + [JsonProperty("name_en")] + [JsonPropertyName("name_en")] + public string? NameEn { get; set; } + /// + /// 父部门id + /// + [CanBeNull] + [JsonProperty("parentid")] + [JsonPropertyName("parentid")] + public int? ParentId { get; set; } + /// + /// 在父部门中的次序值。order值大的排序靠前。有效的值范围是[0, 2^32) + /// + [CanBeNull] + [JsonProperty("order")] + [JsonPropertyName("order")] + public int? Order { get; set; } + public WeChatWorkUpdateDepartmentRequest(int id) + { + Id = id; + } + + protected override void Validate() + { + Check.NotNullOrWhiteSpace(Name, nameof(Name), 64, 1); + Check.Length(NameEn, nameof(NameEn), 64, 1); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Response/WeChatWorkCreateDepartmentResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Response/WeChatWorkCreateDepartmentResponse.cs new file mode 100644 index 000000000..1c67cee3d --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Response/WeChatWorkCreateDepartmentResponse.cs @@ -0,0 +1,21 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Departments.Response; +/// +/// 创建部门响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkCreateDepartmentResponse : WeChatWorkResponse +{ + /// + /// 创建的部门id + /// + [NotNull] + [JsonProperty("id")] + [JsonPropertyName("id")] + public int Id { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Response/WeChatWorkGetDepartmentListResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Response/WeChatWorkGetDepartmentListResponse.cs new file mode 100644 index 000000000..35f76c5ff --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Response/WeChatWorkGetDepartmentListResponse.cs @@ -0,0 +1,22 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.Contacts.Departments.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Departments.Response; +/// +/// 获取部门列表响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetDepartmentListResponse : WeChatWorkResponse +{ + /// + /// 部门列表数据 + /// + [NotNull] + [JsonProperty("department")] + [JsonPropertyName("department")] + public DepartmentInfo[] Department { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Response/WeChatWorkGetDepartmentResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Response/WeChatWorkGetDepartmentResponse.cs new file mode 100644 index 000000000..536c91f78 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Response/WeChatWorkGetDepartmentResponse.cs @@ -0,0 +1,22 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.Contacts.Departments.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Departments.Response; +/// +/// 获取单个部门详情响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetDepartmentResponse : WeChatWorkResponse +{ + /// + /// 部门详情 + /// + [NotNull] + [JsonProperty("department")] + [JsonPropertyName("department")] + public DepartmentInfo Department { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Response/WeChatWorkGetSubDepartmentListResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Response/WeChatWorkGetSubDepartmentListResponse.cs new file mode 100644 index 000000000..0335e87e9 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/Response/WeChatWorkGetSubDepartmentListResponse.cs @@ -0,0 +1,22 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.Contacts.Departments.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Departments.Response; +/// +/// 获取子部门ID列表响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetSubDepartmentListResponse : WeChatWorkResponse +{ + /// + /// 部门列表数据。 + /// + [NotNull] + [JsonProperty("department_id")] + [JsonPropertyName("department_id")] + public SubDepartment[] Department { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/WeChatWorkDepartmentProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/WeChatWorkDepartmentProvider.cs new file mode 100644 index 000000000..1dc83a557 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Departments/WeChatWorkDepartmentProvider.cs @@ -0,0 +1,108 @@ +using LINGYUN.Abp.WeChat.Work.Contacts.Departments.Request; +using LINGYUN.Abp.WeChat.Work.Contacts.Departments.Response; +using LINGYUN.Abp.WeChat.Work.Contacts.Features; +using LINGYUN.Abp.WeChat.Work.Contacts.Token; +using LINGYUN.Abp.WeChat.Work.Token; +using Microsoft.Extensions.DependencyInjection; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Features; +using Volo.Abp.Json; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Departments; + +[RequiresFeature(WeChatWorkContactsFeatureNames.Enable)] +public class WeChatWorkDepartmentProvider : IWeChatWorkDepartmentProvider, ISingletonDependency +{ + protected IJsonSerializer JsonSerializer { get; } + protected IHttpClientFactory HttpClientFactory { get; } + protected IWeChatWorkTokenProvider WeChatWorkTokenProvider { get; } + protected IWeChatWorkContactTokenProvider WeChatWorkContactTokenProvider { get; } + + public WeChatWorkDepartmentProvider( + IJsonSerializer jsonSerializer, + IHttpClientFactory httpClientFactory, + IWeChatWorkTokenProvider weChatWorkTokenProvider, + IWeChatWorkContactTokenProvider weChatWorkContactTokenProvider) + { + JsonSerializer = jsonSerializer; + HttpClientFactory = httpClientFactory; + WeChatWorkTokenProvider = weChatWorkTokenProvider; + WeChatWorkContactTokenProvider = weChatWorkContactTokenProvider; + } + + public async virtual Task GetDepartmentListAsync( + WeChatWorkGetDepartmentListRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.GetDepartmentListAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task GetSubDepartmentListAsync( + WeChatWorkGetSubDepartmentListRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.GetSubDepartmentListAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task GetDepartmentAsync( + WeChatWorkGetDepartmentRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.GetDepartmentAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task CreateDepartmentAsync( + WeChatWorkCreateDepartmentRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkContactTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.CreateDepartmentAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task UpdateDepartmentAsync( + WeChatWorkUpdateDepartmentRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkContactTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.UpdateDepartmentAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task DeleteDepartmentAsync( + WeChatWorkDeleteDepartmentRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkContactTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.DeleteDepartmentAsync(token.AccessToken, request, cancellationToken); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Features/WeChatWorkContactsFeatureDefinitionProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Features/WeChatWorkContactsFeatureDefinitionProvider.cs new file mode 100644 index 000000000..486b5ad2f --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Features/WeChatWorkContactsFeatureDefinitionProvider.cs @@ -0,0 +1,31 @@ +using LINGYUN.Abp.WeChat.Work.Features; +using LINGYUN.Abp.WeChat.Work.Localization; +using Volo.Abp.Features; +using Volo.Abp.Localization; +using Volo.Abp.Validation.StringValues; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Features; +public class WeChatWorkContactsFeatureDefinitionProvider : FeatureDefinitionProvider +{ + public override void Define(IFeatureDefinitionContext context) + { + var weChatFeature = context.GetGroupOrNull(WeChatWorkFeatureNames.GroupName); + if (weChatFeature == null) + { + return; + } + + var group = weChatFeature.AddFeature(WeChatWorkContactsFeatureNames.GroupName); + group.CreateChild( + WeChatWorkContactsFeatureNames.Enable, + defaultValue: "false", + displayName: L("Features:ContactsEnable"), + description: L("Features:ContactsEnableDesc"), + valueType: new ToggleStringValueType(new BooleanValueValidator())); + } + + private static LocalizableString L(string name) + { + return LocalizableString.Create(name); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Features/WeChatWorkContactsFeatureNames.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Features/WeChatWorkContactsFeatureNames.cs new file mode 100644 index 000000000..842c19a2a --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Features/WeChatWorkContactsFeatureNames.cs @@ -0,0 +1,14 @@ +using LINGYUN.Abp.WeChat.Work.Features; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Features; +/// +/// 企业微信通讯录模块功能 +/// +public static class WeChatWorkContactsFeatureNames +{ + public const string GroupName = WeChatWorkFeatureNames.GroupName + ".Contacts"; + /// + /// 启用企业微信通讯录 + /// + public const string Enable = GroupName + ".Enable"; +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Localization/Resources/en.json b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Localization/Resources/en.json new file mode 100644 index 000000000..235a59009 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Localization/Resources/en.json @@ -0,0 +1,9 @@ +{ + "culture": "en", + "texts": { + "Features:ContactsEnable": "Enable Contacts", + "Features:ContactsEnableDesc": "Enable the ability to provide the application with an Enterprise wechat contacts interface.", + "DisplayName:WeChatWorkContact.Secret": "Contact Secret", + "Description:WeChatWorkContact.Secret": "Secretfor the address contact application. Some contact interfaces require a contact synchronization secret." + } +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Localization/Resources/zh-Hans.json b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Localization/Resources/zh-Hans.json new file mode 100644 index 000000000..175ddfca2 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Localization/Resources/zh-Hans.json @@ -0,0 +1,9 @@ +{ + "culture": "zh-Hans", + "texts": { + "Features:ContactsEnable": "启用通讯录", + "Features:ContactsEnableDesc": "启用以使应用拥有企业微信通讯录接口的能力.", + "DisplayName:WeChatWorkContact.Secret": "通讯录访问密钥", + "Description:WeChatWorkContact.Secret": "通讯录应用访问密钥,部分通讯录接口需要通讯录同步secret." + } +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/IWeChatWorkMemberProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/IWeChatWorkMemberProvider.cs new file mode 100644 index 000000000..0840db94a --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/IWeChatWorkMemberProvider.cs @@ -0,0 +1,199 @@ +using LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +using LINGYUN.Abp.WeChat.Work.Contacts.Members.Request; +using LINGYUN.Abp.WeChat.Work.Contacts.Members.Response; +using System.Threading; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members; +/// +/// 企业微信成员管理接口 +/// +public interface IWeChatWorkMemberProvider +{ + /// + /// 读取成员 + /// + /// + /// 详情见: + /// + /// 成员UserID。对应管理端的账号,企业内必须唯一。不区分大小写,长度为1~64个字节 + /// + /// + Task GetMemberAsync( + string userId, + CancellationToken cancellationToken = default); + /// + /// 创建成员 + /// + /// + /// 此接口使用通讯录应用Token
+ /// 详情见: + ///
+ /// 请求参数 + /// + /// + Task CreateMemberAsync( + WeChatWorkCreateMemberRequest request, + CancellationToken cancellationToken = default); + /// + /// 更新成员 + /// + /// + /// 此接口使用通讯录应用Token
+ /// 详情见: + ///
+ /// 请求参数 + /// + /// + Task UpdateMemberAsync( + WeChatWorkUpdateMemberRequest request, + CancellationToken cancellationToken = default); + /// + /// 删除成员 + /// + /// + /// 此接口使用通讯录应用Token
+ /// 详情见: + ///
+ /// 成员UserID。对应管理端的账号 + /// + /// + Task DeleteMemberAsync( + string userId, + CancellationToken cancellationToken = default); + /// + /// 批量删除成员 + /// + /// + /// 此接口使用通讯录应用Token
+ /// 详情见: + ///
+ /// 请求参数 + /// + /// + Task BulkDeleteMemberAsync( + WeChatWorkBulkDeleteMemberRequest request, + CancellationToken cancellationToken = default); + /// + /// 获取部门成员 + /// + /// + /// 详情见: + /// + /// 获取的部门id + /// + /// + Task GetSimpleMemberListAsync( + int departmentId, + CancellationToken cancellationToken = default); + /// + /// 获取部门成员详情 + /// + /// + /// 详情见: + /// + /// 获取的部门id + /// + /// + Task GetMemberListAsync( + int departmentId, + CancellationToken cancellationToken = default); + /// + /// userid转openid + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task ConvertToOpenIdAsync( + WeChatWorkConvertToOpenIdRequest request, + CancellationToken cancellationToken = default); + /// + /// openid转userid + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task ConvertToUserIdAsync( + WeChatWorkConvertToUserIdRequest request, + CancellationToken cancellationToken = default); + /// + /// 登录二次验证 + /// + /// + /// 详情见: + /// + /// 成员UserID。对应管理端的账号 + /// + /// + Task AuthSuccessAsync( + string userId, + CancellationToken cancellationToken = default); + /// + /// 邀请成员 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task BulkInviteMemberAsync( + WeChatWorkBulkInviteMemberRequest request, + CancellationToken cancellationToken = default); + /// + /// 获取加入企业二维码 + /// + /// + /// 此接口使用通讯录应用Token
+ /// 详情见: + ///
+ /// 二维码尺寸类型 + /// + /// + Task GetJoinQrCodeAsync( + QrCodeSizeType sizeType, + CancellationToken cancellationToken = default); + /// + /// 手机号获取userid + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task GetUserIdByMobileAsync( + WeChatWorkGetUserIdByMobileRequest request, + CancellationToken cancellationToken = default); + /// + /// 邮箱获取userid + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task GetUserIdByEmailAsync( + WeChatWorkGetUserIdByEmailRequest request, + CancellationToken cancellationToken = default); + /// + /// 获取成员ID列表 + /// + /// + /// 此接口使用通讯录应用Token
+ /// 详情见: + ///
+ /// 请求参数 + /// + /// + Task GetUserIdListAsync( + WeChatWorkGetUserIdListRequest request, + CancellationToken cancellationToken = default); +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/AttributeType.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/AttributeType.cs new file mode 100644 index 000000000..a49a96cc9 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/AttributeType.cs @@ -0,0 +1,20 @@ +using System.ComponentModel; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +/// +/// 属性类型 +/// +[Description("属性类型")] +public enum AttributeType +{ + /// + /// 文本 + /// + [Description("文本")] + Text = 0, + /// + /// 网页 + /// + [Description("网页")] + Web = 1 +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/DepartmentMember.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/DepartmentMember.cs new file mode 100644 index 000000000..2297ab335 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/DepartmentMember.cs @@ -0,0 +1,39 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +/// +/// 部门成员 +/// +public class DepartmentMember +{ + /// + /// 成员UserID。对应管理端的账号 + /// + [NotNull] + [JsonProperty("userid")] + [JsonPropertyName("userid")] + public string UserId { get; set; } + /// + /// 成员名称,代开发自建应用需要管理员授权才返回 + /// + [NotNull] + [JsonProperty("name")] + [JsonPropertyName("name")] + public string Name { get; set; } + /// + /// 成员所属部门列表。列表项为部门ID,32位整型 + /// + [CanBeNull] + [JsonProperty("department")] + [JsonPropertyName("department")] + public int[]? Department { get; set; } + /// + /// 全局唯一 + /// + [NotNull] + [JsonProperty("open_userid")] + [JsonPropertyName("open_userid")] + public string OpenUserId { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/DepartmentUser.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/DepartmentUser.cs new file mode 100644 index 000000000..9b1116a08 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/DepartmentUser.cs @@ -0,0 +1,25 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +/// +/// 用户-部门关系 +/// +public class DepartmentUser +{ + /// + /// 用户userid,当用户在多个部门下时会有多条记录 + /// + [NotNull] + [JsonProperty("userid")] + [JsonPropertyName("userid")] + public string UserId { get; set; } + /// + /// 用户所属部门 + /// + [NotNull] + [JsonProperty("department")] + [JsonPropertyName("department")] + public int Department { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/EmailType.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/EmailType.cs new file mode 100644 index 000000000..4821ebda9 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/EmailType.cs @@ -0,0 +1,20 @@ +using System.ComponentModel; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +/// +/// 邮箱类型 +/// +[Description("邮箱类型")] +public enum EmailType +{ + /// + /// 企业邮箱 + /// + [Description("企业邮箱")] + BizEmail = 1, + /// + /// 个人邮箱 + /// + [Description("个人邮箱")] + PersonEmail = 2, +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberAttribute.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberAttribute.cs new file mode 100644 index 000000000..ee687ba42 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberAttribute.cs @@ -0,0 +1,25 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +/// +/// 成员扩展属性 +/// +public abstract class MemberAttribute +{ + /// + /// 属性名称: 在新增或者更新操作时,需要先确保在管理端有创建该属性,否则会忽略 + /// + [NotNull] + [JsonProperty("name")] + [JsonPropertyName("name")] + public string Name { get; set; } + /// + /// 属性类型 + /// + [NotNull] + [JsonProperty("type")] + [JsonPropertyName("type")] + public AttributeType Type { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberAttributeDeserializeFactory.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberAttributeDeserializeFactory.cs new file mode 100644 index 000000000..204521e59 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberAttributeDeserializeFactory.cs @@ -0,0 +1,33 @@ +using Newtonsoft.Json.Linq; +using System; +using System.Text.Json; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +internal static class MemberAttributeDeserializeFactory +{ + /// + /// 根据属性类型创建属性(System.Text.Json) + /// + public static MemberAttribute CreateExternalAttribute(AttributeType type, JsonElement configElement) + { + return type switch + { + AttributeType.Text => JsonSerializer.Deserialize(configElement.GetRawText())!, + AttributeType.Web => JsonSerializer.Deserialize(configElement.GetRawText())!, + _ => throw new NotSupportedException($"Attribute type {type} is not supported for the time being"), + }; + } + + /// + /// 根据属性类型创建属性(Newtonsoft.Json) + /// + public static MemberAttribute CreateExternalAttribute(AttributeType type, JToken configToken) + { + return type switch + { + AttributeType.Text => configToken.ToObject()!, + AttributeType.Web => configToken.ToObject()!, + _ => throw new NotSupportedException($"Attribute type {type} is not supported for the time being"), + }; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberExternalAttribute.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberExternalAttribute.cs new file mode 100644 index 000000000..d3c0f103b --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberExternalAttribute.cs @@ -0,0 +1,18 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +/// +/// 成员扩展属性 +/// +public class MemberExternalAttribute +{ + /// + /// 扩展属性列表 + /// + [NotNull] + [JsonProperty("attrs")] + [JsonPropertyName("attrs")] + public MemberAttribute[] Attributes { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberInfo.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberInfo.cs new file mode 100644 index 000000000..17ebe2f97 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberInfo.cs @@ -0,0 +1,173 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.Common.Members.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +/// +/// 成员详情 +/// +public class MemberInfo +{ + /// + /// 全局唯一 + /// + [NotNull] + [JsonProperty("open_userid")] + [JsonPropertyName("open_userid")] + public string OpenUserId { get; set; } + /// + /// 成员UserID + /// + [NotNull] + [JsonProperty("userid")] + [JsonPropertyName("userid")] + public string UserId { get; set; } + /// + /// 成员名称 + /// + [NotNull] + [JsonProperty("name")] + [JsonPropertyName("name")] + public string Name { get; set; } + /// + /// 手机号码 + /// + [CanBeNull] + [JsonProperty("mobile")] + [JsonPropertyName("mobile")] + public string? Mobile { get; set; } + /// + /// 成员所属部门id列表 + /// + [NotNull] + [JsonProperty("department")] + [JsonPropertyName("department")] + public int[] Department { get; set; } + /// + /// 主部门 + /// + [CanBeNull] + [JsonProperty("main_department")] + [JsonPropertyName("main_department")] + public int? MainDepartment { get; set; } + /// + /// 部门内的排序值,默认为0。数量必须和department一致,数值越大排序越前面。值范围是[0, 2^32) + /// + [NotNull] + [JsonProperty("order")] + [JsonPropertyName("order")] + public int[]? Order { get; set; } + /// + /// 员工个人二维码 + /// + [CanBeNull] + [JsonProperty("qr_code")] + [JsonPropertyName("qr_code")] + public string? QrCode { get; set; } + /// + /// 职务信息 + /// + [CanBeNull] + [JsonProperty("position")] + [JsonPropertyName("position")] + public string? Position { get; set; } + /// + /// 性别 + /// + [CanBeNull] + [JsonProperty("gender")] + [JsonPropertyName("gender")] + public Gender? Gender { get; set; } + /// + /// 邮箱 + /// + [CanBeNull] + [JsonProperty("email")] + [JsonPropertyName("email")] + public string? Email { get; set; } + /// + /// 企业邮箱 + /// + [CanBeNull] + [JsonProperty("biz_mail")] + [JsonPropertyName("biz_mail")] + public string? BizEmail { get; set; } + /// + /// 表示在所在的部门内是否为部门负责人,数量与department一致 + /// + [CanBeNull] + [JsonProperty("is_leader_in_dept")] + [JsonPropertyName("is_leader_in_dept")] + public int[]? IsLeaderInDept { get; set; } + /// + /// 直属上级UserID,返回在应用可见范围内的直属上级列表,最多有1个直属上级 + /// + [CanBeNull] + [JsonProperty("direct_leader")] + [JsonPropertyName("direct_leader")] + public string[]? DirectLeader { get; set; } + /// + /// 头像url + /// + [CanBeNull] + [JsonProperty("avatar")] + [JsonPropertyName("avatar")] + public string? Avatar { get; set; } + /// + /// 头像缩略图url + /// + [CanBeNull] + [JsonProperty("thumb_avatar")] + [JsonPropertyName("thumb_avatar")] + public string? ThumbAvatar { get; set; } + /// + /// 座机 + /// + [CanBeNull] + [JsonProperty("telephone")] + [JsonPropertyName("telephone")] + public string? TelePhone { get; set; } + /// + /// 别名 + /// + [CanBeNull] + [JsonProperty("alias")] + [JsonPropertyName("alias")] + public string? Alias { get; set; } + /// + /// 地址 + /// + [CanBeNull] + [JsonProperty("address")] + [JsonPropertyName("address")] + public string? Address { get; set; } + /// + /// 激活状态 + /// + [NotNull] + [JsonProperty("status")] + [JsonPropertyName("status")] + public MemberStatus Status { get; set; } + /// + /// 扩展属性 + /// + [CanBeNull] + [JsonProperty("extattr")] + [JsonPropertyName("extattr")] + public MemberExternalAttribute? ExternalAttribute { get; set; } + /// + /// 对外职务,如果设置了该值,则以此作为对外展示的职务,否则以position来展示。 + /// + [CanBeNull] + [JsonProperty("external_position")] + [JsonPropertyName("external_position")] + public string? ExternalPosition { get; set; } + /// + /// 外部联系人的自定义展示信息 + /// + [CanBeNull] + [JsonProperty("external_profile")] + [JsonPropertyName("external_profile")] + public ExternalProfile? ExternalProfile { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberStatus.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberStatus.cs new file mode 100644 index 000000000..604a11760 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberStatus.cs @@ -0,0 +1,30 @@ +using System.ComponentModel; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +/// +/// 激活状态 +/// +[Description("激活状态")] +public enum MemberStatus +{ + /// + /// 已激活 + /// + [Description("已激活")] + Activated = 1, + /// + /// 已禁用 + /// + [Description("已禁用")] + Disabled = 2, + /// + /// 未激活 + /// + [Description("未激活")] + NotActivated = 4, + /// + /// 退出企业 + /// + [Description("退出企业")] + Exited = 5, +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberTextAttribute.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberTextAttribute.cs new file mode 100644 index 000000000..a8c10b40b --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberTextAttribute.cs @@ -0,0 +1,29 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +/// +/// 文本类型的成员属性 +/// +public class MemberTextAttribute : MemberAttribute +{ + /// + /// 文本 + /// + [NotNull] + [JsonProperty("text")] + [JsonPropertyName("text")] + public MemberTextModel Text { get; set; } +} + +public class MemberTextModel +{ + /// + /// 文本 + /// + [NotNull] + [JsonProperty("value")] + [JsonPropertyName("value")] + public string Value { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberWebAttribute.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberWebAttribute.cs new file mode 100644 index 000000000..e1c0b0279 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/MemberWebAttribute.cs @@ -0,0 +1,36 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +/// +/// 网页类型的成员属性 +/// +public class MemberWebAttribute : MemberAttribute +{ + /// + /// 网页 + /// + [NotNull] + [JsonProperty("web")] + [JsonPropertyName("web")] + public MemberWebModel Web { get; set; } +} + +public class MemberWebModel +{ + /// + /// 网页的url,必须包含http或者https头 + /// + [NotNull] + [JsonProperty("url")] + [JsonPropertyName("url")] + public string Url { get; set; } + /// + /// 网页的展示标题,长度限制12个UTF8字符 + /// + [NotNull] + [JsonProperty("title")] + [JsonPropertyName("title")] + public string Title { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/QrCodeSizeType.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/QrCodeSizeType.cs new file mode 100644 index 000000000..94c4a537a --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Models/QrCodeSizeType.cs @@ -0,0 +1,30 @@ +using System.ComponentModel; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +/// +/// 二维码尺寸类型 +/// +[Description("二维码尺寸类型")] +public enum QrCodeSizeType +{ + /// + /// 171 x 171 + /// + [Description("171 x 171")] + Size171 = 1, + /// + /// 399 x 399 + /// + [Description("399 x 399")] + Size399 = 2, + /// + /// 741 x 741 + /// + [Description("741 x 741")] + Size741 = 3, + /// + /// 2052 x 2052 + /// + [Description("2052 x 2052")] + Size2052 = 4, +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkBulkDeleteMemberRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkBulkDeleteMemberRequest.cs new file mode 100644 index 000000000..039f504c0 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkBulkDeleteMemberRequest.cs @@ -0,0 +1,39 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Request; +/// +/// 批量删除成员请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkBulkDeleteMemberRequest : WeChatWorkRequest +{ + /// + /// 成员UserID列表。对应管理端的账号。最多支持200个。若存在无效UserID,直接返回错误 + /// + [NotNull] + [JsonProperty("useridlist")] + [JsonPropertyName("useridlist")] + public List UserIdList { get; } + public WeChatWorkBulkDeleteMemberRequest() :this([]) + { + } + + public WeChatWorkBulkDeleteMemberRequest(List userIdList) + { + UserIdList = userIdList; + } + + protected override void Validate() + { + if (UserIdList.Count > 100) + { + throw new ArgumentException("The maximum number of member ids that can be deleted simultaneously is only 200!"); + } + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkBulkInviteMemberRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkBulkInviteMemberRequest.cs new file mode 100644 index 000000000..ededcf831 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkBulkInviteMemberRequest.cs @@ -0,0 +1,63 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Request; +/// +/// 邀请成员请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkBulkInviteMemberRequest : WeChatWorkRequest +{ + /// + /// 成员ID列表, 最多支持1000个。 + /// + [NotNull] + [JsonProperty("user")] + [JsonPropertyName("user")] + public List User { get; } + /// + /// 部门ID列表,最多支持100个。 + /// + [NotNull] + [JsonProperty("party")] + [JsonPropertyName("party")] + public List Party { get; } + /// + /// 标签ID列表,最多支持100个。 + /// + [NotNull] + [JsonProperty("tag")] + [JsonPropertyName("tag")] + public List Tag { get; } + public WeChatWorkBulkInviteMemberRequest() + { + User = new List(); + Party = new List(); + Tag = new List(); + } + + protected override void Validate() + { + if (User.IsNullOrEmpty() && Party.IsNullOrEmpty() && Tag.IsNullOrEmpty()) + { + throw new ArgumentException("User, Party, and Tag cannot all be empty at the same time!"); + } + if (User.Count > 1000) + { + throw new ArgumentException("User list, up to 1000 supported!"); + } + if (Party.Count > 100) + { + throw new ArgumentException("Party list, up to 100 supported!"); + } + if (Tag.Count > 100) + { + throw new ArgumentException("Tag list, up to 100 supported!"); + } + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkConvertToOpenIdRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkConvertToOpenIdRequest.cs new file mode 100644 index 000000000..8e9b16420 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkConvertToOpenIdRequest.cs @@ -0,0 +1,26 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Request; +/// +/// userid转openid请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkConvertToOpenIdRequest : WeChatWorkRequest +{ + /// + /// 企业内的成员id + /// + [NotNull] + [JsonProperty("userid")] + [JsonPropertyName("userid")] + public string UserId { get; } + public WeChatWorkConvertToOpenIdRequest(string userId) + { + UserId = Check.NotNullOrWhiteSpace(userId, nameof(userId)); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkConvertToUserIdRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkConvertToUserIdRequest.cs new file mode 100644 index 000000000..1e8fa4ec8 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkConvertToUserIdRequest.cs @@ -0,0 +1,27 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Request; +/// +/// openid转userid请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkConvertToUserIdRequest : WeChatWorkRequest +{ + /// + /// 在使用企业支付之后,返回结果的openid + /// + [NotNull] + [JsonProperty("openid")] + [JsonPropertyName("openid")] + public string OpenId { get; } + public WeChatWorkConvertToUserIdRequest(string openId) + { + OpenId = Check.NotNullOrWhiteSpace(openId, nameof(openId)); + } +} + diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkCreateMemberRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkCreateMemberRequest.cs new file mode 100644 index 000000000..c81e848a9 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkCreateMemberRequest.cs @@ -0,0 +1,230 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.Common.Members.Models; +using LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +using Newtonsoft.Json; +using System; +using System.ComponentModel.DataAnnotations; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Request; +/// +/// 创建成员请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkCreateMemberRequest : WeChatWorkRequest +{ + /// + /// 成员UserID。对应管理端的账号,企业内必须唯一。长度为1~64个字节。只能由数字、字母和“_-@.”四种字符组成,且第一个字符必须是数字或字母。系统进行唯一性检查时会忽略大小写。 + /// + [NotNull] + [JsonProperty("userid")] + [JsonPropertyName("userid")] + [StringLength(64, MinimumLength = 1)] + public string UserId { get; set; } + /// + /// 成员名称。长度为1~64个utf8字符 + /// + [NotNull] + [JsonProperty("name")] + [JsonPropertyName("name")] + [StringLength(64, MinimumLength = 1)] + public string Name { get; set; } + /// + /// 成员别名。长度1~64个utf8字符 + /// + [CanBeNull] + [JsonProperty("alias")] + [JsonPropertyName("alias")] + [StringLength(64, MinimumLength = 1)] + public string? Alias { get; set; } + /// + /// 手机号码。企业内必须唯一,mobile/email二者不能同时为空 ,中国大陆手机号码可省略“+86”,其他国家或地区必须要带上国际码。 + /// + [CanBeNull] + [JsonProperty("mobile")] + [JsonPropertyName("mobile")] + public string? Mobile { get; set; } + /// + /// 成员所属部门id列表,不超过100个。当不填写department或id为0时,成员会放在其他(待设置部门)下,当填写的部门不存在时,会在在其他(待设置部门)下新建对应部门 + /// + [CanBeNull] + [JsonProperty("department")] + [JsonPropertyName("department")] + public int[]? Department { get; set; } + /// + /// 部门内的排序值,默认为0,成员次序以创建时间从小到大排列。个数必须和参数department的个数一致,数值越大排序越前面。有效的值范围是[0, 2^32) + /// + [CanBeNull] + [JsonProperty("order")] + [JsonPropertyName("order")] + public int[]? Order { get; set; } + /// + /// 职务信息。长度为0~128个字符 + /// + [CanBeNull] + [StringLength(128)] + [JsonProperty("position")] + [JsonPropertyName("position")] + public string? Position { get; set; } + /// + /// 性别 + /// + [CanBeNull] + [JsonProperty("gender")] + [JsonPropertyName("gender")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.EnumToNumberStringConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.EnumToNumberStringConverter))] + public Gender? Gender { get; set; } + /// + /// 邮箱。可填写企业已有的邮箱账号,方便同事获取成员的邮箱账号以发邮件。长度6~64个字节,且为有效的email格式。企业内必须唯一,mobile/email二者不能同时为空。境外成员可用此邮箱登录企业微信。 + /// + [CanBeNull] + [StringLength(64)] + [JsonProperty("email")] + [JsonPropertyName("email")] + public string? Email { get; set; } + /// + /// 如果企业已开通腾讯企业邮(企业微信邮箱),设置该值可创建企业邮箱账号。长度6~64个字节,且为有效的企业邮箱格式。企业内必须唯一。未填写则系统会为用户生成默认企业邮箱(由系统生成的邮箱可修改一次) + /// + [CanBeNull] + [StringLength(64)] + [JsonProperty("biz_mail")] + [JsonPropertyName("biz_mail")] + public string? BizEmail { get; set; } + /// + /// 座机。32字节以内,由纯数字、“-”、“+”或“,”组成。 + /// + [CanBeNull] + [StringLength(32)] + [JsonProperty("telephone")] + [JsonPropertyName("telephone")] + public string? TelePhone { get; set; } + /// + /// 个数必须和参数department的个数一致,表示在所在的部门内是否为部门负责人。1表示为部门负责人,0表示非部门负责人。在审批(自建、第三方)等应用里可以用来标识上级审批人 + /// + [CanBeNull] + [JsonProperty("is_leader_in_dept")] + [JsonPropertyName("is_leader_in_dept")] + public int[]? IsLeaderInDept { get; set; } + /// + /// 直属上级UserID,设置范围为企业内成员,可以设置最多1个上级 + /// + [CanBeNull] + [JsonProperty("direct_leader")] + [JsonPropertyName("direct_leader")] + public string[]? DirectLeader { get; set; } + /// + /// 成员头像的mediaid,通过素材管理接口上传图片获得的mediaid + /// + [CanBeNull] + [JsonProperty("avatar_mediaid")] + [JsonPropertyName("avatar_mediaid")] + public string? AvatarMediaId { get; set; } + /// + /// 启用/禁用成员。1表示启用成员,0表示禁用成员 + /// + [CanBeNull] + [JsonProperty("enable")] + [JsonPropertyName("enable")] + public int? Enable { get; set; } + /// + /// 扩展属性。扩展属性字段需要先在WEB管理端添加,见扩展属性添加方法,否则忽略未知属性的赋值。字段详情见成员扩展属性 + /// + [CanBeNull] + [JsonProperty("extattr")] + [JsonPropertyName("extattr")] + public MemberExternalAttribute? ExternalAttribute { get; set; } + /// + /// 是否邀请该成员使用企业微信(将通过微信服务通知或短信或邮件下发邀请,每天自动下发一次,最多持续3个工作日),默认值为true。 + /// + [CanBeNull] + [JsonProperty("to_invite")] + [JsonPropertyName("to_invite")] + public bool? ToInvite { get; set; } + /// + /// 成员对外属性,字段详情见对外属性 + /// + [CanBeNull] + [JsonProperty("external_profile")] + [JsonPropertyName("external_profile")] + public ExternalProfile? ExternalProfile { get; set; } + /// + /// 对外职务,如果设置了该值,则以此作为对外展示的职务,否则以position来展示。长度12个汉字内 + /// + [CanBeNull] + [StringLength(12)] + [JsonProperty("external_position")] + [JsonPropertyName("external_position")] + public string? ExternalPosition { get; set; } + /// + /// 视频号名字(设置后,成员将对外展示该视频号)。须从企业绑定到企业微信的视频号中选择,可在“我的企业”页中查看绑定的视频号 + /// + [CanBeNull] + [JsonProperty("nickname")] + [JsonPropertyName("nickname")] + public string? NickName { get; set; } + /// + /// 地址。长度最大128个字符 + /// + [CanBeNull] + [StringLength(128)] + [JsonProperty("address")] + [JsonPropertyName("address")] + public string? Address { get; set; } + /// + /// 主部门 + /// + [CanBeNull] + [JsonProperty("main_department")] + [JsonPropertyName("main_department")] + public int? MainDepartment { get; set; } + protected override void Validate() + { + Check.NotNullOrWhiteSpace(UserId, nameof(UserId), 64, 1); + Check.NotNullOrWhiteSpace(Name, nameof(Name), 64, 1); + Check.Length(Alias, nameof(Alias), 64, 1); + Check.Length(Position, nameof(Position), 128); + Check.Length(Email, nameof(Email), 64, 6); + Check.Length(BizEmail, nameof(BizEmail), 64, 6); + Check.Length(TelePhone, nameof(TelePhone), 32); + Check.Length(ExternalPosition, nameof(ExternalPosition), 12); + Check.Length(Address, nameof(Address), 128); + // mobile/email二者不能同时为空 + if (Mobile.IsNullOrWhiteSpace() && Email.IsNullOrWhiteSpace()) + { + throw new ArgumentException("mobile and email cannot be empty at the same time!"); + } + // 成员所属部门id列表,不超过100个 + if (Department?.Length > 0) + { + // 成员所属部门id列表,不超过100个 + if (Department?.Length > 100) + { + throw new ArgumentException("The list of department ids to which members belong shall not exceed 100!"); + } + // 部门排序列表个数必须和参数department的个数一致 + if (Order?.Length != Department?.Length) + { + throw new ArgumentException("The number of Order must be consistent with the number of the parameter \"department\"!"); + } + // 部门负责人列表个数必须和参数department的个数一致 + if (IsLeaderInDept?.Length != Department?.Length) + { + throw new ArgumentException("The number of IsLeaderInDept must be consistent with the number of the parameter \"Department\"!"); + } + } + // 最多只可设置一个直属上级 + if (DirectLeader?.Length > 1) + { + throw new ArgumentException("At most, only one direct superior can be set up!"); + } + // 只可存在两种值 + if (Enable.HasValue && Enable != 0) + { + Enable = 1; + } + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkGetUserIdByEmailRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkGetUserIdByEmailRequest.cs new file mode 100644 index 000000000..0ed571116 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkGetUserIdByEmailRequest.cs @@ -0,0 +1,35 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Request; +/// +/// 邮箱获取userid请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetUserIdByEmailRequest : WeChatWorkRequest +{ + /// + /// 邮箱 + /// + [NotNull] + [JsonProperty("email")] + [JsonPropertyName("email")] + public string Email { get; } + /// + /// 邮箱类型 + /// + [CanBeNull] + [JsonProperty("email_type")] + [JsonPropertyName("email_type")] + public EmailType? EmailType { get; } + public WeChatWorkGetUserIdByEmailRequest(string email, EmailType? emailType = null) + { + Email = Check.NotNullOrWhiteSpace(email, nameof(email)); + EmailType = emailType; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkGetUserIdByMobileRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkGetUserIdByMobileRequest.cs new file mode 100644 index 000000000..230a13eab --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkGetUserIdByMobileRequest.cs @@ -0,0 +1,26 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Request; +/// +/// 手机号获取userid请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetUserIdByMobileRequest : WeChatWorkRequest +{ + /// + /// 用户在企业微信通讯录中的手机号码。长度为5~32个字节 + /// + [NotNull] + [JsonProperty("mobile")] + [JsonPropertyName("mobile")] + public string Mobile { get; } + public WeChatWorkGetUserIdByMobileRequest(string mobile) + { + Mobile = Check.NotNullOrWhiteSpace(mobile, nameof(mobile), 32, 5); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkGetUserIdListRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkGetUserIdListRequest.cs new file mode 100644 index 000000000..07cb559f0 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkGetUserIdListRequest.cs @@ -0,0 +1,42 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Request; +/// +/// 获取成员ID列表请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetUserIdListRequest : WeChatWorkRequest +{ + /// + /// 用于分页查询的游标,字符串类型,由上一次调用返回,首次调用不填 + /// + [CanBeNull] + [JsonProperty("cursor")] + [JsonPropertyName("cursor")] + public string? Cursor { get; set; } + /// + /// 分页,预期请求的数据量,取值范围 1 ~ 10000 + /// + [CanBeNull] + [JsonProperty("limit")] + [JsonPropertyName("limit")] + public int? Limit { get; set; } + public WeChatWorkGetUserIdListRequest(string? cursor = null, int? limit = 100) + { + Cursor = cursor; + Limit = limit; + } + + protected override void Validate() + { + if (Limit.HasValue) + { + Check.Range(Limit.Value, nameof(Limit), 1, 10000); + } + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkUpdateMemberRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkUpdateMemberRequest.cs new file mode 100644 index 000000000..38fee98a4 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Request/WeChatWorkUpdateMemberRequest.cs @@ -0,0 +1,236 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.Common.Members.Models; +using LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +using Newtonsoft.Json; +using System; +using System.ComponentModel.DataAnnotations; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Request; +/// +/// 更新成员请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkUpdateMemberRequest : WeChatWorkRequest +{ + /// + /// 成员UserID。对应管理端的账号,企业内必须唯一。不区分大小写,长度为1~64个字节 + /// + [NotNull] + [JsonProperty("userid")] + [JsonPropertyName("userid")] + [StringLength(64, MinimumLength = 1)] + public string UserId { get; set; } + /// + /// 如果userid由系统自动生成,则仅允许修改一次。新值可由new_userid字段指定。 + /// + [CanBeNull] + [JsonProperty("new_userid")] + [JsonPropertyName("new_userid")] + [StringLength(64, MinimumLength = 1)] + public string? NewUserId { get; set; } + /// + /// 成员名称。长度为1~64个utf8字符 + /// + [NotNull] + [JsonProperty("name")] + [JsonPropertyName("name")] + [StringLength(64, MinimumLength = 1)] + public string Name { get; set; } + /// + /// 成员别名。长度1~64个utf8字符 + /// + [CanBeNull] + [JsonProperty("alias")] + [JsonPropertyName("alias")] + [StringLength(64, MinimumLength = 1)] + public string? Alias { get; set; } + /// + /// 手机号码。企业内必须唯一。若成员已激活企业微信,则需成员自行修改(此情况下该参数被忽略,但不会报错) ,中国大陆手机号码可省略“+86”,其他国家或地区必须要带上国际码。 + /// + [CanBeNull] + [JsonProperty("mobile")] + [JsonPropertyName("mobile")] + public string? Mobile { get; set; } + /// + /// 成员所属部门id列表,不超过100个 + /// + [CanBeNull] + [JsonProperty("department")] + [JsonPropertyName("department")] + public int[]? Department { get; set; } + /// + /// 部门内的排序值,默认为0。当有传入department时有效。数量必须和department一致,数值越大排序越前面。有效的值范围是[0, 2^32) + /// + [CanBeNull] + [JsonProperty("order")] + [JsonPropertyName("order")] + public int[]? Order { get; set; } + /// + /// 职务信息。长度为0~128个utf8字符 + /// + [CanBeNull] + [StringLength(128)] + [JsonProperty("position")] + [JsonPropertyName("position")] + public string? Position { get; set; } + /// + /// 性别 + /// + [CanBeNull] + [JsonProperty("gender")] + [JsonPropertyName("gender")] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.EnumToNumberStringConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.EnumToNumberStringConverter))] + public Gender? Gender { get; set; } + /// + /// 邮箱。可填写企业已有的邮箱账号,方便同事获取成员的邮箱账号以发邮件。长度6~64个字节,且为有效的email格式。企业内必须唯一。境外成员可用此邮箱登录企业微信。 + /// + [CanBeNull] + [StringLength(64)] + [JsonProperty("email")] + [JsonPropertyName("email")] + public string? Email { get; set; } + /// + /// 如果企业已开通腾讯企业邮(企业微信邮箱),设置该值可创建企业邮箱账号。长度6~63个字节,且为有效的企业邮箱格式。企业内必须唯一。未填写则系统会为用户生成默认企业邮箱(由系统生成的邮箱可修改一次)。 + /// + [CanBeNull] + [StringLength(64)] + [JsonProperty("biz_mail")] + [JsonPropertyName("biz_mail")] + public string? BizEmail { get; set; } + /// + /// 企业邮箱别名。长度6~63个字节,且为有效的企业邮箱格式。企业内必须唯一,最多可设置5个别名。更新时为覆盖式更新。传空结构或传空数组会清空当前企业邮箱别名。 + /// + [CanBeNull] + [StringLength(63, MinimumLength = 6)] + [JsonProperty("biz_mail_alias")] + [JsonPropertyName("biz_mail_alias")] + public string? BizEmailAlias { get; set; } + /// + /// 座机。32字节以内,由纯数字、“-”、“+”或“,”组成。 + /// + [CanBeNull] + [StringLength(32)] + [JsonProperty("telephone")] + [JsonPropertyName("telephone")] + public string? TelePhone { get; set; } + /// + /// 部门负责人字段,个数必须和department一致,表示在所在的部门内是否为负责人。0-否,1-是 + /// + [CanBeNull] + [JsonProperty("is_leader_in_dept")] + [JsonPropertyName("is_leader_in_dept")] + public int[]? IsLeaderInDept { get; set; } + /// + /// 直属上级UserID,设置范围为企业内成员,可以设置最多1个上级 + /// + [CanBeNull] + [JsonProperty("direct_leader")] + [JsonPropertyName("direct_leader")] + public string[]? DirectLeader { get; set; } + /// + /// 成员头像的mediaid,通过素材管理接口上传图片获得的mediaid + /// + [CanBeNull] + [JsonProperty("avatar_mediaid")] + [JsonPropertyName("avatar_mediaid")] + public string? AvatarMediaId { get; set; } + /// + /// 启用/禁用成员。1表示启用成员,0表示禁用成员 + /// + [CanBeNull] + [JsonProperty("enable")] + [JsonPropertyName("enable")] + public int? Enable { get; set; } + /// + /// 扩展属性。扩展属性字段需要先在WEB管理端添加,见扩展属性添加方法,否则忽略未知属性的赋值。字段详情见成员扩展属性 + /// + [CanBeNull] + [JsonProperty("extattr")] + [JsonPropertyName("extattr")] + public MemberExternalAttribute? ExternalAttribute { get; set; } + /// + /// 成员对外属性,字段详情见对外属性 + /// + [CanBeNull] + [JsonProperty("external_profile")] + [JsonPropertyName("external_profile")] + public ExternalProfile? ExternalProfile { get; set; } + /// + /// 对外职务,如果设置了该值,则以此作为对外展示的职务,否则以position来展示。不超过12个汉字 + /// + [CanBeNull] + [StringLength(12)] + [JsonProperty("external_position")] + [JsonPropertyName("external_position")] + public string? ExternalPosition { get; set; } + /// + /// 视频号名字(设置后,成员将对外展示该视频号)。须从企业绑定到企业微信的视频号中选择,可在“我的企业”页中查看绑定的视频号 + /// + [CanBeNull] + [JsonProperty("nickname")] + [JsonPropertyName("nickname")] + public string? NickName { get; set; } + /// + /// 地址。长度最大128个字符 + /// + [CanBeNull] + [StringLength(128)] + [JsonProperty("address")] + [JsonPropertyName("address")] + public string? Address { get; set; } + /// + /// 主部门 + /// + [CanBeNull] + [JsonProperty("main_department")] + [JsonPropertyName("main_department")] + public int? MainDepartment { get; set; } + + protected override void Validate() + { + Check.NotNullOrWhiteSpace(UserId, nameof(UserId), 64, 1); + Check.NotNullOrWhiteSpace(Name, nameof(Name), 64, 1); + Check.Length(Alias, nameof(Alias), 64, 1); + Check.Length(Position, nameof(Position), 128); + Check.Length(Email, nameof(Email), 64, 6); + Check.Length(BizEmail, nameof(BizEmail), 64, 6); + Check.Length(TelePhone, nameof(TelePhone), 32); + Check.Length(ExternalPosition, nameof(ExternalPosition), 12); + Check.Length(Address, nameof(Address), 128); + Check.Length(NewUserId, nameof(NewUserId), 64, 1); + // 成员所属部门id列表,不超过100个 + if (Department?.Length > 0) + { + // 成员所属部门id列表,不超过100个 + if (Department?.Length > 100) + { + throw new ArgumentException("The list of department ids to which members belong shall not exceed 100!"); + } + // 部门排序列表个数必须和参数department的个数一致 + if (Order?.Length != Department?.Length) + { + throw new ArgumentException("The number of Order must be consistent with the number of the parameter \"department\"!"); + } + // 部门负责人列表个数必须和参数department的个数一致 + if (IsLeaderInDept?.Length != Department?.Length) + { + throw new ArgumentException("The number of IsLeaderInDept must be consistent with the number of the parameter \"Department\"!"); + } + } + // 最多只可设置一个直属上级 + if (DirectLeader?.Length > 1) + { + throw new ArgumentException("At most, only one direct superior can be set up!"); + } + // 只可存在两种值 + if (Enable.HasValue && Enable != 0) + { + Enable = 1; + } + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkBulkInviteMemberResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkBulkInviteMemberResponse.cs new file mode 100644 index 000000000..f0fe6c77a --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkBulkInviteMemberResponse.cs @@ -0,0 +1,35 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Response; +/// +/// 邀请成员响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkBulkInviteMemberResponse : WeChatWorkResponse +{ + /// + /// 非法成员列表 + /// + [NotNull] + [JsonProperty("invaliduser")] + [JsonPropertyName("invaliduser")] + public string[] InvalidUser { get; set; } + /// + /// 非法部门列表 + /// + [NotNull] + [JsonProperty("invalidparty")] + [JsonPropertyName("invalidparty")] + public int[] InvalidParty { get; set; } + /// + /// 非法标签列表 + /// + [NotNull] + [JsonProperty("invalidtag")] + [JsonPropertyName("invalidtag")] + public int[] InvalidTag { get; set; } +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkConvertToOpenIdResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkConvertToOpenIdResponse.cs new file mode 100644 index 000000000..a1b9050bf --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkConvertToOpenIdResponse.cs @@ -0,0 +1,21 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Response; +/// +/// userid转openid响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkConvertToOpenIdResponse : WeChatWorkResponse +{ + /// + /// 企业微信成员userid对应的openid + /// + [NotNull] + [JsonProperty("openid")] + [JsonPropertyName("openid")] + public string OpenId { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkConvertToUserIdResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkConvertToUserIdResponse.cs new file mode 100644 index 000000000..efb7d2f47 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkConvertToUserIdResponse.cs @@ -0,0 +1,21 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Response; +/// +/// openid转userid响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkConvertToUserIdResponse : WeChatWorkResponse +{ + /// + /// 该openid在企业微信对应的成员userid + /// + [NotNull] + [JsonProperty("userid")] + [JsonPropertyName("userid")] + public string UserId { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkCreateMemberResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkCreateMemberResponse.cs new file mode 100644 index 000000000..412ee3a00 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkCreateMemberResponse.cs @@ -0,0 +1,22 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.Contacts.Departments.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Response; +/// +/// 创建成员响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkCreateMemberResponse : WeChatWorkResponse +{ + /// + /// 因填写不存在的部门,新增的部门列表 + /// + [CanBeNull] + [JsonProperty("created_department_list")] + [JsonPropertyName("created_department_list")] + public Department[]? CreatedDepartmentList { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetJoinQrCodeResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetJoinQrCodeResponse.cs new file mode 100644 index 000000000..bf75a1766 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetJoinQrCodeResponse.cs @@ -0,0 +1,21 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Response; +/// +/// 获取加入企业二维码响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetJoinQrCodeResponse : WeChatWorkResponse +{ + /// + /// 二维码链接,有效期7天 + /// + [NotNull] + [JsonProperty("join_qrcode")] + [JsonPropertyName("join_qrcode")] + public string JoinQrcCode { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetMemberListResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetMemberListResponse.cs new file mode 100644 index 000000000..cededeed8 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetMemberListResponse.cs @@ -0,0 +1,22 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Response; +/// +/// 获取部门成员详情响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetMemberListResponse : WeChatWorkResponse +{ + /// + /// 成员列表 + /// + [NotNull] + [JsonProperty("userlist")] + [JsonPropertyName("userlist")] + public MemberInfo[] UserList { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetMemberResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetMemberResponse.cs new file mode 100644 index 000000000..8590f0b29 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetMemberResponse.cs @@ -0,0 +1,170 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.Common.Members.Models; +using LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Response; +/// +/// 读取成员响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetMemberResponse : WeChatWorkResponse +{ + /// + /// 全局唯一 + /// + [NotNull] + [JsonProperty("open_userid")] + [JsonPropertyName("open_userid")] + public string OpenUserId { get; set; } + /// + /// 成员UserID + /// + [NotNull] + [JsonProperty("userid")] + [JsonPropertyName("userid")] + public string UserId { get; set; } + /// + /// 成员名称 + /// + [NotNull] + [JsonProperty("name")] + [JsonPropertyName("name")] + public string Name { get; set; } + /// + /// 手机号码 + /// + [CanBeNull] + [JsonProperty("mobile")] + [JsonPropertyName("mobile")] + public string? Mobile { get; set; } + /// + /// 成员所属部门id列表 + /// + [NotNull] + [JsonProperty("department")] + [JsonPropertyName("department")] + public int[] Department { get; set; } + /// + /// 主部门 + /// + [CanBeNull] + [JsonProperty("main_department")] + [JsonPropertyName("main_department")] + public int? MainDepartment { get; set; } + /// + /// 部门内的排序值,默认为0。数量必须和department一致,数值越大排序越前面。值范围是[0, 2^32) + /// + [NotNull] + [JsonProperty("order")] + [JsonPropertyName("order")] + public int[]? Order { get; set; } + /// + /// 员工个人二维码 + /// + [CanBeNull] + [JsonProperty("qr_code")] + [JsonPropertyName("qr_code")] + public string? QrCode { get; set; } + /// + /// 职务信息 + /// + [CanBeNull] + [JsonProperty("position")] + [JsonPropertyName("position")] + public string? Position { get; set; } + /// + /// 性别 + /// + [CanBeNull] + [JsonProperty("gender")] + [JsonPropertyName("gender")] + public Gender? Gender { get; set; } + /// + /// 邮箱 + /// + [CanBeNull] + [JsonProperty("email")] + [JsonPropertyName("email")] + public string? Email { get; set; } + /// + /// 企业邮箱 + /// + [CanBeNull] + [JsonProperty("biz_mail")] + [JsonPropertyName("biz_mail")] + public string? BizEmail { get; set; } + /// + /// 表示在所在的部门内是否为部门负责人,数量与department一致 + /// + [CanBeNull] + [JsonProperty("is_leader_in_dept")] + [JsonPropertyName("is_leader_in_dept")] + public int[]? IsLeaderInDept { get; set; } + /// + /// 直属上级UserID,返回在应用可见范围内的直属上级列表,最多有1个直属上级 + /// + [CanBeNull] + [JsonProperty("direct_leader")] + [JsonPropertyName("direct_leader")] + public string[]? DirectLeader { get; set; } + /// + /// 头像url + /// + [CanBeNull] + [JsonProperty("avatar")] + [JsonPropertyName("avatar")] + public string? Avatar { get; set; } + /// + /// 头像缩略图url + /// + [CanBeNull] + [JsonProperty("thumb_avatar")] + [JsonPropertyName("thumb_avatar")] + public string? ThumbAvatar { get; set; } + /// + /// 座机 + /// + [CanBeNull] + [JsonProperty("telephone")] + [JsonPropertyName("telephone")] + public string? TelePhone { get; set; } + /// + /// 别名 + /// + [CanBeNull] + [JsonProperty("alias")] + [JsonPropertyName("alias")] + public string? Alias { get; set; } + /// + /// 地址 + /// + [CanBeNull] + [JsonProperty("address")] + [JsonPropertyName("address")] + public string? Address { get; set; } + /// + /// 激活状态 + /// + [NotNull] + [JsonProperty("status")] + [JsonPropertyName("status")] + public MemberStatus Status { get; set; } + /// + /// 扩展属性 + /// + [CanBeNull] + [JsonProperty("extattr")] + [JsonPropertyName("extattr")] + public MemberExternalAttribute? ExternalAttribute { get; set; } + /// + /// 对外职务,如果设置了该值,则以此作为对外展示的职务,否则以position来展示。 + /// + [CanBeNull] + [JsonProperty("external_position")] + [JsonPropertyName("external_position")] + public string? ExternalPosition { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetSimpleMemberListResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetSimpleMemberListResponse.cs new file mode 100644 index 000000000..9a1c4c6b5 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetSimpleMemberListResponse.cs @@ -0,0 +1,22 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Response; +/// +/// 获取部门成员响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetSimpleMemberListResponse : WeChatWorkResponse +{ + /// + /// 成员列表 + /// + [NotNull] + [JsonProperty("userlist")] + [JsonPropertyName("userlist")] + public DepartmentMember[] UserList { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetUserIdListResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetUserIdListResponse.cs new file mode 100644 index 000000000..f768f101d --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetUserIdListResponse.cs @@ -0,0 +1,29 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Response; +/// +/// 获取成员ID列表响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetUserIdListResponse : WeChatWorkResponse +{ + /// + /// 用户-部门关系列表 + /// + [CanBeNull] + [JsonProperty("next_cursor")] + [JsonPropertyName("next_cursor")] + public string? NextCursor { get; set; } + /// + /// 分页游标,下次请求时填写以获取之后分页的记录。如果该字段返回空则表示已没有更多数据 + /// + [NotNull] + [JsonProperty("dept_user")] + [JsonPropertyName("dept_user")] + public DepartmentUser[] DepartmentUser { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetUserIdResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetUserIdResponse.cs new file mode 100644 index 000000000..23dec2bf1 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/Response/WeChatWorkGetUserIdResponse.cs @@ -0,0 +1,18 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members.Response; +/// +/// 获取userid响应参数 +/// +public class WeChatWorkGetUserIdResponse : WeChatWorkResponse +{ + /// + /// 成员UserID。对应管理端的账号,企业内必须唯一。不区分大小写,长度为1~64个字节。注意:第三方应用获取的值是密文的userid + /// + [NotNull] + [JsonProperty("userid")] + [JsonPropertyName("userid")] + public string UserId { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/WeChatWorkMemberProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/WeChatWorkMemberProvider.cs new file mode 100644 index 000000000..c84342e90 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Members/WeChatWorkMemberProvider.cs @@ -0,0 +1,209 @@ +using LINGYUN.Abp.WeChat.Work.Contacts.Features; +using LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +using LINGYUN.Abp.WeChat.Work.Contacts.Members.Request; +using LINGYUN.Abp.WeChat.Work.Contacts.Members.Response; +using LINGYUN.Abp.WeChat.Work.Contacts.Token; +using LINGYUN.Abp.WeChat.Work.Token; +using Microsoft.Extensions.DependencyInjection; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Features; +using Volo.Abp.Json; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members; + +[RequiresFeature(WeChatWorkContactsFeatureNames.Enable)] +public class WeChatWorkMemberProvider : IWeChatWorkMemberProvider, ISingletonDependency +{ + protected IJsonSerializer JsonSerializer { get; } + protected IHttpClientFactory HttpClientFactory { get; } + protected IWeChatWorkTokenProvider WeChatWorkTokenProvider { get; } + protected IWeChatWorkContactTokenProvider WeChatWorkContactTokenProvider { get; } + + public WeChatWorkMemberProvider( + IJsonSerializer jsonSerializer, + IHttpClientFactory httpClientFactory, + IWeChatWorkTokenProvider weChatWorkTokenProvider, + IWeChatWorkContactTokenProvider weChatWorkContactTokenProvider) + { + JsonSerializer = jsonSerializer; + HttpClientFactory = httpClientFactory; + WeChatWorkTokenProvider = weChatWorkTokenProvider; + WeChatWorkContactTokenProvider = weChatWorkContactTokenProvider; + } + + public async virtual Task GetMemberAsync( + string userId, + CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(userId, nameof(userId), 64, 1); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.GetMemberAsync(token.AccessToken, userId, cancellationToken); + } + + public async virtual Task CreateMemberAsync( + WeChatWorkCreateMemberRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkContactTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.CreateMemberAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task UpdateMemberAsync( + WeChatWorkUpdateMemberRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkContactTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.UpdateMemberAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task DeleteMemberAsync( + string userId, + CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(userId, nameof(userId), 64, 1); + + var token = await WeChatWorkContactTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.DeleteMemberAsync(token.AccessToken, userId, cancellationToken); + } + + public async virtual Task BulkDeleteMemberAsync( + WeChatWorkBulkDeleteMemberRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkContactTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.BulkDeleteMemberAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task GetSimpleMemberListAsync( + int departmentId, + CancellationToken cancellationToken = default) + { + Check.NotDefaultOrNull(departmentId, nameof(departmentId)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.GetSimpleMemberListAsync(token.AccessToken, departmentId, cancellationToken); + } + + public async virtual Task GetMemberListAsync( + int departmentId, + CancellationToken cancellationToken = default) + { + Check.NotDefaultOrNull(departmentId, nameof(departmentId)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.GetMemberListAsync(token.AccessToken, departmentId, cancellationToken); + } + + public async virtual Task ConvertToOpenIdAsync( + WeChatWorkConvertToOpenIdRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.ConvertToOpenIdAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task ConvertToUserIdAsync( + WeChatWorkConvertToUserIdRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.ConvertToUserIdAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task AuthSuccessAsync( + string userId, + CancellationToken cancellationToken = default) + { + Check.NotNull(userId, nameof(userId)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.AuthSuccessAsync(token.AccessToken, userId, cancellationToken); + } + + public async virtual Task BulkInviteMemberAsync( + WeChatWorkBulkInviteMemberRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.BulkInviteMemberAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task GetJoinQrCodeAsync( + QrCodeSizeType sizeType, + CancellationToken cancellationToken = default) + { + var token = await WeChatWorkContactTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.GetJoinQrCodeAsync(token.AccessToken, sizeType, cancellationToken); + } + + public async virtual Task GetUserIdByMobileAsync( + WeChatWorkGetUserIdByMobileRequest request, + CancellationToken cancellationToken = default) + { + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.GetUserIdByMobileAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task GetUserIdByEmailAsync( + WeChatWorkGetUserIdByEmailRequest request, + CancellationToken cancellationToken = default) + { + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.GetUserIdByEmailAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task GetUserIdListAsync( + WeChatWorkGetUserIdListRequest request, + CancellationToken cancellationToken = default) + { + var token = await WeChatWorkContactTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.GetUserIdListAsync(token.AccessToken, request, cancellationToken); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/BatchJobResultEvent.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/BatchJobResultEvent.cs similarity index 61% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/BatchJobResultEvent.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/BatchJobResultEvent.cs index fc86054cc..03edca67d 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/BatchJobResultEvent.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/BatchJobResultEvent.cs @@ -1,11 +1,15 @@ using LINGYUN.Abp.WeChat.Common.Messages; +using LINGYUN.Abp.WeChat.Work.Common.Messages; using System.Xml.Serialization; using Volo.Abp.EventBus; -namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Messages.Models; /// -/// 异步任务完成事件 +/// 异步任务完成通知 /// +/// +/// 本事件是成员在使用异步任务接口时,用于接收任务执行完毕的结果通知。 +/// [EventName("batch_job_result")] public class BatchJobResultEvent : WeChatWorkEventMessage { @@ -13,14 +17,15 @@ public class BatchJobResultEvent : WeChatWorkEventMessage /// 异步任务信息 ///
[XmlElement("BatchJob")] - public BatchJobResult BatchJob { get; set; } + public BatchJob BatchJob { get; set; } + public override WeChatMessageEto ToEto() { return new WeChatWorkEventMessageEto(this); } } -public class BatchJobResult +public class BatchJob { /// /// 异步任务id,最大长度为64字符 @@ -28,12 +33,7 @@ public class BatchJobResult [XmlElement("JobId")] public string JobId { get; set; } /// - /// 操作类型,字符串, - /// 目前分别有: - /// sync_user(增量更新成员)、 - /// replace_user(全量覆盖成员)、 - /// invite_user(邀请成员关注)、 - /// replace_party(全量覆盖部门) + /// 操作类型,字符串,目前分别有:sync_user(增量更新成员)、 replace_user(全量覆盖成员)、invite_user(邀请成员关注)、replace_party(全量覆盖部门) /// [XmlElement("JobType")] public string JobType { get; set; } @@ -43,8 +43,8 @@ public class BatchJobResult [XmlElement("ErrCode")] public int ErrCode { get; set; } /// - /// 返回码 + /// 对返回码的文本描述内容 /// [XmlElement("ErrMsg")] public string ErrMsg { get; set; } -} +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/CreateDepartmentEvent.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/CreateDepartmentEvent.cs similarity index 82% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/CreateDepartmentEvent.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/CreateDepartmentEvent.cs index ae79490d6..a260a96b7 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/CreateDepartmentEvent.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/CreateDepartmentEvent.cs @@ -1,8 +1,9 @@ using LINGYUN.Abp.WeChat.Common.Messages; +using LINGYUN.Abp.WeChat.Work.Common.Messages; using System.Xml.Serialization; using Volo.Abp.EventBus; -namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Messages.Models; /// /// 新增部门事件 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/CreateUserEvent.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/CreateUserEvent.cs similarity index 75% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/CreateUserEvent.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/CreateUserEvent.cs index 22320382e..aa5b755de 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/CreateUserEvent.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/CreateUserEvent.cs @@ -1,7 +1,8 @@ using LINGYUN.Abp.WeChat.Common.Messages; +using LINGYUN.Abp.WeChat.Work.Common.Messages; using Volo.Abp.EventBus; -namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Messages.Models; /// /// 新增成员事件 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/DeleteDepartmentEvent.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/DeleteDepartmentEvent.cs similarity index 82% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/DeleteDepartmentEvent.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/DeleteDepartmentEvent.cs index 6827d82db..217a2fd1c 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/DeleteDepartmentEvent.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/DeleteDepartmentEvent.cs @@ -1,8 +1,9 @@ using LINGYUN.Abp.WeChat.Common.Messages; +using LINGYUN.Abp.WeChat.Work.Common.Messages; using System.Xml.Serialization; using Volo.Abp.EventBus; -namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Messages.Models; /// /// 删除部门事件 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/DeleteUserEvent.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/DeleteUserEvent.cs similarity index 82% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/DeleteUserEvent.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/DeleteUserEvent.cs index 3d98b97fe..d3acb35d6 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/DeleteUserEvent.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/DeleteUserEvent.cs @@ -1,8 +1,9 @@ using LINGYUN.Abp.WeChat.Common.Messages; +using LINGYUN.Abp.WeChat.Work.Common.Messages; using System.Xml.Serialization; using Volo.Abp.EventBus; -namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Messages.Models; /// /// 删除成员事件 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/DepartmentUpdateEvent.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/DepartmentUpdateEvent.cs similarity index 77% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/DepartmentUpdateEvent.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/DepartmentUpdateEvent.cs index 628dca80c..efaa71948 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/DepartmentUpdateEvent.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/DepartmentUpdateEvent.cs @@ -1,6 +1,7 @@ -using System.Xml.Serialization; +using LINGYUN.Abp.WeChat.Work.Common.Messages; +using System.Xml.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Messages.Models; /// /// 部门变更事件 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/UpdateDepartmentEvent.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/UpdateDepartmentEvent.cs similarity index 76% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/UpdateDepartmentEvent.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/UpdateDepartmentEvent.cs index 9ff67015e..ba735eb53 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/UpdateDepartmentEvent.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/UpdateDepartmentEvent.cs @@ -1,7 +1,8 @@ using LINGYUN.Abp.WeChat.Common.Messages; +using LINGYUN.Abp.WeChat.Work.Common.Messages; using Volo.Abp.EventBus; -namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Messages.Models; /// /// 更新部门事件 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/UpdateUserEvent.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/UpdateUserEvent.cs similarity index 83% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/UpdateUserEvent.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/UpdateUserEvent.cs index b19136b47..8daffa018 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/UpdateUserEvent.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/UpdateUserEvent.cs @@ -1,8 +1,9 @@ using LINGYUN.Abp.WeChat.Common.Messages; +using LINGYUN.Abp.WeChat.Work.Common.Messages; using System.Xml.Serialization; using Volo.Abp.EventBus; -namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Messages.Models; /// /// 更新成员事件 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/UserChangeEvent.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/UserChangeEvent.cs similarity index 96% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/UserChangeEvent.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/UserChangeEvent.cs index a3135f7a1..e2a8dcda7 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/UserChangeEvent.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/UserChangeEvent.cs @@ -1,6 +1,8 @@ -using System.Xml.Serialization; +using LINGYUN.Abp.WeChat.Work.Common.Members.Models; +using LINGYUN.Abp.WeChat.Work.Common.Messages; +using System.Xml.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Messages.Models; /// /// 成员变更事件 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/UserTagChangeEvent.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/UserTagChangeEvent.cs similarity index 92% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/UserTagChangeEvent.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/UserTagChangeEvent.cs index 5e770c7e6..b3c0d4db6 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/UserTagChangeEvent.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Messages/Models/UserTagChangeEvent.cs @@ -1,8 +1,9 @@ using LINGYUN.Abp.WeChat.Common.Messages; +using LINGYUN.Abp.WeChat.Work.Common.Messages; using System.Xml.Serialization; using Volo.Abp.EventBus; -namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Messages.Models; /// /// 标签成员变更事件 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Settings/WeChatWorkContactSettingDefinitionProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Settings/WeChatWorkContactSettingDefinitionProvider.cs new file mode 100644 index 000000000..dc6234c7b --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Settings/WeChatWorkContactSettingDefinitionProvider.cs @@ -0,0 +1,30 @@ +using LINGYUN.Abp.WeChat.Work.Localization; +using Volo.Abp.Localization; +using Volo.Abp.Settings; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Settings; + +public class WeChatWorkContactSettingDefinitionProvider : SettingDefinitionProvider +{ + public override void Define(ISettingDefinitionContext context) + { + context.Add( + new SettingDefinition( + WeChatWorkContactSettingNames.Secret, + displayName: L("DisplayName:WeChatWorkContact.Secret"), + description: L("Description:WeChatWorkContact.Secret"), + isVisibleToClients: false, + isEncrypted: true) + .WithProviders( + DefaultValueSettingValueProvider.ProviderName, + ConfigurationSettingValueProvider.ProviderName, + GlobalSettingValueProvider.ProviderName, + TenantSettingValueProvider.ProviderName) + ); + } + + private static ILocalizableString L(string name) + { + return LocalizableString.Create(name); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Settings/WeChatWorkContactSettingNames.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Settings/WeChatWorkContactSettingNames.cs new file mode 100644 index 000000000..377272fff --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Settings/WeChatWorkContactSettingNames.cs @@ -0,0 +1,12 @@ +using LINGYUN.Abp.WeChat.Work.Settings; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Settings; + +public static class WeChatWorkContactSettingNames +{ + public const string Prefix = WeChatWorkSettingNames.Prefix + ".Contacts"; + /// + /// 通讯录应用Srcret + /// + public const string Secret = Prefix + ".Secret"; +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/IWeChatWorkTagProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/IWeChatWorkTagProvider.cs similarity index 79% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/IWeChatWorkTagProvider.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/IWeChatWorkTagProvider.cs index 64e97fb56..e56638425 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/IWeChatWorkTagProvider.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/IWeChatWorkTagProvider.cs @@ -1,9 +1,9 @@ -using LINGYUN.Abp.WeChat.Work.Tags.Request; -using LINGYUN.Abp.WeChat.Work.Tags.Response; +using LINGYUN.Abp.WeChat.Work.Contacts.Tags.Request; +using LINGYUN.Abp.WeChat.Work.Contacts.Tags.Response; using System.Threading; using System.Threading.Tasks; -namespace LINGYUN.Abp.WeChat.Work.Tags; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Tags; /// /// 标签管理接口 /// @@ -13,7 +13,7 @@ public interface IWeChatWorkTagProvider /// 创建标签 /// /// - /// 详情见:https://developer.work.weixin.qq.com/document/path/90210 + /// 详情见: /// /// 创建标签请求参数 /// @@ -25,7 +25,7 @@ public interface IWeChatWorkTagProvider /// 更新标签名字 /// /// - /// 详情见:https://developer.work.weixin.qq.com/document/path/90211 + /// 详情见: /// /// 更新标签名字请求参数 /// @@ -37,7 +37,7 @@ public interface IWeChatWorkTagProvider /// 删除标签 /// /// - /// 详情见:https://developer.work.weixin.qq.com/document/path/90212 + /// 详情见: /// /// 删除标签请求参数 /// @@ -49,7 +49,7 @@ public interface IWeChatWorkTagProvider /// 获取标签成员 /// /// - /// 详情见:https://developer.work.weixin.qq.com/document/path/90213 + /// 详情见: /// /// 获取标签成员请求参数 /// @@ -61,7 +61,7 @@ public interface IWeChatWorkTagProvider /// 增加标签成员 /// /// - /// 详情见:https://developer.work.weixin.qq.com/document/path/90214 + /// 详情见: /// /// 增加标签成员请求参数 /// @@ -73,7 +73,7 @@ public interface IWeChatWorkTagProvider /// 删除标签成员 /// /// - /// 详情见:https://developer.work.weixin.qq.com/document/path/90214 + /// 详情见: /// /// 增加标签成员请求参数 /// @@ -85,7 +85,7 @@ public interface IWeChatWorkTagProvider /// 获取标签列表 /// /// - /// 详情见:https://developer.work.weixin.qq.com/document/path/90214 + /// 详情见: /// /// /// 获取标签列表响应参数 diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Models/TagInfo.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Models/TagInfo.cs similarity index 89% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Models/TagInfo.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Models/TagInfo.cs index 24cbeffb8..743f4e76c 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Models/TagInfo.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Models/TagInfo.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Tags.Models; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Tags.Models; /// /// 标签 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Models/TagUserInfo.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Models/TagUserInfo.cs similarity index 90% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Models/TagUserInfo.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Models/TagUserInfo.cs index 720ba0b1b..21c11ada2 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Models/TagUserInfo.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Models/TagUserInfo.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Tags.Models; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Tags.Models; /// /// 标签中包含的成员 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Request/WeChatWorkGetTagRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Request/WeChatWorkGetTagRequest.cs similarity index 89% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Request/WeChatWorkGetTagRequest.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Request/WeChatWorkGetTagRequest.cs index f1c4fb22a..0a53d46ff 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Request/WeChatWorkGetTagRequest.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Request/WeChatWorkGetTagRequest.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; using Volo.Abp; -namespace LINGYUN.Abp.WeChat.Work.Tags.Request; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Tags.Request; /// /// 获取标签请求参数 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Request/WeChatWorkTagChangeMemberRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Request/WeChatWorkTagChangeMemberRequest.cs similarity index 93% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Request/WeChatWorkTagChangeMemberRequest.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Request/WeChatWorkTagChangeMemberRequest.cs index bedfa721a..24c8cc67d 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Request/WeChatWorkTagChangeMemberRequest.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Request/WeChatWorkTagChangeMemberRequest.cs @@ -5,11 +5,11 @@ using System.Collections.Generic; using System.Text.Json.Serialization; using Volo.Abp; -namespace LINGYUN.Abp.WeChat.Work.Tags.Request; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Tags.Request; /// /// 标签成员变更请求参数 /// -public class WeChatWorkTagChangeMemberRequest +public class WeChatWorkTagChangeMemberRequest : WeChatWorkRequest { /// /// 标签id,非负整型,指定此参数时新增的标签会生成对应的标签id,不指定时则以目前最大的id自增。 diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Request/WeChatWorkTagCreateRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Request/WeChatWorkTagCreateRequest.cs similarity index 89% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Request/WeChatWorkTagCreateRequest.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Request/WeChatWorkTagCreateRequest.cs index 27a6d6dcd..14f98034e 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Request/WeChatWorkTagCreateRequest.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Request/WeChatWorkTagCreateRequest.cs @@ -4,11 +4,11 @@ using System.ComponentModel.DataAnnotations; using System.Text.Json.Serialization; using Volo.Abp; -namespace LINGYUN.Abp.WeChat.Work.Tags.Request; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Tags.Request; /// /// 创建标签请求参数 /// -public class WeChatWorkTagCreateRequest +public class WeChatWorkTagCreateRequest : WeChatWorkRequest { /// /// 标签id,非负整型,指定此参数时新增的标签会生成对应的标签id,不指定时则以目前最大的id自增。 diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Request/WeChatWorkTagUpdateRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Request/WeChatWorkTagUpdateRequest.cs similarity index 89% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Request/WeChatWorkTagUpdateRequest.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Request/WeChatWorkTagUpdateRequest.cs index 902d70e4b..a2f095b05 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Request/WeChatWorkTagUpdateRequest.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Request/WeChatWorkTagUpdateRequest.cs @@ -4,11 +4,11 @@ using System.ComponentModel.DataAnnotations; using System.Text.Json.Serialization; using Volo.Abp; -namespace LINGYUN.Abp.WeChat.Work.Tags.Request; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Tags.Request; /// /// 更新标签请求参数 /// -public class WeChatWorkTagUpdateRequest +public class WeChatWorkTagUpdateRequest : WeChatWorkRequest { /// /// 标签id,非负整型,指定此参数时新增的标签会生成对应的标签id,不指定时则以目前最大的id自增。 diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Response/WeChatWorkTagChangeMemberResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Response/WeChatWorkTagChangeMemberResponse.cs similarity index 82% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Response/WeChatWorkTagChangeMemberResponse.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Response/WeChatWorkTagChangeMemberResponse.cs index d0e6cd002..50623e229 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Response/WeChatWorkTagChangeMemberResponse.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Response/WeChatWorkTagChangeMemberResponse.cs @@ -1,9 +1,8 @@ using JetBrains.Annotations; using Newtonsoft.Json; -using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Tags.Response; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Tags.Response; /// /// 标签成员变更响应参数 /// @@ -22,5 +21,5 @@ public class WeChatWorkTagChangeMemberResponse : WeChatWorkResponse [CanBeNull] [JsonProperty("invalidparty")] [JsonPropertyName("invalidparty")] - public List InvalidPart { get; set; } + public int[]? InvalidPart { get; set; } } diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Response/WeChatWorkTagCreateResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Response/WeChatWorkTagCreateResponse.cs similarity index 89% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Response/WeChatWorkTagCreateResponse.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Response/WeChatWorkTagCreateResponse.cs index 8020606c2..a59695512 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Response/WeChatWorkTagCreateResponse.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Response/WeChatWorkTagCreateResponse.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Tags.Response; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Tags.Response; /// /// 创建标签响应参数 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Response/WeChatWorkTagListResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Response/WeChatWorkTagListResponse.cs similarity index 72% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Response/WeChatWorkTagListResponse.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Response/WeChatWorkTagListResponse.cs index ed905495d..40a3753aa 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Response/WeChatWorkTagListResponse.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Response/WeChatWorkTagListResponse.cs @@ -1,10 +1,9 @@ using JetBrains.Annotations; -using LINGYUN.Abp.WeChat.Work.Tags.Models; +using LINGYUN.Abp.WeChat.Work.Contacts.Tags.Models; using Newtonsoft.Json; -using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Tags.Response; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Tags.Response; /// /// 获取标签列表响应参数 /// @@ -19,5 +18,5 @@ public class WeChatWorkTagListResponse : WeChatWorkResponse [NotNull] [JsonProperty("taglist")] [JsonPropertyName("taglist")] - public List Tags { get; set; } + public TagInfo[] Tags { get; set; } } \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Response/WeChatWorkTagMemberInfoResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Response/WeChatWorkTagMemberInfoResponse.cs similarity index 78% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Response/WeChatWorkTagMemberInfoResponse.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Response/WeChatWorkTagMemberInfoResponse.cs index fce599a69..349c0b592 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/Response/WeChatWorkTagMemberInfoResponse.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/Response/WeChatWorkTagMemberInfoResponse.cs @@ -1,10 +1,9 @@ using JetBrains.Annotations; -using LINGYUN.Abp.WeChat.Work.Tags.Models; +using LINGYUN.Abp.WeChat.Work.Contacts.Tags.Models; using Newtonsoft.Json; -using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Tags.Response; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Tags.Response; /// /// 标签成员响应参数 /// @@ -26,12 +25,12 @@ public class WeChatWorkTagMemberInfoResponse : WeChatWorkResponse [NotNull] [JsonProperty("userlist")] [JsonPropertyName("userlist")] - public List Users { get; set; } + public TagUserInfo[] Users { get; set; } /// /// 标签中包含的部门id列表 /// [NotNull] [JsonProperty("partylist")] [JsonPropertyName("partylist")] - public List Parts { get; set; } + public int[] Parts { get; set; } } diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/WeChatWorkTagProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/WeChatWorkTagProvider.cs similarity index 52% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/WeChatWorkTagProvider.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/WeChatWorkTagProvider.cs index 3eb40560a..cbe5eb217 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Tags/WeChatWorkTagProvider.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Tags/WeChatWorkTagProvider.cs @@ -1,16 +1,18 @@ -using LINGYUN.Abp.WeChat.Work.Features; -using LINGYUN.Abp.WeChat.Work.Tags.Request; -using LINGYUN.Abp.WeChat.Work.Tags.Response; +using LINGYUN.Abp.WeChat.Work.Contacts.Features; +using LINGYUN.Abp.WeChat.Work.Contacts.Tags.Request; +using LINGYUN.Abp.WeChat.Work.Contacts.Tags.Response; using LINGYUN.Abp.WeChat.Work.Token; +using Microsoft.Extensions.DependencyInjection; using System.Net.Http; using System.Threading; using System.Threading.Tasks; +using Volo.Abp; using Volo.Abp.DependencyInjection; using Volo.Abp.Features; -namespace LINGYUN.Abp.WeChat.Work.Tags; +namespace LINGYUN.Abp.WeChat.Work.Contacts.Tags; -[RequiresFeature(WeChatWorkFeatureNames.Enable)] +[RequiresFeature(WeChatWorkContactsFeatureNames.Enable)] public class WeChatWorkTagProvider : IWeChatWorkTagProvider, ISingletonDependency { protected IHttpClientFactory HttpClientFactory { get; } @@ -26,64 +28,69 @@ public class WeChatWorkTagProvider : IWeChatWorkTagProvider, ISingletonDependenc public async virtual Task AddMemberAsync(WeChatWorkTagChangeMemberRequest request, CancellationToken cancellationToken = default) { + Check.NotNull(request, nameof(request)); + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); - var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); - using var response = await client.AddTagMemberAsync(token.AccessToken, request, cancellationToken); - return await response.DeserializeObjectAsync(); + return await client.AddTagMemberAsync(token.AccessToken, request, cancellationToken); } public async virtual Task CreateAsync(WeChatWorkTagCreateRequest request, CancellationToken cancellationToken = default) { + Check.NotNull(request, nameof(request)); + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); - var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); - using var response = await client.CreateTagAsync(token.AccessToken, request, cancellationToken); - return await response.DeserializeObjectAsync(); + return await client.CreateTagAsync(token.AccessToken, request, cancellationToken); } public async virtual Task DeleteAsync(WeChatWorkGetTagRequest request, CancellationToken cancellationToken = default) { + Check.NotNull(request, nameof(request)); + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); - var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); - using var response = await client.DeleteTagAsync(token.AccessToken, request, cancellationToken); - return await response.DeserializeObjectAsync(); + return await client.DeleteTagAsync(token.AccessToken, request, cancellationToken); } public async virtual Task DeleteMemberAsync(WeChatWorkTagChangeMemberRequest request, CancellationToken cancellationToken = default) { + Check.NotNull(request, nameof(request)); + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); - var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); - using var response = await client.DeleteTagMemberAsync(token.AccessToken, request, cancellationToken); - return await response.DeserializeObjectAsync(); + return await client.DeleteTagMemberAsync(token.AccessToken, request, cancellationToken); } public async virtual Task GetListAsync(CancellationToken cancellationToken = default) { var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); - var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); - using var response = await client.GetTagListAsync(token.AccessToken, cancellationToken); - return await response.DeserializeObjectAsync(); + return await client.GetTagListAsync(token.AccessToken, cancellationToken); } public async virtual Task GetMemberAsync(WeChatWorkGetTagRequest request, CancellationToken cancellationToken = default) { + Check.NotNull(request, nameof(request)); + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); - var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); - using var response = await client.GetTagMemberAsync(token.AccessToken, request, cancellationToken); - return await response.DeserializeObjectAsync(); + return await client.GetTagMemberAsync(token.AccessToken, request, cancellationToken); } public async virtual Task UpdateAsync(WeChatWorkTagUpdateRequest request, CancellationToken cancellationToken = default) { + Check.NotNull(request, nameof(request)); + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); - var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); - using var response = await client.UpdateTagAsync(token.AccessToken, request, cancellationToken); - return await response.DeserializeObjectAsync(); + return await client.UpdateTagAsync(token.AccessToken, request, cancellationToken); } } diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Token/IWeChatWorkContactTokenProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Token/IWeChatWorkContactTokenProvider.cs new file mode 100644 index 000000000..0f749613e --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Token/IWeChatWorkContactTokenProvider.cs @@ -0,0 +1,23 @@ +using LINGYUN.Abp.WeChat.Work.Token.Models; +using System.Threading; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Token; +/// +/// 通讯录应用Token提供者 +/// +/// +/// 企业微信部分接口需要使用通讯录应用Token +/// +public interface IWeChatWorkContactTokenProvider +{ + /// + /// 获取通讯录应用Token + /// + /// + /// 参考:https://developer.work.weixin.qq.com/document/path/91039 + /// + /// + /// + Task GetTokenAsync(CancellationToken cancellationToken = default); +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Token/WeChatWorkContactTokenProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Token/WeChatWorkContactTokenProvider.cs new file mode 100644 index 000000000..91063f34a --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/LINGYUN/Abp/WeChat/Work/Contacts/Token/WeChatWorkContactTokenProvider.cs @@ -0,0 +1,140 @@ +using LINGYUN.Abp.WeChat.Work.Contacts.Features; +using LINGYUN.Abp.WeChat.Work.Contacts.Settings; +using LINGYUN.Abp.WeChat.Work.Settings; +using LINGYUN.Abp.WeChat.Work.Token.Models; +using Microsoft.Extensions.Caching.Distributed; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using System; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Caching; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Features; +using Volo.Abp.Settings; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Token; + +[RequiresFeature(WeChatWorkContactsFeatureNames.Enable)] +public class WeChatWorkContactTokenProvider : IWeChatWorkContactTokenProvider, ISingletonDependency +{ + public ILogger Logger { get; set; } + protected ISettingProvider SettingProvider { get; } + protected IHttpClientFactory HttpClientFactory { get; } + protected IDistributedCache WeChatWorkTokenCache { get; } + public WeChatWorkContactTokenProvider( + ISettingProvider settingProvider, + IHttpClientFactory httpClientFactory, + IDistributedCache cache) + { + HttpClientFactory = httpClientFactory; + SettingProvider = settingProvider; + WeChatWorkTokenCache = cache; + + Logger = NullLogger.Instance; + } + + public async virtual Task GetTokenAsync(CancellationToken cancellationToken = default) + { + var corpId = await SettingProvider.GetOrNullAsync(WeChatWorkSettingNames.Connection.CorpId); + var agentId = await SettingProvider.GetOrNullAsync(WeChatWorkSettingNames.Connection.AgentId); + var secret = await SettingProvider.GetOrNullAsync(WeChatWorkContactSettingNames.Secret); + + Check.NotNullOrWhiteSpace(corpId, nameof(corpId)); + Check.NotNullOrWhiteSpace(agentId, nameof(agentId)); + Check.NotNullOrWhiteSpace(secret, nameof(secret)); + + return await GetTokenAsync(corpId, agentId, secret, cancellationToken); + } + + public async virtual Task GetTokenAsync( + string corpId, + string agentId, + string secret, + CancellationToken cancellationToken = default) + { + return (await GetCacheItemAsync("WeChatWorkContactToken", corpId, agentId, secret, cancellationToken)).Token; + } + /// + /// 获取缓存中的Token配置 + /// + /// + /// + /// + /// + /// + /// + protected async virtual Task GetCacheItemAsync( + string provider, + string corpId, + string agentId, + string secret, + CancellationToken cancellationToken = default) + { + Check.NotNullOrEmpty(corpId, nameof(corpId)); + Check.NotNullOrEmpty(agentId, nameof(agentId)); + Check.NotNullOrEmpty(secret, nameof(secret)); + + var cacheKey = WeChatWorkTokenCacheItem.CalculateCacheKey(provider, corpId, agentId); + + return await GetCacheItemAsync(cacheKey, provider, corpId, agentId, secret); + } + /// + /// 获取或刷新分布式缓存中的Token配置 + /// + /// + /// + /// + /// + /// + /// + /// + protected async virtual Task GetCacheItemAsync( + string cacheKey, + string provider, + string corpId, + string agentId, + string secret, + CancellationToken cancellationToken = default) + { + var cacheItem = await WeChatWorkTokenCache.GetAsync(cacheKey, token: cancellationToken); + + if (cacheItem != null) + { + Logger.LogDebug($"Found WeChatWorkContactToken in the cache: {cacheKey}"); + return cacheItem; + } + + Logger.LogDebug($"Not found WeChatWorkContactToken in the cache, getting from the httpClient: {cacheKey}"); + + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + var request = new WeChatWorkTokenRequest + { + CorpId = corpId, + CorpSecret = secret, + }; + + using var response = await client.GetTokenAsync(request, cancellationToken); + var tokenResponse = await response.DeserializeObjectAsync(); + var token = tokenResponse.ToWeChatWorkToken(); + cacheItem = new WeChatWorkTokenCacheItem(corpId, agentId, token); + + Logger.LogDebug($"Setting the cache item: {cacheKey}"); + + var cacheOptions = new DistributedCacheEntryOptions + { + // 设置绝对过期时间为Token有效期剩余的二分钟 + AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(token.ExpiresIn - 100), + }; + + await WeChatWorkTokenCache.SetAsync(cacheKey, cacheItem, cacheOptions, token: cancellationToken); + + Logger.LogDebug($"Finished setting the cache item: {cacheKey}"); + + return cacheItem; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/README.md b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/README.md new file mode 100644 index 000000000..be7366720 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/README.md @@ -0,0 +1,37 @@ +# LINGYUN.Abp.WeChat.Work.Contacts + +企业微信通讯录模块,提供企业微信应用开发的通讯录功能实现。 + +## 功能特性 + + +## 模块引用 + +```csharp +[DependsOn(typeof(AbpWeChatWorkContactModule))] +public class YouProjectModule : AbpModule +{ + // other +} +``` + +## 配置项 + + +## 消息处理 + + +## 事件处理 + +* [新增成员事件](https://developer.work.weixin.qq.com/document/path/90970#%E6%96%B0%E5%A2%9E%E6%88%90%E5%91%98%E4%BA%8B%E4%BB%B6) +* [更新成员事件](https://developer.work.weixin.qq.com/document/path/90970#%E6%9B%B4%E6%96%B0%E6%88%90%E5%91%98%E4%BA%8B%E4%BB%B6) +* [删除成员事件](https://developer.work.weixin.qq.com/document/path/90970#%E5%88%A0%E9%99%A4%E6%88%90%E5%91%98%E4%BA%8B%E4%BB%B6) +* [新增部门事件](https://developer.work.weixin.qq.com/document/path/90971#%E6%96%B0%E5%A2%9E%E9%83%A8%E9%97%A8%E4%BA%8B%E4%BB%B6) +* [更新部门事件](https://developer.work.weixin.qq.com/document/path/90971#%E6%9B%B4%E6%96%B0%E9%83%A8%E9%97%A8%E4%BA%8B%E4%BB%B6) +* [删除部门事件](https://developer.work.weixin.qq.com/document/path/90971#%E5%88%A0%E9%99%A4%E9%83%A8%E9%97%A8%E4%BA%8B%E4%BB%B6) +* [标签成员变更事件](https://developer.work.weixin.qq.com/document/path/90972) +* [异步任务完成通知](https://developer.work.weixin.qq.com/document/path/90973) + +## 更多文档 + +* [企业微信通讯录文档](https://developer.work.weixin.qq.com/document/path/90193) diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Departments.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Departments.cs new file mode 100644 index 000000000..a012c3824 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Departments.cs @@ -0,0 +1,141 @@ +using LINGYUN.Abp.WeChat.Work; +using LINGYUN.Abp.WeChat.Work.Contacts.Departments.Request; +using LINGYUN.Abp.WeChat.Work.Contacts.Departments.Response; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace System.Net.Http; + +internal static partial class HttpClientWeChatWorkRequestExtensions +{ + public async static Task GetDepartmentListAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkGetDepartmentListRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/department/list"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + if (request.Id.HasValue) + { + urlBuilder.AppendFormat("&id={0}", request.Id.Value); + } + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Get, + urlBuilder.ToString()); + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task GetSubDepartmentListAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkGetSubDepartmentListRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/department/simplelist"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + if (request.Id.HasValue) + { + urlBuilder.AppendFormat("&id={0}", request.Id.Value); + } + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Get, + urlBuilder.ToString()); + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task GetDepartmentAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkGetDepartmentRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/department/get"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + urlBuilder.AppendFormat("&id={0}", request.Id); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Get, + urlBuilder.ToString()); + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task CreateDepartmentAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkCreateDepartmentRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/department/create"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()), + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task UpdateDepartmentAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkUpdateDepartmentRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/department/update"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()), + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task DeleteDepartmentAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkDeleteDepartmentRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/department/delete"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + urlBuilder.AppendFormat("&id={0}", request.Id); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Get, + urlBuilder.ToString()); + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Members.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Members.cs new file mode 100644 index 000000000..c2a94d884 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Members.cs @@ -0,0 +1,329 @@ +using LINGYUN.Abp.WeChat.Work; +using LINGYUN.Abp.WeChat.Work.Contacts.Members.Models; +using LINGYUN.Abp.WeChat.Work.Contacts.Members.Request; +using LINGYUN.Abp.WeChat.Work.Contacts.Members.Response; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace System.Net.Http; +internal static partial class HttpClientWeChatWorkRequestExtensions +{ + public async static Task GetMemberAsync( + this HttpMessageInvoker client, + string accessToken, + string userId, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/user/get"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + urlBuilder.AppendFormat("&userid={0}", userId); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Get, + urlBuilder.ToString()); + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task CreateMemberAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkCreateMemberRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/user/create"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()), + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task UpdateMemberAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkUpdateMemberRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/user/update"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()), + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task DeleteMemberAsync( + this HttpMessageInvoker client, + string accessToken, + string userId, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/user/delete"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + urlBuilder.AppendFormat("&userid={0}", userId); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Get, + urlBuilder.ToString()); + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task BulkDeleteMemberAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkBulkDeleteMemberRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/user/batchdelete"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()), + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task GetSimpleMemberListAsync( + this HttpMessageInvoker client, + string accessToken, + int departmentId, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/user/simplelist"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + urlBuilder.AppendFormat("&department_id={0}", departmentId); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Get, + urlBuilder.ToString()); + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task GetMemberListAsync( + this HttpMessageInvoker client, + string accessToken, + int departmentId, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/user/list"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + urlBuilder.AppendFormat("&department_id={0}", departmentId); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Get, + urlBuilder.ToString()); + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task ConvertToOpenIdAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkConvertToOpenIdRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/user/convert_to_openid"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()), + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task ConvertToUserIdAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkConvertToUserIdRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/user/convert_to_userid"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()), + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task AuthSuccessAsync( + this HttpMessageInvoker client, + string accessToken, + string userId, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/user/authsucc"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + urlBuilder.AppendFormat("&userid={0}", userId); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Get, + urlBuilder.ToString()); + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task BulkInviteMemberAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkBulkInviteMemberRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/batch/invite"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()), + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task GetJoinQrCodeAsync( + this HttpMessageInvoker client, + string accessToken, + QrCodeSizeType sizeType, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/corp/get_join_qrcode"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + urlBuilder.AppendFormat("&size_type={0}", (int)sizeType); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Get, + urlBuilder.ToString()); + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task GetUserIdByMobileAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkGetUserIdByMobileRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/user/getuserid"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()), + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task GetUserIdByEmailAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkGetUserIdByEmailRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/user/get_userid_by_email"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()), + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task GetUserIdListAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkGetUserIdListRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/user/list_id"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()), + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Tag.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Tags.cs similarity index 59% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Tag.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Tags.cs index e9162de12..9114230d5 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Tag.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Tags.cs @@ -1,12 +1,15 @@ -using LINGYUN.Abp.WeChat.Work.Tags.Request; +using LINGYUN.Abp.WeChat.Work; +using LINGYUN.Abp.WeChat.Work.Contacts.Tags.Request; +using LINGYUN.Abp.WeChat.Work.Contacts.Tags.Response; using System.Text; using System.Threading; using System.Threading.Tasks; namespace System.Net.Http; + internal static partial class HttpClientWeChatWorkRequestExtensions { - public async static Task AddTagMemberAsync( + public async static Task AddTagMemberAsync( this HttpMessageInvoker client, string accessToken, WeChatWorkTagChangeMemberRequest request, @@ -16,16 +19,18 @@ internal static partial class HttpClientWeChatWorkRequestExtensions urlBuilder.Append("/cgi-bin/tag/addtagusers"); urlBuilder.AppendFormat("?access_token={0}", accessToken); - var httpRequest = new HttpRequestMessage( + using var httpRequest = new HttpRequestMessage( HttpMethod.Post, urlBuilder.ToString()) { Content = new StringContent(request.SerializeToJson()) }; - return await client.SendAsync(httpRequest, cancellationToken); + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); } - public async static Task CreateTagAsync( + public async static Task CreateTagAsync( this HttpMessageInvoker client, string accessToken, WeChatWorkTagCreateRequest request, @@ -35,16 +40,18 @@ internal static partial class HttpClientWeChatWorkRequestExtensions urlBuilder.Append("/cgi-bin/tag/create"); urlBuilder.AppendFormat("?access_token={0}", accessToken); - var httpRequest = new HttpRequestMessage( + using var httpRequest = new HttpRequestMessage( HttpMethod.Post, urlBuilder.ToString()) { Content = new StringContent(request.SerializeToJson()) }; - return await client.SendAsync(httpRequest, cancellationToken); + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); } - public async static Task DeleteTagAsync( + public async static Task DeleteTagAsync( this HttpMessageInvoker client, string accessToken, WeChatWorkGetTagRequest request, @@ -55,13 +62,15 @@ internal static partial class HttpClientWeChatWorkRequestExtensions urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("&tagid={0}", request.TagId); - var httpRequest = new HttpRequestMessage( + using var httpRequest = new HttpRequestMessage( HttpMethod.Get, urlBuilder.ToString()); - return await client.SendAsync(httpRequest, cancellationToken); + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); } - public async static Task DeleteTagMemberAsync( + public async static Task DeleteTagMemberAsync( this HttpMessageInvoker client, string accessToken, WeChatWorkTagChangeMemberRequest request, @@ -71,16 +80,18 @@ internal static partial class HttpClientWeChatWorkRequestExtensions urlBuilder.Append("/cgi-bin/tag/deltagusers"); urlBuilder.AppendFormat("?access_token={0}", accessToken); - var httpRequest = new HttpRequestMessage( + using var httpRequest = new HttpRequestMessage( HttpMethod.Post, urlBuilder.ToString()) { Content = new StringContent(request.SerializeToJson()) }; - return await client.SendAsync(httpRequest, cancellationToken); + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); } - public async static Task GetTagListAsync( + public async static Task GetTagListAsync( this HttpMessageInvoker client, string accessToken, CancellationToken cancellationToken = default) @@ -89,13 +100,15 @@ internal static partial class HttpClientWeChatWorkRequestExtensions urlBuilder.Append("/cgi-bin/tag/list"); urlBuilder.AppendFormat("?access_token={0}", accessToken); - var httpRequest = new HttpRequestMessage( + using var httpRequest = new HttpRequestMessage( HttpMethod.Get, urlBuilder.ToString()); - return await client.SendAsync(httpRequest, cancellationToken); + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); } - public async static Task GetTagMemberAsync( + public async static Task GetTagMemberAsync( this HttpMessageInvoker client, string accessToken, WeChatWorkGetTagRequest request, @@ -106,13 +119,15 @@ internal static partial class HttpClientWeChatWorkRequestExtensions urlBuilder.AppendFormat("?access_token={0}", accessToken); urlBuilder.AppendFormat("&tagid={0}", request.TagId); - var httpRequest = new HttpRequestMessage( + using var httpRequest = new HttpRequestMessage( HttpMethod.Get, urlBuilder.ToString()); - return await client.SendAsync(httpRequest, cancellationToken); + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); } - public async static Task UpdateTagAsync( + public async static Task UpdateTagAsync( this HttpMessageInvoker client, string accessToken, WeChatWorkTagUpdateRequest request, @@ -122,13 +137,15 @@ internal static partial class HttpClientWeChatWorkRequestExtensions urlBuilder.Append("/cgi-bin/tag/update"); urlBuilder.AppendFormat("?access_token={0}", accessToken); - var httpRequest = new HttpRequestMessage( + using var httpRequest = new HttpRequestMessage( HttpMethod.Post, urlBuilder.ToString()) { Content = new StringContent(request.SerializeToJson()) }; - return await client.SendAsync(httpRequest, cancellationToken); + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); } } diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpClientWeChatWorkRequestExtensions.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpClientWeChatWorkRequestExtensions.cs new file mode 100644 index 000000000..971f2fe83 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpClientWeChatWorkRequestExtensions.cs @@ -0,0 +1,21 @@ +using LINGYUN.Abp.WeChat.Work.Token.Models; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace System.Net.Http; + +internal static partial class HttpClientWeChatWorkRequestExtensions +{ + public async static Task GetTokenAsync(this HttpMessageInvoker client, WeChatWorkTokenRequest request, CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/gettoken"); + urlBuilder.AppendFormat("?corpid={0}", request.CorpId); + urlBuilder.AppendFormat("&corpsecret={0}", request.CorpSecret); + + var httpRequest = new HttpRequestMessage(HttpMethod.Get, urlBuilder.ToString()); + + return await client.SendAsync(httpRequest, cancellationToken); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpResponseDeserializeExtensions.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpResponseDeserializeExtensions.cs new file mode 100644 index 000000000..f3abd415d --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Contacts/System/Net/Http/HttpResponseDeserializeExtensions.cs @@ -0,0 +1,19 @@ +using LINGYUN.Abp.WeChat.Work; +using Newtonsoft.Json; +using System.Threading.Tasks; +using Volo.Abp.Http.Client; + +namespace System.Net.Http; +internal static class HttpResponseDeserializeExtensions +{ + public async static Task DeserializeObjectAsync(this HttpResponseMessage response) where T : WeChatWorkResponse + { + if (!response.IsSuccessStatusCode) + { + throw new AbpRemoteCallException($"Wechat work request error: {response.StatusCode} - {response.ReasonPhrase}"); + } + var responseContent = await response.Content.ReadAsStringAsync(); + + return JsonConvert.DeserializeObject(responseContent)!; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/AbpWeChatWorkExternalContactModule.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/AbpWeChatWorkExternalContactModule.cs index dd18a596b..39bee84b4 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/AbpWeChatWorkExternalContactModule.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/AbpWeChatWorkExternalContactModule.cs @@ -7,7 +7,9 @@ using Volo.Abp.Localization; using Volo.Abp.Modularity; namespace LINGYUN.Abp.WeChat.Work.ExternalContact; - +/// +/// 企业微信客户联系模块 +/// [DependsOn(typeof(AbpWeChatWorkModule))] public class AbpWeChatWorkExternalContactModule : AbpModule { diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Customers/Models/ExternalContactInfo.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Customers/Models/ExternalContactInfo.cs index cf26d5659..0829e15f5 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Customers/Models/ExternalContactInfo.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.ExternalContact/LINGYUN/Abp/WeChat/Work/ExternalContact/Customers/Models/ExternalContactInfo.cs @@ -1,5 +1,5 @@ using JetBrains.Annotations; -using LINGYUN.Abp.WeChat.Work.ExternalContact.Models; +using LINGYUN.Abp.WeChat.Work.Common.Members.Models; using Newtonsoft.Json; using System.Text.Json.Serialization; diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Handlers/LINGYUN.Abp.WeChat.Work.Handlers.csproj b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Handlers/LINGYUN.Abp.WeChat.Work.Handlers.csproj index be49a7d1f..503a9ec74 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Handlers/LINGYUN.Abp.WeChat.Work.Handlers.csproj +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Handlers/LINGYUN.Abp.WeChat.Work.Handlers.csproj @@ -15,6 +15,7 @@ + diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Handlers/LINGYUN/Abp/WeChat/Work/Handlers/AbpWeChatWorkHandlersModule.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Handlers/LINGYUN/Abp/WeChat/Work/Handlers/AbpWeChatWorkHandlersModule.cs index 94ed6f08d..2b60e2270 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Handlers/LINGYUN/Abp/WeChat/Work/Handlers/AbpWeChatWorkHandlersModule.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Handlers/LINGYUN/Abp/WeChat/Work/Handlers/AbpWeChatWorkHandlersModule.cs @@ -1,4 +1,5 @@ using LINGYUN.Abp.WeChat.Work.Common; +using LINGYUN.Abp.WeChat.Work.Contacts; using Volo.Abp.EventBus; using Volo.Abp.Modularity; @@ -6,6 +7,7 @@ namespace LINGYUN.Abp.WeChat.Work.Handlers; [DependsOn(typeof(AbpEventBusModule))] [DependsOn(typeof(AbpWeChatWorkCommonModule))] +[DependsOn(typeof(AbpWeChatWorkContactModule))] public class AbpWeChatWorkHandlersModule : AbpModule { } diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Handlers/LINGYUN/Abp/WeChat/Work/Handlers/Messages/WeChatWorkEventEventHandler.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Handlers/LINGYUN/Abp/WeChat/Work/Handlers/Messages/WeChatWorkEventEventHandler.cs index 3c078f657..87905b387 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Handlers/LINGYUN/Abp/WeChat/Work/Handlers/Messages/WeChatWorkEventEventHandler.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Handlers/LINGYUN/Abp/WeChat/Work/Handlers/Messages/WeChatWorkEventEventHandler.cs @@ -1,6 +1,7 @@ using LINGYUN.Abp.WeChat.Common.Messages.Handlers; using LINGYUN.Abp.WeChat.Work.Common.Messages; using LINGYUN.Abp.WeChat.Work.Common.Messages.Models; +using LINGYUN.Abp.WeChat.Work.Contacts.Messages.Models; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; using Volo.Abp.EventBus.Distributed; diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/FodyWeavers.xml b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/FodyWeavers.xml new file mode 100644 index 000000000..1715698cc --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/FodyWeavers.xsd b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN.Abp.WeChat.Work.OA.csproj b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN.Abp.WeChat.Work.OA.csproj new file mode 100644 index 000000000..583b07cf9 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN.Abp.WeChat.Work.OA.csproj @@ -0,0 +1,27 @@ + + + + + + + netstandard2.0;netstandard2.1;net8.0;net9.0 + LINGYUN.Abp.WeChat.Work.OA + LINGYUN.Abp.WeChat.Work.OA + false + false + false + True + enable + + + + + + + + + + + + + diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/AbpWeChatWorkOAModule.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/AbpWeChatWorkOAModule.cs new file mode 100644 index 000000000..32f979f33 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/AbpWeChatWorkOAModule.cs @@ -0,0 +1,36 @@ +using LINGYUN.Abp.WeChat.Common.Messages; +using LINGYUN.Abp.WeChat.Work.Common.Messages; +using LINGYUN.Abp.WeChat.Work.Localization; +using LINGYUN.Abp.WeChat.Work.OA.Messages.Models; +using Volo.Abp.Localization; +using Volo.Abp.Modularity; + +namespace LINGYUN.Abp.WeChat.Work.OA; +/// +/// 企业微信办公模块 +/// +[DependsOn(typeof(AbpWeChatWorkModule))] +public class AbpWeChatWorkOAModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.MapEvent("book_meeting_room", context => context.GetWeChatMessage()); + options.MapEvent("cancel_meeting_room", context => context.GetWeChatMessage()); + + options.MapEvent("delete_calendar", context => context.GetWeChatMessage()); + options.MapEvent("modify_calendar", context => context.GetWeChatMessage()); + options.MapEvent("delete_schedule", context => context.GetWeChatMessage()); + options.MapEvent("modify_schedule", context => context.GetWeChatMessage()); + options.MapEvent("respond_schedule", context => context.GetWeChatMessage()); + }); + + Configure(options => + { + options.Resources + .Get() + .AddVirtualJson("/LINGYUN/Abp/WeChat/Work/OA/Localization/Resources"); + }); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/IWeChatWorkApprovalTemplateProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/IWeChatWorkApprovalTemplateProvider.cs similarity index 93% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/IWeChatWorkApprovalTemplateProvider.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/IWeChatWorkApprovalTemplateProvider.cs index f9af22a59..0565a1570 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/IWeChatWorkApprovalTemplateProvider.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/IWeChatWorkApprovalTemplateProvider.cs @@ -1,10 +1,9 @@ -using LINGYUN.Abp.WeChat.Work.Approvals.Request; -using LINGYUN.Abp.WeChat.Work.Approvals.Response; +using LINGYUN.Abp.WeChat.Work.OA.Approvals.Request; +using LINGYUN.Abp.WeChat.Work.OA.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 +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals; /// /// 审批模板接口 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalApplyData.cs similarity index 92% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyData.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalApplyData.cs index 622947202..1adb320f5 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalApplyData.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 审批申请数据 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalApplyProcess.cs similarity index 91% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyProcess.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalApplyProcess.cs index 4877fdac9..a04abc150 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalApplyProcess.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 申请流程 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalApplyProcessNode.cs similarity index 97% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyProcessNode.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalApplyProcessNode.cs index 3bc9b6201..ed04f5a00 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalApplyProcessNode.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 申请流程节点 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalApplyer.cs similarity index 87% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyer.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalApplyer.cs index 446985def..16fccf692 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalApplyer.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 申请人信息 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalApproverAttr.cs similarity index 85% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApproverAttr.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalApproverAttr.cs index b72a1821c..5f588a4c0 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalApproverAttr.cs @@ -1,6 +1,6 @@ using System.ComponentModel; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 节点审批方式 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalComment.cs similarity index 95% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalComment.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalComment.cs index cebab51ca..9baf9196f 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalComment.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 审批申请备注信息 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalControlData.cs similarity index 97% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalControlData.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalControlData.cs index c98e6d9bb..48cd72b69 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalControlData.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 审批申请单控件数据 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalControlValue.cs similarity index 97% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalControlValue.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalControlValue.cs index f82d35684..9add46e96 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalControlValue.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 审批申请单数据 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalData.cs similarity index 92% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalData.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalData.cs index baf466a4d..9cc249f2d 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalData.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 审批申请单数据 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalDetailInfo.cs similarity index 98% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalDetailInfo.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalDetailInfo.cs index 71c747dd3..585979c18 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalDetailInfo.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 审批申请详情 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalInfoFilter.cs similarity index 96% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalInfoFilter.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalInfoFilter.cs index 47d6be320..8bd744eac 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalInfoFilter.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 筛选条件 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalProcess.cs similarity index 87% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcess.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalProcess.cs index 3c4554e23..d9754dfb0 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalProcess.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 流程 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalProcessNode.cs similarity index 95% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessNode.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalProcessNode.cs index 9135ed3a5..acba46fa8 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalProcessNode.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 流程节点 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalProcessNodeStatus.cs similarity index 95% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessNodeStatus.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalProcessNodeStatus.cs index dee8610f9..a4ab3133d 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalProcessNodeStatus.cs @@ -1,6 +1,6 @@ using System.ComponentModel; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 节点状态 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalProcessNodeType.cs similarity index 88% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessNodeType.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalProcessNodeType.cs index c1bfa0a0e..b181e357a 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalProcessNodeType.cs @@ -1,6 +1,6 @@ using System.ComponentModel; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 节点类型 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalProcessSubNode.cs similarity index 95% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessSubNode.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalProcessSubNode.cs index f4734e9ad..834daa229 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalProcessSubNode.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 子节点 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalSpRecord.cs similarity index 94% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpRecord.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalSpRecord.cs index 83ce480a2..8f7bede1b 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalSpRecord.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 审批流程信息 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalSpRecordDetail.cs similarity index 95% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpRecordDetail.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalSpRecordDetail.cs index ee2c44e17..9ad8e2d3c 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalSpRecordDetail.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 审批节点详情 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalSpRecordStatus.cs similarity index 94% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpRecordStatus.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalSpRecordStatus.cs index 2b0ab36c9..6f653c79e 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalSpRecordStatus.cs @@ -1,6 +1,6 @@ using System.ComponentModel; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 审批节点状态 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalSpStatus.cs similarity index 94% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpStatus.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalSpStatus.cs index fb7b02f8e..46354caee 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalSpStatus.cs @@ -1,6 +1,6 @@ using System.ComponentModel; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 申请单状态 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalSummary.cs similarity index 91% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSummary.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalSummary.cs index 56eaef46d..1306e82c9 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalSummary.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 摘要信息 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalSummaryInfo.cs similarity index 94% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSummaryInfo.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalSummaryInfo.cs index 4f31ad09e..6dca2bcf1 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalSummaryInfo.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.ComponentModel.DataAnnotations; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 摘要信息 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalUser.cs similarity index 86% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalUser.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalUser.cs index e7e97c6c0..6b7acb474 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ApprovalUser.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 审批节点关联人员 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/AttendanceControlConfig.cs similarity index 95% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/AttendanceControlConfig.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/AttendanceControlConfig.cs index 3c8997b90..b722885e7 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/AttendanceControlConfig.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 假勤组件-出差/外出/加班组件配置 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/AttendanceControlValue.cs similarity index 97% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/AttendanceControlValue.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/AttendanceControlValue.cs index 656c13f98..415104d53 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/AttendanceControlValue.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 假勤组件-出差/外出/加班组件值 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ContactControlConfig.cs similarity index 96% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ContactControlConfig.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ContactControlConfig.cs index 2c9ca393b..354c050cb 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ContactControlConfig.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 成员控件配置 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ContactControlValue.cs similarity index 66% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ContactControlValue.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ContactControlValue.cs index 27121ce3e..bfb6cb39f 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ContactControlValue.cs @@ -1,4 +1,4 @@ -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 成员/部门控件值 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/Control.cs similarity index 92% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/Control.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/Control.cs index 9df1dd23e..aa8b4666d 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/Control.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 模板控件 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlConfig.cs similarity index 59% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlConfig.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlConfig.cs index 83b0f6825..224ccc8de 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlConfig.cs @@ -1,4 +1,4 @@ -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 控件配置 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlConfigFactory.cs similarity index 97% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlConfigFactory.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlConfigFactory.cs index b97d2ff2e..e4c89f680 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlConfigFactory.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json.Linq; using System.Text.Json; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; internal static class ControlConfigFactory { /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlData.cs similarity index 99% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlData.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlData.cs index 2863784ae..008d0c527 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlData.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 审批申请详情 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlInfo.cs similarity index 98% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlInfo.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlInfo.cs index 425289a13..7282d95cf 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlInfo.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 模板控件属性 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlPlaceholder.cs similarity index 94% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlPlaceholder.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlPlaceholder.cs index 114fa2e93..d74560c22 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlPlaceholder.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.ComponentModel.DataAnnotations; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 控件说明 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlTtile.cs similarity index 94% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlTtile.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlTtile.cs index 7496de8e2..4afa9fdfc 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlTtile.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.ComponentModel.DataAnnotations; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 控件名称 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlValue.cs similarity index 58% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlValue.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlValue.cs index 832a206a7..3e8ad1b7d 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/ControlValue.cs @@ -1,4 +1,4 @@ -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 控件值 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/DateControlConfig.cs similarity index 93% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateControlConfig.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/DateControlConfig.cs index 7593456ba..26328b264 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/DateControlConfig.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 日期/日期+时间控件配置 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/DateControlValue.cs similarity index 96% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateControlValue.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/DateControlValue.cs index 143ac3a60..756a34edd 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/DateControlValue.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 日期/日期+时间控件值 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/DateRangeConfig.cs similarity index 95% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateRangeConfig.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/DateRangeConfig.cs index 6be00ef61..832400662 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/DateRangeConfig.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 时长配置 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/DateRangeControlConfig.cs similarity index 90% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateRangeControlConfig.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/DateRangeControlConfig.cs index 318c9ccd8..cbed0a935 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/DateRangeControlConfig.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 时长组件配置 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/DateRangeControlValue.cs similarity index 97% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateRangeControlValue.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/DateRangeControlValue.cs index 3816a71e3..63428b18a 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/DateRangeControlValue.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 时长控件值 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/DepartmentControlValue.cs similarity index 96% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DepartmentControlValue.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/DepartmentControlValue.cs index 268d0150d..083857aa0 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/DepartmentControlValue.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 部门控件值 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/FileControlConfig.cs similarity index 94% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/FileControlConfig.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/FileControlConfig.cs index bd6d082e4..587ba1fc7 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/FileControlConfig.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 附件控件配置 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/FileControlValue.cs similarity index 97% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/FileControlValue.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/FileControlValue.cs index ad5a31b95..2eae6e0cf 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/FileControlValue.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 附件控件值 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/FormulaControlValue.cs similarity index 93% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/FormulaControlValue.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/FormulaControlValue.cs index ca1be35eb..0f380b871 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/FormulaControlValue.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 公式控件值 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/LocationControlConfig.cs similarity index 94% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/LocationControlConfig.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/LocationControlConfig.cs index f1a0243d6..e3715c7b8 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/LocationControlConfig.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 位置控件配置 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/LocationControlValue.cs similarity index 96% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/LocationControlValue.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/LocationControlValue.cs index 9d8b18358..b53d31519 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/LocationControlValue.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 位置控件值 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/MemberControlValue.cs similarity index 96% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/MemberControlValue.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/MemberControlValue.cs index f87d7be49..8b7ac793e 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/MemberControlValue.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 成员控件值 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/MoneyControlValue.cs similarity index 91% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/MoneyControlValue.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/MoneyControlValue.cs index 57861c4db..b3b0636a4 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/MoneyControlValue.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 金额控件值 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/NumberControlValue.cs similarity index 91% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/NumberControlValue.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/NumberControlValue.cs index 41cb7e5d2..62c04f3a9 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/NumberControlValue.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 数字控件值 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/RelatedApprovalControlConfig.cs similarity index 95% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/RelatedApprovalControlConfig.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/RelatedApprovalControlConfig.cs index 4dcd885e4..652a31673 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/RelatedApprovalControlConfig.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 关联审批单控件配置 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/RelatedApprovalControlValue.cs similarity index 94% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/RelatedApprovalControlValue.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/RelatedApprovalControlValue.cs index 750060c67..81ead0067 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/RelatedApprovalControlValue.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 关联审批单控件值 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/SelectorControlConfig.cs similarity index 98% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/SelectorControlConfig.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/SelectorControlConfig.cs index 84ff4ff96..b0cee99c2 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/SelectorControlConfig.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 选择控件配置 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/SelectorControlValue.cs similarity index 98% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/SelectorControlValue.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/SelectorControlValue.cs index 59ed5c808..44c37ad30 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/SelectorControlValue.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 单选/多选控件值 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TableControlConfig.cs similarity index 95% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TableControlConfig.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TableControlConfig.cs index 2b6d4aebe..62e5ad24e 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TableControlConfig.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 明细控件配置 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TableControlValue.cs similarity index 95% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TableControlValue.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TableControlValue.cs index 8dac8ea13..9d558db26 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TableControlValue.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 明细控件值 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TemplateContent.cs similarity index 89% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TemplateContent.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TemplateContent.cs index 7bd41bad7..edcd717f5 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TemplateContent.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 模版控件定义 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TemplateName.cs similarity index 92% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TemplateName.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TemplateName.cs index fc81a46bb..474d42b3a 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TemplateName.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 模版名称定义 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TextControlValue.cs similarity index 91% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TextControlValue.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TextControlValue.cs index 7d79b16ca..9858dac31 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TextControlValue.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 文本控件值 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TextareaControlValue.cs similarity index 91% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TextareaControlValue.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TextareaControlValue.cs index bece9895a..221474f41 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TextareaControlValue.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 多行文本控件值 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TipsControlConfig.cs similarity index 98% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TipsControlConfig.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TipsControlConfig.cs index d88aa0cab..88904cd96 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/TipsControlConfig.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 说明文字控件配置 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/VacationControlValue.cs similarity index 98% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/VacationControlValue.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/VacationControlValue.cs index 17ccc373d..bff3ec282 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Models/VacationControlValue.cs @@ -3,7 +3,7 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; /// /// 假勤组件-请假组件值 /// 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkApplyEventRequest.cs similarity index 92% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkApplyEventRequest.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkApplyEventRequest.cs index cc3f921e2..3fcdcbdf8 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkApplyEventRequest.cs @@ -1,17 +1,17 @@ using JetBrains.Annotations; -using LINGYUN.Abp.WeChat.Work.Approvals.Models; +using LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Request; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Request; /// /// 提交审批申请请求参数 /// /// -/// 详情见: https://developer.work.weixin.qq.com/document/path/91853 +/// 详情见: /// -public class WeChatWorkApplyEventRequest +public class WeChatWorkApplyEventRequest : WeChatWorkRequest { /// /// 流程 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkCreateTemplateRequest.cs similarity index 78% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkCreateTemplateRequest.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkCreateTemplateRequest.cs index 6ae74ccd6..9e1d7ad49 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkCreateTemplateRequest.cs @@ -1,17 +1,17 @@ using JetBrains.Annotations; -using LINGYUN.Abp.WeChat.Work.Approvals.Models; +using LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Request; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Request; /// /// 创建审批模板请求参数 /// /// -/// 详情见: https://developer.work.weixin.qq.com/document/path/97437 +/// 详情见: /// -public class WeChatWorkCreateTemplateRequest +public class WeChatWorkCreateTemplateRequest : WeChatWorkRequest { /// /// 模版名称数组 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkGetApprovalDetailRequest.cs similarity index 68% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkGetApprovalDetailRequest.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkGetApprovalDetailRequest.cs index ae02b9035..8a05690d4 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkGetApprovalDetailRequest.cs @@ -2,14 +2,14 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Request; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Request; /// /// 获取审批申请详情请求参数 /// /// -/// 详情见: https://developer.work.weixin.qq.com/document/path/91983 +/// 详情见: /// -public class WeChatWorkGetApprovalDetailRequest +public class WeChatWorkGetApprovalDetailRequest : WeChatWorkRequest { /// /// 审批单编号 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkGetApprovalInfoRequest.cs similarity index 88% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkGetApprovalInfoRequest.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkGetApprovalInfoRequest.cs index fde25a87f..cd4770dc0 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkGetApprovalInfoRequest.cs @@ -1,18 +1,18 @@ using JetBrains.Annotations; -using LINGYUN.Abp.WeChat.Work.Approvals.Models; +using LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; using Volo.Abp; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Request; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Request; /// /// 批量获取审批单号请求参数 /// /// -/// 详情见: https://developer.work.weixin.qq.com/document/path/91816 +/// 详情见: /// -public class WeChatWorkGetApprovalInfoRequest +public class WeChatWorkGetApprovalInfoRequest : WeChatWorkRequest { /// /// 审批单提交的时间范围,开始时间,UNix时间戳 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkGetTemplateRequest.cs similarity index 70% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkGetTemplateRequest.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkGetTemplateRequest.cs index 03bd3b25b..518a8b771 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkGetTemplateRequest.cs @@ -2,14 +2,14 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Request; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Request; /// /// 获取审批模板请求参数 /// /// -/// 详情见: https://developer.work.weixin.qq.com/document/path/91982 +/// 详情见: /// -public class WeChatWorkGetTemplateRequest +public class WeChatWorkGetTemplateRequest : WeChatWorkRequest { /// /// 模版id 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkUpdateTemplateRequest.cs similarity index 86% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkUpdateTemplateRequest.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkUpdateTemplateRequest.cs index 307e55f9b..b9cc4c7d7 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Request/WeChatWorkUpdateTemplateRequest.cs @@ -1,15 +1,15 @@ using JetBrains.Annotations; -using LINGYUN.Abp.WeChat.Work.Approvals.Models; +using LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Request; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Request; /// /// 更新审批模板请求参数 /// /// -/// 详情见: https://developer.work.weixin.qq.com/document/path/97438 +/// 详情见: /// public class WeChatWorkUpdateTemplateRequest { 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Response/WeChatWorkApplyEventResponse.cs similarity index 76% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkApplyEventResponse.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Response/WeChatWorkApplyEventResponse.cs index d62fea7d2..0157def9a 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Response/WeChatWorkApplyEventResponse.cs @@ -2,12 +2,12 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Response; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Response; /// /// 提交审批申请响应参数 /// /// -/// 详情见: https://developer.work.weixin.qq.com/document/path/91853 +/// 详情见: /// public class WeChatWorkApplyEventResponse : WeChatWorkResponse { 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Response/WeChatWorkCreateTemplateResponse.cs similarity index 76% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkCreateTemplateResponse.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Response/WeChatWorkCreateTemplateResponse.cs index a44492a58..b867a97e5 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Response/WeChatWorkCreateTemplateResponse.cs @@ -2,12 +2,12 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Response; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Response; /// /// 创建审批模板响应参数 /// /// -/// 详情见: https://developer.work.weixin.qq.com/document/path/97437 +/// 详情见: /// public class WeChatWorkCreateTemplateResponse : WeChatWorkResponse { 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Response/WeChatWorkGetApprovalDetailResponse.cs similarity index 69% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkGetApprovalDetailResponse.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Response/WeChatWorkGetApprovalDetailResponse.cs index 81189f650..76be8549f 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Response/WeChatWorkGetApprovalDetailResponse.cs @@ -1,14 +1,14 @@ using JetBrains.Annotations; -using LINGYUN.Abp.WeChat.Work.Approvals.Models; +using LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Response; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Response; /// /// 获取审批申请详情响应参数 /// /// -/// 详情见: https://developer.work.weixin.qq.com/document/path/91983 +/// 详情见: /// public class WeChatWorkGetApprovalDetailResponse : WeChatWorkResponse { 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Response/WeChatWorkGetApprovalInfoResponse.cs similarity index 84% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkGetApprovalInfoResponse.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Response/WeChatWorkGetApprovalInfoResponse.cs index 4b9015c58..6e8f90ef7 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Response/WeChatWorkGetApprovalInfoResponse.cs @@ -3,12 +3,12 @@ using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Response; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Response; /// /// 批量获取审批单号响应参数 /// /// -/// 详情见: https://developer.work.weixin.qq.com/document/path/91816 +/// 详情见: /// public class WeChatWorkGetApprovalInfoResponse : WeChatWorkResponse { 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Response/WeChatWorkTemplateResponse.cs similarity index 84% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkTemplateResponse.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Response/WeChatWorkTemplateResponse.cs index 8700db44f..3ed2478fb 100644 --- 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.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/Response/WeChatWorkTemplateResponse.cs @@ -1,15 +1,15 @@ using JetBrains.Annotations; -using LINGYUN.Abp.WeChat.Work.Approvals.Models; +using LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; using Newtonsoft.Json; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace LINGYUN.Abp.WeChat.Work.Approvals.Response; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals.Response; /// /// 审批模板响应参数 /// /// -/// 详情见: https://developer.work.weixin.qq.com/document/path/91982 +/// 详情见: /// public class WeChatWorkTemplateResponse : WeChatWorkResponse { diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/WeChatWorkApprovalTemplateProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/WeChatWorkApprovalTemplateProvider.cs similarity index 53% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/WeChatWorkApprovalTemplateProvider.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/WeChatWorkApprovalTemplateProvider.cs index a3d9ee79a..7876e366b 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/WeChatWorkApprovalTemplateProvider.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Approvals/WeChatWorkApprovalTemplateProvider.cs @@ -1,16 +1,18 @@ -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.OA.Approvals.Request; +using LINGYUN.Abp.WeChat.Work.OA.Approvals.Response; +using LINGYUN.Abp.WeChat.Work.OA.Features; using LINGYUN.Abp.WeChat.Work.Token; +using Microsoft.Extensions.DependencyInjection; using System.Net.Http; using System.Threading; using System.Threading.Tasks; +using Volo.Abp; using Volo.Abp.DependencyInjection; using Volo.Abp.Features; -namespace LINGYUN.Abp.WeChat.Work.Approvals; +namespace LINGYUN.Abp.WeChat.Work.OA.Approvals; -[RequiresFeature(WeChatWorkFeatureNames.Enable)] +[RequiresFeature(WeChatWorkOAFeatureNames.Enable)] public class WeChatWorkApprovalTemplateProvider : IWeChatWorkApprovalTemplateProvider, ISingletonDependency { protected IHttpClientFactory HttpClientFactory { get; } @@ -26,55 +28,61 @@ public class WeChatWorkApprovalTemplateProvider : IWeChatWorkApprovalTemplatePro public async virtual Task ApplyEventAsync(WeChatWorkApplyEventRequest request, CancellationToken cancellationToken = default) { + Check.NotNull(request, nameof(request)); + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); - var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); - using var response = await client.ApplyEventAsync(token.AccessToken, request, cancellationToken); - return await response.DeserializeObjectAsync(); + return await client.ApplyEventAsync(token.AccessToken, request, cancellationToken); } public async virtual Task CreateTemplateAsync(WeChatWorkCreateTemplateRequest request, CancellationToken cancellationToken = default) { + Check.NotNull(request, nameof(request)); + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); - var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); - using var response = await client.CreateTemplateAsync(token.AccessToken, request, cancellationToken); - return await response.DeserializeObjectAsync(); + return await client.CreateTemplateAsync(token.AccessToken, request, cancellationToken); } public async virtual Task GetApprovalDetailAsync(WeChatWorkGetApprovalDetailRequest request, CancellationToken cancellationToken = default) { + Check.NotNull(request, nameof(request)); + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); - var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); - using var response = await client.GetApprovalDetailAsync(token.AccessToken, request, cancellationToken); - return await response.DeserializeObjectAsync(); + return await client.GetApprovalDetailAsync(token.AccessToken, request, cancellationToken); } public async virtual Task GetApprovalInfoAsync(WeChatWorkGetApprovalInfoRequest request, CancellationToken cancellationToken = default) { + Check.NotNull(request, nameof(request)); + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); - var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); - using var response = await client.GetApprovalInfoAsync(token.AccessToken, request, cancellationToken); - return await response.DeserializeObjectAsync(); + return await client.GetApprovalInfoAsync(token.AccessToken, request, cancellationToken); } public async virtual Task GetTemplateAsync(WeChatWorkGetTemplateRequest request, CancellationToken cancellationToken = default) { + Check.NotNull(request, nameof(request)); + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); - var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); - using var response = await client.GetTemplateAsync(token.AccessToken, request, cancellationToken); - return await response.DeserializeObjectAsync(); + return await client.GetTemplateAsync(token.AccessToken, request, cancellationToken); } public async virtual Task UpdateTemplateAsync(WeChatWorkCreateTemplateRequest request, CancellationToken cancellationToken = default) { + Check.NotNull(request, nameof(request)); + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); - var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); - using var response = await client.UpdateTemplateAsync(token.AccessToken, request, cancellationToken); - return await response.DeserializeObjectAsync(); + return await client.UpdateTemplateAsync(token.AccessToken, request, cancellationToken); } } diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Features/WeChatWorkOAFeatureDefinitionProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Features/WeChatWorkOAFeatureDefinitionProvider.cs new file mode 100644 index 000000000..aa90f7498 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Features/WeChatWorkOAFeatureDefinitionProvider.cs @@ -0,0 +1,32 @@ +using LINGYUN.Abp.WeChat.Work.Features; +using LINGYUN.Abp.WeChat.Work.Localization; +using Volo.Abp.Features; +using Volo.Abp.Localization; +using Volo.Abp.Validation.StringValues; + +namespace LINGYUN.Abp.WeChat.Work.OA.Features; + +public class WeChatWorkOAFeatureDefinitionProvider : FeatureDefinitionProvider +{ + public override void Define(IFeatureDefinitionContext context) + { + var weChatFeature = context.GetGroupOrNull(WeChatWorkFeatureNames.GroupName); + if (weChatFeature == null) + { + return; + } + + var group = weChatFeature.AddFeature(WeChatWorkOAFeatureNames.GroupName); + group.CreateChild( + WeChatWorkOAFeatureNames.Enable, + defaultValue: "false", + displayName: L("Features:OAEnable"), + description: L("Features:OAEnableDesc"), + valueType: new ToggleStringValueType(new BooleanValueValidator())); + } + + private static ILocalizableString L(string name) + { + return LocalizableString.Create(name); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Features/WeChatWorkOAFeatureNames.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Features/WeChatWorkOAFeatureNames.cs new file mode 100644 index 000000000..e02c4a490 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Features/WeChatWorkOAFeatureNames.cs @@ -0,0 +1,14 @@ +using LINGYUN.Abp.WeChat.Work.Features; + +namespace LINGYUN.Abp.WeChat.Work.OA.Features; +/// +/// 企业微信办公模块功能 +/// +public static class WeChatWorkOAFeatureNames +{ + public const string GroupName = WeChatWorkFeatureNames.GroupName + ".OA"; + /// + /// 启用企业微信办公 + /// + public const string Enable = GroupName + ".Enable"; +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Localization/Resources/en.json b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Localization/Resources/en.json new file mode 100644 index 000000000..a3dfbb188 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Localization/Resources/en.json @@ -0,0 +1,7 @@ +{ + "culture": "en", + "texts": { + "Features:OAEnable": "Enable OA", + "Features:OAEnableDesc": "Enable the ability to provide the application with an Enterprise wechat OA interface." + } +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Localization/Resources/zh-Hans.json b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Localization/Resources/zh-Hans.json new file mode 100644 index 000000000..a3e91838d --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Localization/Resources/zh-Hans.json @@ -0,0 +1,7 @@ +{ + "culture": "zh-Hans", + "texts": { + "Features:OAEnable": "启用办公", + "Features:OAEnableDesc": "启用以使应用拥有企业微信办公接口的能力." + } +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/IWeChatWorkMeetingRoomProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/IWeChatWorkMeetingRoomProvider.cs new file mode 100644 index 000000000..5810335b3 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/IWeChatWorkMeetingRoomProvider.cs @@ -0,0 +1,132 @@ +using LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Request; +using LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Response; +using System.Threading; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms; +/// +/// 会议室管理 +/// +public interface IWeChatWorkMeetingRoomProvider +{ + /// + /// 添加会议室 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task CreateMeetingRoomAsync( + WeChatWorkCreateMeetingRoomRequest request, + CancellationToken cancellationToken = default); + /// + /// 查询会议室 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task GetMeetingRoomListAsync( + WeChatWorkGetMeetingRoomListRequest request, + CancellationToken cancellationToken = default); + /// + /// 编辑会议室 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task UpdateMeetingRoomAsync( + WeChatWorkUpdateMeetingRoomRequest request, + CancellationToken cancellationToken = default); + /// + /// 删除会议室 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task DeleteMeetingRoomAsync( + WeChatWorkDeleteMeetingRoomRequest request, + CancellationToken cancellationToken = default); + /// + /// 查询会议室的预定信息 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task GetMeetingRoomBookingListAsync( + WeChatWorkGetMeetingRoomBookingListRequest request, + CancellationToken cancellationToken = default); + /// + /// 预定会议室 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task BookMeetingRoomAsync( + WeChatWorkBookMeetingRoomRequest request, + CancellationToken cancellationToken = default); + /// + /// 通过日程预定会议室 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task BookMeetingRoomByScheduleAsync( + WeChatWorkBookMeetingRoomByScheduleRequest request, + CancellationToken cancellationToken = default); + /// + /// 通过会议预定会议室 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task BookMeetingRoomByMeetingAsync( + WeChatWorkBookMeetingRoomByMeetingRequest request, + CancellationToken cancellationToken = default); + /// + /// 取消预定会议室 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task CancelBookMeetingRoomAsync( + WeChatWorkCancelBookMeetingRoomRequest request, + CancellationToken cancellationToken = default); + /// + /// 根据会议室预定ID查询预定详情 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task GetMeetingRoomBookAsync( + WeChatWorkGetMeetingRoomBookRequest request, + CancellationToken cancellationToken = default); +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomBookingInfo.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomBookingInfo.cs new file mode 100644 index 000000000..cff9e92a6 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomBookingInfo.cs @@ -0,0 +1,25 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Models; +/// +/// 会议室预订信息 +/// +public class MeetingRoomBookingInfo +{ + /// + /// 会议室id + /// + [NotNull] + [JsonProperty("meetingroom_id")] + [JsonPropertyName("meetingroom_id")] + public int MeetingRoomId { get; set; } + /// + /// 该会议室查询时间段内的预定情况 + /// + [NotNull] + [JsonProperty("schedule")] + [JsonPropertyName("schedule")] + public MeetingRoomSchedule[] Schedule { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomCoordinate.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomCoordinate.cs new file mode 100644 index 000000000..0e876db77 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomCoordinate.cs @@ -0,0 +1,30 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Models; +/// +/// 会议室坐标 +/// +public class MeetingRoomCoordinate +{ + /// + /// 会议室所在楼宇的纬度 + /// + [NotNull] + [JsonProperty("latitude")] + [JsonPropertyName("latitude")] + public string Latitude { get; } + /// + /// 会议室所在楼宇的经度 + /// + [NotNull] + [JsonProperty("longitude")] + [JsonPropertyName("longitude")] + public string Longitude { get; } + public MeetingRoomCoordinate(decimal latitude, decimal longitude) + { + Latitude = latitude.ToString(); + Longitude = longitude.ToString(); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomInfo.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomInfo.cs new file mode 100644 index 000000000..cb596a76e --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomInfo.cs @@ -0,0 +1,83 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Models; +/// +/// 会议室详情 +/// +public class MeetingRoomInfo +{ + /// + /// 会议室id + /// + [NotNull] + [JsonProperty("meetingroom_id")] + [JsonPropertyName("meetingroom_id")] + public int MeetingRoomId { get; set; } + /// + /// 会议室名称 + /// + [NotNull] + [JsonProperty("name")] + [JsonPropertyName("name")] + public string Name { get; set; } + /// + /// 会议室容纳人数 + /// + [NotNull] + [JsonProperty("capacity")] + [JsonPropertyName("capacity")] + public int Capacity { get; set; } + /// + /// 会议室所在城市 + /// + [CanBeNull] + [JsonProperty("city")] + [JsonPropertyName("city")] + public string? City { get; set; } + /// + /// 会议室所在楼宇 + /// + [CanBeNull] + [JsonProperty("building")] + [JsonPropertyName("building")] + public string? Building { get; set; } + /// + /// 会议室所在楼层 + /// + [CanBeNull] + [JsonProperty("floor")] + [JsonPropertyName("floor")] + public string? Floor { get; set; } + /// + /// 会议室支持的设备列表 + /// + [NotNull] + [JsonProperty("equipment")] + [JsonPropertyName("equipment")] + public int[] Equipment { get; set; } + /// + /// 会议室坐标 + /// + [CanBeNull] + [JsonProperty("coordinate")] + [JsonPropertyName("coordinate")] + public MeetingRoomCoordinate? Coordinate { get; set; } + /// + /// 会议室使用范围 + /// + [CanBeNull] + [JsonProperty("range")] + [JsonPropertyName("range")] + public MeetingRoomRange? Range { get; set; } + /// + /// 是否需要审批 0-无需审批 1-需要审批 + /// + [NotNull] + [JsonProperty("need_approval")] + [JsonPropertyName("need_approval")] + [Newtonsoft.Json.JsonConverter(typeof(IntToBoolConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(IntToBoolConverter))] + public bool NeedApproval { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomRange.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomRange.cs new file mode 100644 index 000000000..4e6271d30 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomRange.cs @@ -0,0 +1,30 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Models; +/// +/// 会议室使用范围 +/// +public class MeetingRoomRange +{ + /// + /// 会议室使用范围的userid列表 + /// + [NotNull] + [JsonProperty("user_list")] + [JsonPropertyName("user_list")] + public string[]? UserList { get; } + /// + /// 会议室使用范围的部门id列表 + /// + [NotNull] + [JsonProperty("department_list")] + [JsonPropertyName("department_list")] + public int[]? DepartmentList { get; } + public MeetingRoomRange(string[]? userList = null, int[]? departmentList = null) + { + UserList = userList; + DepartmentList = departmentList; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomSchedule.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomSchedule.cs new file mode 100644 index 000000000..7049e3759 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomSchedule.cs @@ -0,0 +1,53 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Models; +/// +/// 会议室预定情况 +/// +public class MeetingRoomSchedule +{ + /// + /// 开始时间的时间戳 + /// + [NotNull] + [JsonProperty("start_time")] + [JsonPropertyName("start_time")] + public long StartTime { get; set; } + /// + /// 结束时间的时间戳 + /// + [NotNull] + [JsonProperty("end_time")] + [JsonPropertyName("end_time")] + public long EndTime { get; set; } + /// + /// 预定人的userid + /// + [NotNull] + [JsonProperty("booker")] + [JsonPropertyName("booker")] + public string Booker { get; set; } + /// + /// 会议室的预定状态 + /// + [NotNull] + [JsonProperty("status")] + [JsonPropertyName("status")] + public MeetingRoomScheduleStatus Status { get; set; } + /// + /// 会议室的预定id + /// + [NotNull] + [JsonProperty("booking_id")] + [JsonPropertyName("booking_id")] + public string BookingId { get; set; } + /// + /// 会议关联日程的id + /// + [CanBeNull] + [JsonProperty("schedule_id")] + [JsonPropertyName("schedule_id")] + public string? ScheduleId { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomScheduleStatus.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomScheduleStatus.cs new file mode 100644 index 000000000..a3a7a79de --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Models/MeetingRoomScheduleStatus.cs @@ -0,0 +1,25 @@ +using System.ComponentModel; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Models; +/// +/// 预定状态 +/// +[Description("预定状态")] +public enum MeetingRoomScheduleStatus +{ + /// + /// 已预定 + /// + [Description("已预定")] + Reserved = 0, + /// + /// 申请中 + /// + [Description("申请中")] + Applying = 2, + /// + /// 审批中 + /// + [Description("审批中")] + Approvaling = 3, +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkBookMeetingRoomByMeetingRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkBookMeetingRoomByMeetingRequest.cs new file mode 100644 index 000000000..15b7e7a07 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkBookMeetingRoomByMeetingRequest.cs @@ -0,0 +1,45 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Request; +/// +/// 通过会议预定会议室请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkBookMeetingRoomByMeetingRequest : WeChatWorkRequest +{ + /// + /// 会议室id + /// + [NotNull] + [JsonProperty("meetingroom_id")] + [JsonPropertyName("meetingroom_id")] + public int MeetingRoomId { get; } + /// + /// 预定人的userid + /// + [NotNull] + [JsonProperty("booker")] + [JsonPropertyName("booker")] + public string Booker { get; } + /// + /// 会议id,仅可使用同应用创建的会议 + /// + [NotNull] + [JsonProperty("meetingid")] + [JsonPropertyName("meetingid")] + public string MeetingId { get; } + public WeChatWorkBookMeetingRoomByMeetingRequest( + int meetingRoomId, + string booker, + string meetingId) + { + MeetingRoomId = Check.NotDefaultOrNull(meetingRoomId, nameof(meetingRoomId)); + Booker = Check.NotNullOrWhiteSpace(booker, nameof(booker)); + MeetingId = Check.NotNullOrWhiteSpace(meetingId, nameof(meetingId)); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkBookMeetingRoomByScheduleRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkBookMeetingRoomByScheduleRequest.cs new file mode 100644 index 000000000..8c001f06b --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkBookMeetingRoomByScheduleRequest.cs @@ -0,0 +1,45 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Request; +/// +/// 通过日程预定会议室请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkBookMeetingRoomByScheduleRequest : WeChatWorkRequest +{ + /// + /// 会议室id + /// + [NotNull] + [JsonProperty("meetingroom_id")] + [JsonPropertyName("meetingroom_id")] + public int MeetingRoomId { get; } + /// + /// 预定人的userid + /// + [NotNull] + [JsonProperty("booker")] + [JsonPropertyName("booker")] + public string Booker { get; } + /// + /// 会议关联日程的id + /// + [NotNull] + [JsonProperty("schedule_id")] + [JsonPropertyName("schedule_id")] + public string ScheduleId { get; } + public WeChatWorkBookMeetingRoomByScheduleRequest( + int meetingRoomId, + string booker, + string scheduleId) + { + MeetingRoomId = Check.NotDefaultOrNull(meetingRoomId, nameof(meetingRoomId)); + Booker = Check.NotNullOrWhiteSpace(booker, nameof(booker)); + ScheduleId = Check.NotNullOrWhiteSpace(scheduleId, nameof(scheduleId)); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkBookMeetingRoomRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkBookMeetingRoomRequest.cs new file mode 100644 index 000000000..546f3ab05 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkBookMeetingRoomRequest.cs @@ -0,0 +1,99 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Request; +/// +/// 预定会议室请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkBookMeetingRoomRequest : WeChatWorkRequest +{ + /// + /// 参与人的userid列表 + /// + private readonly static List _attendees = new List(); + /// + /// 会议室id + /// + [NotNull] + [JsonProperty("meetingroom_id")] + [JsonPropertyName("meetingroom_id")] + public int MeetingRoomId { get; } + /// + /// 预定开始时间 + /// + [NotNull] + [JsonProperty("start_time")] + [JsonPropertyName("start_time")] + public long StartTime { get; } + /// + /// 预定结束时间 + /// + [NotNull] + [JsonProperty("end_time")] + [JsonPropertyName("end_time")] + public long EndTime { get; } + /// + /// 预定人的userid + /// + [NotNull] + [JsonProperty("booker")] + [JsonPropertyName("booker")] + public string Booker { get; } + /// + /// 会议主题 + /// + [CanBeNull] + [JsonProperty("subject")] + [JsonPropertyName("subject")] + public string? Subject { get; } + /// + /// 参与人的userid列表 + /// + [NotNull] + [JsonProperty("attendees")] + [JsonPropertyName("attendees")] + public string[] Attendees => _attendees.ToArray(); + public WeChatWorkBookMeetingRoomRequest( + int meetingRoomId, + DateTime startTime, + DateTime endTime, + string booker, + string? subject = null) + { + MeetingRoomId = Check.NotDefaultOrNull(meetingRoomId, nameof(meetingRoomId)); + StartTime = startTime.GetUnixTimeSeconds(); + EndTime = endTime.GetUnixTimeSeconds(); + Booker = Check.NotNullOrWhiteSpace(booker, nameof(booker)); + Subject = subject; + } + /// + /// 添加一个参与人 + /// + /// + public void AddAttendee(string userId) + { + _attendees.AddIfNotContains(userId); + } + /// + /// 移除一个参与人 + /// + /// + public void RemoveAttendee(string userId) + { + _attendees.RemoveAll(attendee => string.Equals(attendee, userId)); + } + /// + /// 清空参与人 + /// + public void ClearAttendee() + { + _attendees.Clear(); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkCancelBookMeetingRoomRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkCancelBookMeetingRoomRequest.cs new file mode 100644 index 000000000..6f9dadb7c --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkCancelBookMeetingRoomRequest.cs @@ -0,0 +1,49 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Request; +/// +/// 取消预定会议室请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkCancelBookMeetingRoomRequest : WeChatWorkRequest +{ + /// + /// 会议室的预定id + /// + [NotNull] + [JsonProperty("booking_id")] + [JsonPropertyName("booking_id")] + public string BookingId { get; } + /// + /// 是否保留日程,0-同步删除 1-保留,仅对非重复日程有效 + /// + [NotNull] + [JsonProperty("keep_schedule")] + [JsonPropertyName("keep_schedule")] + public int KeepSchedule { get; } + /// + /// 对于重复日程,如果不填写此参数,表示取消所有重复预定;如果填写,则表示取消对应日期当天的会议室预定 + /// + [CanBeNull] + [JsonProperty("cancel_date")] + [JsonPropertyName("cancel_date")] + public long? CancelDate { get; private set; } + public WeChatWorkCancelBookMeetingRoomRequest( + string bookingId, + bool keepSchedule = false, + DateTime? cancelDate = null) + { + BookingId = Check.NotNullOrWhiteSpace(bookingId, nameof(bookingId)); + KeepSchedule = keepSchedule ? 1 : 0; + if (cancelDate.HasValue) + { + CancelDate = (long)(cancelDate.Value - new DateTime(1970, 1, 1)).TotalSeconds; + } + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkCreateMeetingRoomRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkCreateMeetingRoomRequest.cs new file mode 100644 index 000000000..53417d56d --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkCreateMeetingRoomRequest.cs @@ -0,0 +1,138 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Models; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; +using System.Xml.Linq; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Request; +/// +/// 添加会议室请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkCreateMeetingRoomRequest : WeChatWorkRequest +{ + /// + /// 会议室名称 + /// + [NotNull] + [JsonProperty("name")] + [JsonPropertyName("name")] + public string Name { get; } + /// + /// 会议室容纳人数 + /// + [NotNull] + [JsonProperty("capacity")] + [JsonPropertyName("capacity")] + public int Capacity { get; } + /// + /// 会议室所在城市 + /// + [CanBeNull] + [JsonProperty("city")] + [JsonPropertyName("city")] + public string? City { get; private set; } + /// + /// 会议室所在楼宇 + /// + [CanBeNull] + [JsonProperty("building")] + [JsonPropertyName("building")] + public string? Building { get; private set; } + /// + /// 会议室所在楼层 + /// + [CanBeNull] + [JsonProperty("floor")] + [JsonPropertyName("floor")] + public string? Floor { get; private set; } + /// + /// 会议室支持的设备列表 + /// + private readonly List _equipment; + /// + /// 会议室支持的设备列表 + /// + [NotNull] + [JsonProperty("equipment")] + [JsonPropertyName("equipment")] + public int[] Equipment => _equipment.ToArray(); + /// + /// 会议室坐标 + /// + [CanBeNull] + [JsonProperty("coordinate")] + [JsonPropertyName("coordinate")] + public MeetingRoomCoordinate? Coordinate { get; set; } + /// + /// 会议室使用范围 + /// + [CanBeNull] + [JsonProperty("range")] + [JsonPropertyName("range")] + public MeetingRoomRange? Range { get; set; } + public WeChatWorkCreateMeetingRoomRequest(string name, int capacity) + { + Name = Check.NotNullOrWhiteSpace(name, nameof(name), 30); + Capacity = Check.NotDefaultOrNull(capacity, nameof(capacity)); + + _equipment = new List(); + } + /// + /// 设置位置信息 + /// + /// + /// + /// + public void WithLocation(string city, string building, string floor) + { + City = Check.NotNullOrWhiteSpace(city, nameof(city)); + Building = Check.NotNullOrWhiteSpace(building, nameof(building)); + Floor = Check.NotNullOrWhiteSpace(floor, nameof(floor)); + } + /// + /// 允许电视设备 + /// + /// + public void WithTv() + { + _equipment.AddIfNotContains(1); + } + /// + /// 允许电话设备 + /// + /// + public void WithPhone() + { + _equipment.AddIfNotContains(2); + + } + /// + /// 允许投影设备 + /// + /// + public void WithProjection() + { + _equipment.AddIfNotContains(3); + } + /// + /// 允许白板设备 + /// + /// + public void WithWhiteboard() + { + _equipment.AddIfNotContains(4); + } + /// + /// 允许视频设备 + /// + /// + public void WithVideo() + { + _equipment.AddIfNotContains(5); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkDeleteMeetingRoomRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkDeleteMeetingRoomRequest.cs new file mode 100644 index 000000000..e09624e95 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkDeleteMeetingRoomRequest.cs @@ -0,0 +1,26 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Request; +/// +/// 删除会议室请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkDeleteMeetingRoomRequest : WeChatWorkRequest +{ + /// + /// 会议室id + /// + [NotNull] + [JsonProperty("meetingroom_id")] + [JsonPropertyName("meetingroom_id")] + public int MeetingRoomId { get; } + public WeChatWorkDeleteMeetingRoomRequest(int meetingRoomId) + { + MeetingRoomId = Check.NotDefaultOrNull(meetingRoomId, nameof(meetingRoomId)); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkGetMeetingRoomBookRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkGetMeetingRoomBookRequest.cs new file mode 100644 index 000000000..435cac881 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkGetMeetingRoomBookRequest.cs @@ -0,0 +1,34 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Request; +/// +/// 根据会议室预定ID查询预定详情请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetMeetingRoomBookRequest : WeChatWorkRequest +{ + /// + /// 会议室id + /// + [NotNull] + [JsonProperty("meetingroom_id")] + [JsonPropertyName("meetingroom_id")] + public int MeetingRoomId { get; } + /// + /// 会议室的预定id + /// + [NotNull] + [JsonProperty("booking_id")] + [JsonPropertyName("booking_id")] + public string BookingId { get; } + public WeChatWorkGetMeetingRoomBookRequest(int meetingRoomId, string bookingId) + { + MeetingRoomId = meetingRoomId; + BookingId = Check.NotNullOrWhiteSpace(bookingId, nameof(bookingId)); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkGetMeetingRoomBookingListRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkGetMeetingRoomBookingListRequest.cs new file mode 100644 index 000000000..0c9c54751 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkGetMeetingRoomBookingListRequest.cs @@ -0,0 +1,68 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Request; +/// +/// 查询会议室的预定信息请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetMeetingRoomBookingListRequest : WeChatWorkRequest +{ + private readonly static DateTime _beginUnixTime = new DateTime(1970, 1, 1); + /// + /// 会议室id + /// + [CanBeNull] + [JsonProperty("meetingroom_id")] + [JsonPropertyName("meetingroom_id")] + public int? MeetingRoomId { get; set; } + /// + /// 会议室所在城市 + /// + [CanBeNull] + [JsonProperty("city")] + [JsonPropertyName("city")] + public string? City { get; set; } + /// + /// 会议室所在楼宇 + /// + [CanBeNull] + [JsonProperty("building")] + [JsonPropertyName("building")] + public string? Building { get; set; } + /// + /// 会议室所在楼层 + /// + [CanBeNull] + [JsonProperty("floor")] + [JsonPropertyName("floor")] + public string? Floor { get; set; } + /// + /// 查询预定的起始时间,为空默认为当前时间 + /// + [CanBeNull] + [JsonProperty("start_time")] + [JsonPropertyName("start_time")] + public long? StartTime { get; private set; } + /// + /// 查询预定的结束时间, 为空默认为明日0时 + /// + [CanBeNull] + [JsonProperty("end_time")] + [JsonPropertyName("end_time")] + public long? EndTime { get; private set; } + /// + /// 设置查询预定时间范围 + /// + /// 起始时间 + /// 结束时间 + public void Beetween(DateTime startTime, DateTime endTime) + { + StartTime = (long)(startTime - _beginUnixTime).TotalSeconds; + EndTime = (long)(endTime - _beginUnixTime).TotalSeconds; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkGetMeetingRoomListRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkGetMeetingRoomListRequest.cs new file mode 100644 index 000000000..1d078d81a --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkGetMeetingRoomListRequest.cs @@ -0,0 +1,92 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Request; +/// +/// 查询会议室请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetMeetingRoomListRequest : WeChatWorkRequest +{ + /// + /// 会议室所在城市 + /// + [CanBeNull] + [JsonProperty("city")] + [JsonPropertyName("city")] + public string? City { get; set; } + /// + /// 会议室所在楼宇 + /// + [CanBeNull] + [JsonProperty("building")] + [JsonPropertyName("building")] + public string? Building { get; set; } + /// + /// 会议室所在楼层 + /// + [CanBeNull] + [JsonProperty("floor")] + [JsonPropertyName("floor")] + public string? Floor { get; set; } + /// + /// 会议室支持的设备列表 + /// + private readonly List _equipment; + /// + /// 会议室支持的设备列表 + /// + [CanBeNull] + [JsonProperty("equipment")] + [JsonPropertyName("equipment")] + public int[] Equipment => _equipment.ToArray(); + public WeChatWorkGetMeetingRoomListRequest() + { + _equipment = new List(); + } + /// + /// 允许电视设备 + /// + /// + public void WithTv() + { + _equipment.AddIfNotContains(1); + } + /// + /// 允许电话设备 + /// + /// + public void WithPhone() + { + _equipment.AddIfNotContains(2); + + } + /// + /// 允许投影设备 + /// + /// + public void WithProjection() + { + _equipment.AddIfNotContains(3); + } + /// + /// 允许白板设备 + /// + /// + public void WithWhiteboard() + { + _equipment.AddIfNotContains(4); + } + /// + /// 允许视频设备 + /// + /// + public void WithVideo() + { + _equipment.AddIfNotContains(5); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkUpdateMeetingRoomRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkUpdateMeetingRoomRequest.cs new file mode 100644 index 000000000..8de7c2ae0 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Request/WeChatWorkUpdateMeetingRoomRequest.cs @@ -0,0 +1,147 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Models; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Request; +/// +/// 编辑会议室请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkUpdateMeetingRoomRequest : WeChatWorkRequest +{ + /// + /// 会议室id + /// + [NotNull] + [JsonProperty("meetingroom_id")] + [JsonPropertyName("meetingroom_id")] + public int MeetingRoomId { get; } + /// + /// 会议室名称 + /// + [CanBeNull] + [JsonProperty("name")] + [JsonPropertyName("name")] + public string? Name { get; set; } + /// + /// 会议室容纳人数 + /// + [CanBeNull] + [JsonProperty("capacity")] + [JsonPropertyName("capacity")] + public int Capacity { get; set; } + /// + /// 会议室所在城市 + /// + [CanBeNull] + [JsonProperty("city")] + [JsonPropertyName("city")] + public string? City { get; private set; } + /// + /// 会议室所在楼宇 + /// + [CanBeNull] + [JsonProperty("building")] + [JsonPropertyName("building")] + public string? Building { get; private set; } + /// + /// 会议室所在楼层 + /// + [CanBeNull] + [JsonProperty("floor")] + [JsonPropertyName("floor")] + public string? Floor { get; private set; } + /// + /// 会议室支持的设备列表 + /// + private readonly List _equipment; + /// + /// 会议室支持的设备列表 + /// + [NotNull] + [JsonProperty("equipment")] + [JsonPropertyName("equipment")] + public int[] Equipment => _equipment.ToArray(); + /// + /// 会议室坐标 + /// + [CanBeNull] + [JsonProperty("coordinate")] + [JsonPropertyName("coordinate")] + public MeetingRoomCoordinate? Coordinate { get; set; } + /// + /// 会议室使用范围 + /// + [CanBeNull] + [JsonProperty("range")] + [JsonPropertyName("range")] + public MeetingRoomRange? Range { get; set; } + public WeChatWorkUpdateMeetingRoomRequest(int meetingRoomId) + { + MeetingRoomId = Check.NotDefaultOrNull(meetingRoomId, nameof(meetingRoomId)); + + _equipment = new List(); + } + /// + /// 设置位置信息 + /// + /// + /// + /// + public void SetLocation(string city, string building, string floor) + { + City = Check.NotNullOrWhiteSpace(city, nameof(city)); + Building = Check.NotNullOrWhiteSpace(building, nameof(building)); + Floor = Check.NotNullOrWhiteSpace(floor, nameof(floor)); + } + /// + /// 允许电视设备 + /// + /// + public void WithTv() + { + _equipment.AddIfNotContains(1); + } + /// + /// 允许电话设备 + /// + /// + public void WithPhone() + { + _equipment.AddIfNotContains(2); + + } + /// + /// 允许投影设备 + /// + /// + public void WithProjection() + { + _equipment.AddIfNotContains(3); + } + /// + /// 允许白板设备 + /// + /// + public void WithWhiteboard() + { + _equipment.AddIfNotContains(4); + } + /// + /// 允许视频设备 + /// + /// + public void WithVideo() + { + _equipment.AddIfNotContains(5); + } + protected override void Validate() + { + Name = Check.Length(Name, nameof(Name), 30); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkBookMeetingRoomByMeetingResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkBookMeetingRoomByMeetingResponse.cs new file mode 100644 index 000000000..0d72eff3c --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkBookMeetingRoomByMeetingResponse.cs @@ -0,0 +1,28 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Response; +/// +/// 通过会议预定会议室响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkBookMeetingRoomByMeetingResponse : WeChatWorkResponse +{ + /// + /// 会议室的预定id + /// + [NotNull] + [JsonProperty("booking_id")] + [JsonPropertyName("booking_id")] + public string BookingId { get; set; } + /// + /// 会议室冲突日期列表,为当天0点的时间戳;使用重复日程预定会议室,部分日期与会议室预定情况冲突时返回 + /// + [NotNull] + [JsonProperty("conflict_date")] + [JsonPropertyName("conflict_date")] + public long[] ConflictDate { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkBookMeetingRoomByScheduleResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkBookMeetingRoomByScheduleResponse.cs new file mode 100644 index 000000000..15a966d4c --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkBookMeetingRoomByScheduleResponse.cs @@ -0,0 +1,28 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Response; +/// +/// 通过日程预定会议室响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkBookMeetingRoomByScheduleResponse : WeChatWorkResponse +{ + /// + /// 会议室的预定id + /// + [NotNull] + [JsonProperty("booking_id")] + [JsonPropertyName("booking_id")] + public string BookingId { get; set; } + /// + /// 会议室冲突日期列表,为当天0点的时间戳;使用重复日程预定会议室,部分日期与会议室预定情况冲突时返回 + /// + [NotNull] + [JsonProperty("conflict_date")] + [JsonPropertyName("conflict_date")] + public long[] ConflictDate { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkBookMeetingRoomResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkBookMeetingRoomResponse.cs new file mode 100644 index 000000000..b913ff72b --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkBookMeetingRoomResponse.cs @@ -0,0 +1,28 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Response; +/// +/// 预定会议室响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkBookMeetingRoomResponse : WeChatWorkResponse +{ + /// + /// 会议室的预定id + /// + [NotNull] + [JsonProperty("booking_id")] + [JsonPropertyName("booking_id")] + public string BookingId { get; set; } + /// + /// 会议关联日程的id + /// + [NotNull] + [JsonProperty("schedule_id")] + [JsonPropertyName("schedule_id")] + public string ScheduleId { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkCreateMeetingRoomResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkCreateMeetingRoomResponse.cs new file mode 100644 index 000000000..86e33cadd --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkCreateMeetingRoomResponse.cs @@ -0,0 +1,21 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Response; +/// +/// 添加会议室响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkCreateMeetingRoomResponse : WeChatWorkResponse +{ + /// + /// 会议室id + /// + [NotNull] + [JsonProperty("meetingroom_id")] + [JsonPropertyName("meetingroom_id")] + public int MeetingRoomId { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkGetMeetingRoomBookResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkGetMeetingRoomBookResponse.cs new file mode 100644 index 000000000..ae4c9edc8 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkGetMeetingRoomBookResponse.cs @@ -0,0 +1,22 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Response; +/// +/// 根据会议室预定ID查询预定详情响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetMeetingRoomBookResponse : WeChatWorkResponse +{ + /// + /// 该会议室的预定情况 + /// + [NotNull] + [JsonProperty("schedule")] + [JsonPropertyName("schedule")] + public MeetingRoomSchedule Schedule { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkGetMeetingRoomBookingListResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkGetMeetingRoomBookingListResponse.cs new file mode 100644 index 000000000..8c73828cf --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkGetMeetingRoomBookingListResponse.cs @@ -0,0 +1,22 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Response; +/// +/// 查询会议室的预定信息响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetMeetingRoomBookingListResponse : WeChatWorkResponse +{ + /// + /// 会议室预订信息列表 + /// + [NotNull] + [JsonProperty("booking_list")] + [JsonPropertyName("booking_list")] + public MeetingRoomBookingInfo[] BookingList { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkGetMeetingRoomListResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkGetMeetingRoomListResponse.cs new file mode 100644 index 000000000..67488e258 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/Response/WeChatWorkGetMeetingRoomListResponse.cs @@ -0,0 +1,22 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Response; +/// +/// 查询会议室响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetMeetingRoomListResponse : WeChatWorkResponse +{ + /// + /// 会议室列表 + /// + [NotNull] + [JsonProperty("meetingroom_list")] + [JsonPropertyName("meetingroom_list")] + public MeetingRoomInfo[] MeetingRoomList { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/WeChatWorkMeetingRoomProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/WeChatWorkMeetingRoomProvider.cs new file mode 100644 index 000000000..e451c2e61 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/WeChatWorkMeetingRoomProvider.cs @@ -0,0 +1,148 @@ +using LINGYUN.Abp.WeChat.Work.OA.Features; +using LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Request; +using LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Response; +using LINGYUN.Abp.WeChat.Work.Token; +using Microsoft.Extensions.DependencyInjection; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Features; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms; + +[RequiresFeature(WeChatWorkOAFeatureNames.Enable)] +public class WeChatWorkMeetingRoomProvider : IWeChatWorkMeetingRoomProvider, ISingletonDependency +{ + protected IHttpClientFactory HttpClientFactory { get; } + protected IWeChatWorkTokenProvider WeChatWorkTokenProvider { get; } + + public WeChatWorkMeetingRoomProvider( + IHttpClientFactory httpClientFactory, + IWeChatWorkTokenProvider weChatWorkTokenProvider) + { + HttpClientFactory = httpClientFactory; + WeChatWorkTokenProvider = weChatWorkTokenProvider; + } + + public async virtual Task CreateMeetingRoomAsync( + WeChatWorkCreateMeetingRoomRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.CreateMeetingRoomAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task GetMeetingRoomListAsync( + WeChatWorkGetMeetingRoomListRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.GetMeetingRoomListAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task UpdateMeetingRoomAsync( + WeChatWorkUpdateMeetingRoomRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.UpdateMeetingRoomAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task DeleteMeetingRoomAsync( + WeChatWorkDeleteMeetingRoomRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.DeleteMeetingRoomAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task GetMeetingRoomBookingListAsync( + WeChatWorkGetMeetingRoomBookingListRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.GetMeetingRoomBookingListAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task BookMeetingRoomAsync( + WeChatWorkBookMeetingRoomRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.BookMeetingRoomAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task BookMeetingRoomByScheduleAsync( + WeChatWorkBookMeetingRoomByScheduleRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.BookMeetingRoomByScheduleAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task BookMeetingRoomByMeetingAsync( + WeChatWorkBookMeetingRoomByMeetingRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.BookMeetingRoomByMeetingAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task CancelBookMeetingRoomAsync( + WeChatWorkCancelBookMeetingRoomRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.CancelBookMeetingRoomAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task GetMeetingRoomBookAsync( + WeChatWorkGetMeetingRoomBookRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.GetMeetingRoomBookAsync(token.AccessToken, request, cancellationToken); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/BookMeetingRoomEvent.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/BookMeetingRoomEvent.cs similarity index 89% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/BookMeetingRoomEvent.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/BookMeetingRoomEvent.cs index 4efc03105..3c8e8f54c 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/BookMeetingRoomEvent.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/BookMeetingRoomEvent.cs @@ -1,8 +1,9 @@ using LINGYUN.Abp.WeChat.Common.Messages; +using LINGYUN.Abp.WeChat.Work.Common.Messages; using System.Xml.Serialization; using Volo.Abp.EventBus; -namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Messages.Models; /// /// 会议室预定事件 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/CancelMeetingRoomEvent.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/CancelMeetingRoomEvent.cs similarity index 90% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/CancelMeetingRoomEvent.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/CancelMeetingRoomEvent.cs index 9fa50cadc..1ac73aa1e 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/CancelMeetingRoomEvent.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/CancelMeetingRoomEvent.cs @@ -1,8 +1,9 @@ using LINGYUN.Abp.WeChat.Common.Messages; +using LINGYUN.Abp.WeChat.Work.Common.Messages; using System.Xml.Serialization; using Volo.Abp.EventBus; -namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models; +namespace LINGYUN.Abp.WeChat.Work.OA.Messages.Models; /// /// 会议室取消事件 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/DeleteCalendarEvent.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/DeleteCalendarEvent.cs new file mode 100644 index 000000000..699129f61 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/DeleteCalendarEvent.cs @@ -0,0 +1,26 @@ +using LINGYUN.Abp.WeChat.Common.Messages; +using LINGYUN.Abp.WeChat.Work.Common.Messages; +using System.Xml.Serialization; +using Volo.Abp.EventBus; + +namespace LINGYUN.Abp.WeChat.Work.OA.Messages.Models; +/// +/// 删除日历事件 +/// +/// +/// 当日历管理员删除了API创建的日历时,触发该事件。 +/// +[EventName("delete_calendar")] +public class DeleteCalendarEvent : WeChatWorkEventMessage +{ + /// + /// 日历ID + /// + [XmlElement("CalId")] + public string CalId { get; set; } + + public override WeChatMessageEto ToEto() + { + return new WeChatWorkEventMessageEto(this); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/DeleteScheduleEvent.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/DeleteScheduleEvent.cs new file mode 100644 index 000000000..7e8347148 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/DeleteScheduleEvent.cs @@ -0,0 +1,31 @@ +using LINGYUN.Abp.WeChat.Common.Messages; +using LINGYUN.Abp.WeChat.Work.Common.Messages; +using System.Xml.Serialization; +using Volo.Abp.EventBus; + +namespace LINGYUN.Abp.WeChat.Work.OA.Messages.Models; +/// +/// 删除日程事件 +/// +/// +/// 当日程管理员在API创建的日历上删除了日程后,触发该事件。 +/// +[EventName("delete_schedule")] +public class DeleteScheduleEvent : WeChatWorkEventMessage +{ + /// + /// 日历ID + /// + [XmlElement("CalId")] + public string? CalId { get; set; } + /// + /// 日程ID + /// + [XmlElement("ScheduleId")] + public string ScheduleId { get; set; } + + public override WeChatMessageEto ToEto() + { + return new WeChatWorkEventMessageEto(this); + } +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/RespondScheduleEvent.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/RespondScheduleEvent.cs new file mode 100644 index 000000000..c32959f5f --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/RespondScheduleEvent.cs @@ -0,0 +1,31 @@ +using LINGYUN.Abp.WeChat.Common.Messages; +using LINGYUN.Abp.WeChat.Work.Common.Messages; +using System.Xml.Serialization; +using Volo.Abp.EventBus; + +namespace LINGYUN.Abp.WeChat.Work.OA.Messages.Models; +/// +/// 日程回执事件 +/// +/// +/// 当应用创建的日程,参与人进行回执操作(接受、待定、拒绝)时,触发该事件。 +/// +[EventName("respond_schedule")] +public class RespondScheduleEvent : WeChatWorkEventMessage +{ + /// + /// 日历ID + /// + [XmlElement("CalId")] + public string? CalId { get; set; } + /// + /// 日程ID + /// + [XmlElement("ScheduleId")] + public string ScheduleId { get; set; } + + public override WeChatMessageEto ToEto() + { + return new WeChatWorkEventMessageEto(this); + } +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/UpdateCalendarEvent.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/UpdateCalendarEvent.cs new file mode 100644 index 000000000..ca6ecebfd --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/UpdateCalendarEvent.cs @@ -0,0 +1,26 @@ +using LINGYUN.Abp.WeChat.Common.Messages; +using LINGYUN.Abp.WeChat.Work.Common.Messages; +using System.Xml.Serialization; +using Volo.Abp.EventBus; + +namespace LINGYUN.Abp.WeChat.Work.OA.Messages.Models; +/// +/// 修改日历事件 +/// +/// +/// 当日历管理员修改了API创建的日历时,触发该事件。 +/// +[EventName("modify_calendar")] +public class UpdateCalendarEvent : WeChatWorkEventMessage +{ + /// + /// 日历ID + /// + [XmlElement("CalId")] + public string CalId { get; set; } + + public override WeChatMessageEto ToEto() + { + return new WeChatWorkEventMessageEto(this); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/UpdateScheduleEvent.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/UpdateScheduleEvent.cs new file mode 100644 index 000000000..e698b37a9 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Messages/Models/UpdateScheduleEvent.cs @@ -0,0 +1,31 @@ +using LINGYUN.Abp.WeChat.Common.Messages; +using LINGYUN.Abp.WeChat.Work.Common.Messages; +using System.Xml.Serialization; +using Volo.Abp.EventBus; + +namespace LINGYUN.Abp.WeChat.Work.OA.Messages.Models; +/// +/// 修改日程事件 +/// +/// +/// 应用通过API创建日程后,当日程管理员修改了日程时,触发该事件。 +/// +[EventName("modify_schedule")] +public class UpdateScheduleEvent : WeChatWorkEventMessage +{ + /// + /// 日历ID + /// + [XmlElement("CalId")] + public string? CalId { get; set; } + /// + /// 日程ID + /// + [XmlElement("ScheduleId")] + public string ScheduleId { get; set; } + + public override WeChatMessageEto ToEto() + { + return new WeChatWorkEventMessageEto(this); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/IWeChatWorkCalendarProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/IWeChatWorkCalendarProvider.cs new file mode 100644 index 000000000..11263b15f --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/IWeChatWorkCalendarProvider.cs @@ -0,0 +1,60 @@ +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Request; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Response; +using System.Threading; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules; +/// +/// 日历管理 +/// +public interface IWeChatWorkCalendarProvider +{ + /// + /// 创建日历 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task CreateCalendarAsync( + WeChatWorkCreateCalendarRequest request, + CancellationToken cancellationToken = default); + /// + /// 更新日历 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task UpdateCalendarAsync( + WeChatWorkUpdateCalendarRequest request, + CancellationToken cancellationToken = default); + /// + /// 获取日历详情 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task GetCalendarListAsync( + WeChatWorkGetCalendarListRequest request, + CancellationToken cancellationToken = default); + /// + /// 删除日历 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task DeleteCalendarAsync( + WeChatWorkDeleteCalendarRequest request, + CancellationToken cancellationToken = default); +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/IWeChatWorkScheduleProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/IWeChatWorkScheduleProvider.cs new file mode 100644 index 000000000..11d6fe1e2 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/IWeChatWorkScheduleProvider.cs @@ -0,0 +1,96 @@ +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Request; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Response; +using System.Threading; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules; +/// +/// 日程管理 +/// +public interface IWeChatWorkScheduleProvider +{ + /// + /// 创建日程 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task CreateScheduleAsync( + WeChatWorkCreateScheduleRequest request, + CancellationToken cancellationToken = default); + /// + /// 更新日程 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task UpdateScheduleAsync( + WeChatWorkUpdateScheduleRequest request, + CancellationToken cancellationToken = default); + /// + /// 新增日程参与者 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task AddAttendeesAsync( + WeChatWorkScheduleAddAttendeesRequest request, + CancellationToken cancellationToken = default); + /// + /// 删除日程参与者 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task DeleteAttendeesAsync( + WeChatWorkScheduleDeleteAttendeesRequest request, + CancellationToken cancellationToken = default); + /// + /// 获取日历下的日程列表 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task GetScheduleListByCalendarAsync( + WeChatWorkGetScheduleListByCalendarRequest request, + CancellationToken cancellationToken = default); + /// + /// 获取日程详情 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task GetScheduleListAsync( + WeChatWorkGetScheduleListRequest request, + CancellationToken cancellationToken = default); + /// + /// 取消日程 + /// + /// + /// 详情见: + /// + /// 请求参数 + /// + /// + Task DeleteScheduleAsync( + WeChatWorkDeleteScheduleRequest request, + CancellationToken cancellationToken = default); +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarFailResult.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarFailResult.cs new file mode 100644 index 000000000..bdd7e088f --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarFailResult.cs @@ -0,0 +1,18 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +/// +/// 无效的输入内容 +/// +public class CalendarFailResult +{ + /// + /// 无效的日历通知范围成员列表 + /// + [CanBeNull] + [JsonProperty("shares")] + [JsonPropertyName("shares")] + public CalendarFailShare[] Shares { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarFailShare.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarFailShare.cs new file mode 100644 index 000000000..35ce724dc --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarFailShare.cs @@ -0,0 +1,32 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +/// +/// 无效的日历通知范围成员 +/// +public class CalendarFailShare +{ + /// + /// 错误码 + /// + [NotNull] + [JsonProperty("errcode")] + [JsonPropertyName("errcode")] + public int ErrorCode { get; set; } + /// + /// 错误消息 + /// + [NotNull] + [JsonProperty("errmsg")] + [JsonPropertyName("errmsg")] + public string ErrorMessage { get; set; } + /// + /// 日历通知范围成员的id + /// + [NotNull] + [JsonProperty("userid")] + [JsonPropertyName("userid")] + public string UserId { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarInfo.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarInfo.cs new file mode 100644 index 000000000..d5a5f2058 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarInfo.cs @@ -0,0 +1,78 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +/// +/// 日历详情 +/// +public class CalendarInfo +{ + /// + /// 日历ID + /// + [NotNull] + [JsonProperty("cal_id")] + [JsonPropertyName("cal_id")] + public string CalId { get; set; } + /// + /// 日历的管理员userid列表 + /// + [NotNull] + [JsonProperty("admins")] + [JsonPropertyName("admins")] + public string[] Admins { get; set; } + /// + /// 日历标题。1 ~ 128 字符 + /// + [NotNull] + [JsonProperty("summary")] + [JsonPropertyName("summary")] + public string Summary { get; set; } + /// + /// 日历颜色,RGB颜色编码16进制表示,例如:"#0000FF" 表示纯蓝色 + /// + [NotNull] + [JsonProperty("color")] + [JsonPropertyName("color")] + public string Color { get; set; } + /// + /// 日历描述。0 ~ 512 字符 + /// + [CanBeNull] + [JsonProperty("description")] + [JsonPropertyName("description")] + public string? Description { get; set; } + /// + /// 是否公共日历。 + /// + [NotNull] + [JsonProperty("is_public")] + [JsonPropertyName("is_public")] + [Newtonsoft.Json.JsonConverter(typeof(IntToBoolConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(IntToBoolConverter))] + public bool IsPublic { get; set; } + /// + /// 公开范围。仅当是公共日历时有效 + /// + [CanBeNull] + [JsonProperty("public_range")] + [JsonPropertyName("public_range")] + public CalendarPublicRange? PublicRange { get; set; } + /// + /// 是否全员日历。 + /// + [NotNull] + [JsonProperty("is_corp_calendar")] + [JsonPropertyName("is_corp_calendar")] + [Newtonsoft.Json.JsonConverter(typeof(IntToBoolConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(IntToBoolConverter))] + public bool IsCorpCalendar { get; set; } + /// + /// 日历通知范围成员列表。最多2000人 + /// + [NotNull] + [JsonProperty("shares")] + [JsonPropertyName("shares")] + public CalendarShare[] Shares { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarPublicRange.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarPublicRange.cs new file mode 100644 index 000000000..7a3afa6ab --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarPublicRange.cs @@ -0,0 +1,30 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +/// +/// 日历公开范围 +/// +public class CalendarPublicRange +{ + /// + /// 公开的成员列表范围 + /// + [CanBeNull] + [JsonProperty("userids")] + [JsonPropertyName("userids")] + public string[]? UserIds { get; set; } + /// + /// 公开的部门列表范围 + /// + [CanBeNull] + [JsonProperty("partyids")] + [JsonPropertyName("partyids")] + public int[]? PartyIds { get; set; } + public CalendarPublicRange(string[]? userIds = null, int[]? partyIds = null) + { + UserIds = userIds; + PartyIds = partyIds; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarScheduleInfo.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarScheduleInfo.cs new file mode 100644 index 000000000..4ba231ce0 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarScheduleInfo.cs @@ -0,0 +1,18 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +/// +/// 日历日程详情 +/// +public class CalendarScheduleInfo : ScheduleInfo +{ + /// + /// 日程编号,是一个自增数字 + /// + [NotNull] + [JsonProperty("sequence")] + [JsonPropertyName("sequence")] + public ulong Sequence { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarShare.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarShare.cs new file mode 100644 index 000000000..76a04b8fd --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarShare.cs @@ -0,0 +1,25 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +/// +/// 日历通知范围成员 +/// +public class CalendarShare +{ + /// + /// 日历通知范围成员的id + /// + [NotNull] + [JsonProperty("userid")] + [JsonPropertyName("userid")] + public string UserId { get; set; } + /// + /// 日历通知范围成员权限 + /// + [NotNull] + [JsonProperty("permission")] + [JsonPropertyName("permission")] + public CalendarSharePermission Permission { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarSharePermission.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarSharePermission.cs new file mode 100644 index 000000000..d4ef0c12e --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CalendarSharePermission.cs @@ -0,0 +1,20 @@ +using System.ComponentModel; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +/// +/// 日历通知范围成员权限 +/// +[Description("日历通知范围成员权限")] +public enum CalendarSharePermission +{ + /// + /// 可查看 + /// + [Description("可查看")] + View = 1, + /// + /// 仅查看闲忙状态 + /// + [Description("仅查看闲忙状态")] + OnlyBusy = 3 +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CreateCalendar.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CreateCalendar.cs new file mode 100644 index 000000000..6bb44532a --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CreateCalendar.cs @@ -0,0 +1,11 @@ +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +/// +/// 新增日历 +/// +public class CreateCalendar : CreateOrUpdateCalendar +{ + public CreateCalendar(string summary, string color, string? description) + : base(summary, color, description) + { + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CreateOrUpdateCalendar.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CreateOrUpdateCalendar.cs new file mode 100644 index 000000000..3be1e2151 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CreateOrUpdateCalendar.cs @@ -0,0 +1,128 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; + +public abstract class CreateOrUpdateCalendar +{ + /// + /// 日历标题。1 ~ 128 字符 + /// + [NotNull] + [JsonProperty("summary")] + [JsonPropertyName("summary")] + public string Summary { get; } + /// + /// 日历在终端上显示的颜色,RGB颜色编码16进制表示,例如:"#0000FF" 表示纯蓝色 + /// + [NotNull] + [JsonProperty("color")] + [JsonPropertyName("color")] + public string Color { get; } + /// + /// 日历描述。0 ~ 512 字符 + /// + [CanBeNull] + [JsonProperty("description")] + [JsonPropertyName("description")] + public string? Description { get; set; } + /// + /// 日历的管理员userid列表 + /// + [CanBeNull] + [JsonProperty("admins")] + [JsonPropertyName("admins")] + public string[]? Admins { get; set; } + /// + /// 是否将该日历设置为access_token所对应应用的默认日历。 + /// + [NotNull] + [JsonProperty("set_as_default")] + [JsonPropertyName("set_as_default")] + [Newtonsoft.Json.JsonConverter(typeof(IntToBoolConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(IntToBoolConverter))] + public bool SetAsDefault { get; set; } + /// + /// 是否公共日历。0-否;1-是 + /// + [NotNull] + [JsonProperty("is_public")] + [JsonPropertyName("is_public")] + [Newtonsoft.Json.JsonConverter(typeof(IntToBoolConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(IntToBoolConverter))] + public bool IsPublic { get; private set; } + /// + /// 公开范围。仅当是公共日历时有效 + /// + [CanBeNull] + [JsonProperty("public_range")] + [JsonPropertyName("public_range")] + public CalendarPublicRange? PublicRange { get; private set; } + /// + /// 是否全员日历。0-否;1-是 + /// + [NotNull] + [JsonProperty("is_corp_calendar")] + [JsonPropertyName("is_corp_calendar")] + [Newtonsoft.Json.JsonConverter(typeof(IntToBoolConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(IntToBoolConverter))] + public bool IsCorpCalendar { get; private set; } + /// + /// 日历通知范围成员列表。最多2000人 + /// + [CanBeNull] + [JsonProperty("shares")] + [JsonPropertyName("shares")] + public CalendarShare[]? Shares { get; private set; } + protected CreateOrUpdateCalendar(string summary, string color, string? description) + { + Summary = Check.NotNullOrWhiteSpace(summary, nameof(summary), 128, 1); + Color = Check.NotNullOrWhiteSpace(color, nameof(color)); + Description = Check.Length(description, nameof(description), 512); + } + /// + /// 设置公开范围 + /// + /// + public void WithPublic(CalendarPublicRange publicRange) + { + IsPublic = true; + PublicRange = publicRange; + } + /// + /// 设置全员日历 + /// + /// + public void WithCorpCalendar(CalendarShare[] shares) + { + IsCorpCalendar = true; + Shares = shares; + } + /// + /// 验证输入 + /// + /// + public void Validate() + { + Check.Length(Description, nameof(Description), 512); + + if (IsPublic && PublicRange == null) + { + throw new ArgumentException("The public range of the public calendar cannot be null!", nameof(PublicRange)); + } + if (IsCorpCalendar) + { + if (Shares == null) + { + throw new ArgumentException("The shares of the corp calendar cannot be null!", nameof(IsCorpCalendar)); + } + if (Shares.Length > 2000) + { + throw new ArgumentException("Calendar shares member list. Up to 2,000!", nameof(Shares)); + } + } + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CreateOrUpdateSchedule.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CreateOrUpdateSchedule.cs new file mode 100644 index 000000000..84300e4c7 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CreateOrUpdateSchedule.cs @@ -0,0 +1,128 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; + +public abstract class CreateOrUpdateSchedule +{ + /// + /// 日程的管理员userid列表,管理员必须在共享成员的列表中 + /// + /// + /// 最多指定3人 + /// + [CanBeNull] + [JsonProperty("admins")] + [JsonPropertyName("admins")] + public string[]? Admins { get; set; } + /// + /// 日程参与者列表 + /// + /// + /// 最多支持1000人 + /// + [CanBeNull] + [JsonProperty("attendees")] + [JsonPropertyName("attendees")] + public ScheduleAttendee[]? Attendees { get; set; } + /// + /// 日程标题 + /// + /// + /// 0 ~ 128 字符。不填会默认显示为“新建事件” + /// + [CanBeNull] + [JsonProperty("summary")] + [JsonPropertyName("summary")] + public string? Summary { get; set; } + /// + /// 日程描述 + /// + /// + /// 不多于1000个字符 + /// + [CanBeNull] + [JsonProperty("description")] + [JsonPropertyName("description")] + public string? Description { get; set; } + /// + /// 提醒相关信息 + /// + [CanBeNull] + [JsonProperty("reminders")] + [JsonPropertyName("reminders")] + public ScheduleReminder? Reminders { get; set; } + /// + /// 日程地址 + /// + /// + /// 不多于128个字符 + /// + [CanBeNull] + [JsonProperty("location")] + [JsonPropertyName("location")] + public string? Location { get; set; } + /// + /// 日程开始时间,Unix时间戳 + /// + [NotNull] + [JsonProperty("start_time")] + [JsonPropertyName("start_time")] + public long StartTime { get; } + /// + /// 日程结束时间,Unix时间戳 + /// + [NotNull] + [JsonProperty("end_time")] + [JsonPropertyName("end_time")] + public long EndTime { get; } + /// + /// 日程所属日历ID + /// + /// + /// 不多于64字节 + /// + [CanBeNull] + [JsonProperty("cal_id")] + [JsonPropertyName("cal_id")] + public string? CalId { get; set; } + /// + /// 是否全天日程 + /// + [NotNull] + [JsonProperty("is_whole_day")] + [JsonPropertyName("is_whole_day")] + [Newtonsoft.Json.JsonConverter(typeof(IntToBoolConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(IntToBoolConverter))] + public bool? IsWholeDay { get; set; } + protected CreateOrUpdateSchedule(DateTime startTime, DateTime endTime) + { + StartTime = startTime.GetUnixTimeSeconds(); + EndTime = endTime.GetUnixTimeSeconds(); + } + + /// + /// 验证输入 + /// + /// + public void Validate() + { + Check.Length(Summary, nameof(Summary), 128); + Check.Length(Description, nameof(Description), 1000); + Check.Length(Location, nameof(Location), 128); + Check.Length(CalId, nameof(CalId), 64); + + if (Admins?.Length > 3) + { + throw new ArgumentException("Admins list. Up to 3!", nameof(Admins)); + } + + if (Attendees?.Length > 1000) + { + throw new ArgumentException("Attendees list. Up to 1000!", nameof(Attendees)); + } + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CreateSchedule.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CreateSchedule.cs new file mode 100644 index 000000000..1a1b95e88 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/CreateSchedule.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; + +public class CreateSchedule : CreateOrUpdateSchedule +{ + public CreateSchedule(DateTime startTime, DateTime endTime) + : base(startTime, endTime) + { + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleAttendee.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleAttendee.cs new file mode 100644 index 000000000..194253aaf --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleAttendee.cs @@ -0,0 +1,23 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +/// +/// 日程参与者 +/// +public class ScheduleAttendee +{ + /// + /// 日程参与者ID + /// + [NotNull] + [JsonProperty("userid")] + [JsonPropertyName("userid")] + public string UserId { get; } + public ScheduleAttendee(string userId) + { + UserId = Check.NotNullOrWhiteSpace(userId, nameof(userId), 64); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleAttendeeInfo.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleAttendeeInfo.cs new file mode 100644 index 000000000..6c2a2c5ff --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleAttendeeInfo.cs @@ -0,0 +1,25 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +/// +/// 日程参与者详情 +/// +public class ScheduleAttendeeInfo +{ + /// + /// 日程参与者ID + /// + [NotNull] + [JsonProperty("userid")] + [JsonPropertyName("userid")] + public string UserId { get; set; } + /// + /// 日程参与者的接受状态 + /// + [NotNull] + [JsonProperty("response_status")] + [JsonPropertyName("response_status")] + public ScheduleAttendeeResponseStatus ResponseStatus { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleAttendeeResponseStatus.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleAttendeeResponseStatus.cs new file mode 100644 index 000000000..441d56456 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleAttendeeResponseStatus.cs @@ -0,0 +1,35 @@ +using System.ComponentModel; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +/// +/// 日程参与者的接受状态 +/// +[Description("日程参与者的接受状态")] +public enum ScheduleAttendeeResponseStatus : uint +{ + /// + /// 未处理 + /// + [Description("未处理")] + UnProcessed = 0, + /// + /// 待定 + /// + [Description("待定")] + Determined = 1, + /// + /// 全部接受 + /// + [Description("全部接受")] + AcceptAll = 2, + /// + /// 仅接受一次 + /// + [Description("仅接受一次")] + AcceptedOnce = 3, + /// + /// 拒绝 + /// + [Description("拒绝")] + Refuse = 4, +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleDeleteMode.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleDeleteMode.cs new file mode 100644 index 000000000..4c78e9fa6 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleDeleteMode.cs @@ -0,0 +1,25 @@ +using System.ComponentModel; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +/// +/// 日程删除操作模式 +/// +[Description("日程删除操作模式")] +public enum ScheduleDeleteMode : uint +{ + /// + /// 删除所有日程 + /// + [Description("删除所有日程")] + DeleteAll = 0, + /// + /// 仅删除此日程 + /// + [Description("仅删除此日程")] + DeleteThisSchedule = 1, + /// + /// 删除本次及后续日程 + /// + [Description("删除本次及后续日程")] + DeleteAllFutureSchedules = 2, +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleInfo.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleInfo.cs new file mode 100644 index 000000000..6e453bc97 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleInfo.cs @@ -0,0 +1,103 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +/// +/// 日程详情 +/// +public class ScheduleInfo +{ + /// + /// 日程ID + /// + [NotNull] + [JsonProperty("schedule_id")] + [JsonPropertyName("schedule_id")] + public string ScheduleId { get; set; } + /// + /// 管理员userid列表 + /// + [NotNull] + [JsonProperty("admins")] + [JsonPropertyName("admins")] + public string[] Admins { get; set; } + /// + /// 日程参与者列表 + /// + [NotNull] + [JsonProperty("attendees")] + [JsonPropertyName("attendees")] + public ScheduleAttendeeInfo[] Attendees { get; set; } + /// + /// 日程标题 + /// + [NotNull] + [JsonProperty("summary")] + [JsonPropertyName("summary")] + public string Summary { get; set; } + /// + /// 日程描述 + /// + [CanBeNull] + [JsonProperty("description")] + [JsonPropertyName("description")] + public string? Description { get; set; } + /// + /// 提醒相关信息 + /// + [CanBeNull] + [JsonProperty("reminders")] + [JsonPropertyName("reminders")] + public ScheduleReminder? Reminders { get; set; } + /// + /// 日程地址 + /// + /// + /// 不多于128个字符 + /// + [CanBeNull] + [JsonProperty("location")] + [JsonPropertyName("location")] + public string? Location { get; set; } + /// + /// 日程状态 + /// + [NotNull] + [JsonProperty("status")] + [JsonPropertyName("status")] + public ScheduleStatus Status { get; set; } + /// + /// 日程开始时间,Unix时间戳 + /// + [NotNull] + [JsonProperty("start_time")] + [JsonPropertyName("start_time")] + public long StartTime { get; set; } + /// + /// 日程结束时间,Unix时间戳 + /// + [NotNull] + [JsonProperty("end_time")] + [JsonPropertyName("end_time")] + public long EndTime { get; set; } + /// + /// 是否全天日程 + /// + [NotNull] + [JsonProperty("is_whole_day")] + [JsonPropertyName("is_whole_day")] + [Newtonsoft.Json.JsonConverter(typeof(IntToBoolConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(IntToBoolConverter))] + public bool IsWholeDay { get; set; } + /// + /// 日程所属日历ID + /// + /// + /// 不多于64字节 + /// + [CanBeNull] + [JsonProperty("cal_id")] + [JsonPropertyName("cal_id")] + public string? CalId { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleReminder.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleReminder.cs new file mode 100644 index 000000000..80c31fcd0 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleReminder.cs @@ -0,0 +1,139 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +/// +/// 日程提醒 +/// +public class ScheduleReminder +{ + /// + /// 是否需要提醒 + /// + [NotNull] + [JsonProperty("is_remind")] + [JsonPropertyName("is_remind")] + [Newtonsoft.Json.JsonConverter(typeof(IntToBoolConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(IntToBoolConverter))] + public bool IsRemind { get; set; } + /// + /// 是否重复日程 + /// + [NotNull] + [JsonProperty("is_repeat")] + [JsonPropertyName("is_repeat")] + [Newtonsoft.Json.JsonConverter(typeof(IntToBoolConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(IntToBoolConverter))] + public bool IsRepeat { get; set; } + /// + /// 日程开始(start_time)前多少秒提醒,当is_remind为1时有效。例如: 300表示日程开始前5分钟提醒。目前仅支持以下数值: + /// + /// 0 - 事件开始时 + /// 300 - 事件开始前5分钟 + /// 900 - 事件开始前15分钟 + /// 3600 - 事件开始前1小时 + /// 86400 - 事件开始前1天 + /// + /// + /// + /// 注意:建议使用 remind_time_diffs 字段,该字段后续将会废弃。 + /// + [CanBeNull] + [JsonProperty("remind_before_event_secs")] + [JsonPropertyName("remind_before_event_secs")] + public uint? RemindBeforeEventSecs { get; set; } + /// + /// 提醒时间与日程开始时间(start_time)的差值,当 IsRemind 为true时有效。例如:-300表示日程开始前5分钟提醒。 + /// + /// + /// 特殊情况:企业微信终端设置的“全天”类型的日程,由于start_time是0点时间戳,提醒如果设置了当天9点,则会出现正数32400。 + /// 取值范围:-604800 ~ 86399 + /// + [CanBeNull] + [JsonProperty("remind_time_diffs")] + [JsonPropertyName("remind_time_diffs")] + public int[]? RemindTimeDiffs { get; set; } + /// + /// 重复类型,当 IsRepeat 为true时有效 + /// + [CanBeNull] + [JsonProperty("repeat_type")] + [JsonPropertyName("repeat_type")] + public ScheduleReminderRepeatType? RepeatType { get; set; } + /// + /// 重复结束时刻,Unix时间戳。不填或填0表示一直重复 + /// + [CanBeNull] + [JsonProperty("repeat_until")] + [JsonPropertyName("repeat_until")] + public long? RepeatUntil { get; set; } + /// + /// 是否自定义重复 + /// + [NotNull] + [JsonProperty("is_custom_repeat")] + [JsonPropertyName("is_custom_repeat")] + [Newtonsoft.Json.JsonConverter(typeof(IntToBoolConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(IntToBoolConverter))] + public bool IsCustomRepeat { get; set; } + /// + /// 重复间隔 + /// + /// + /// 仅当指定为自定义重复时有效。 + /// 该字段随repeat_type不同而含义不同。 + /// 例如: + /// repeat_interval指定为2,repeat_type指定为每周重复,那么每2周重复一次; + /// repeat_interval指定为2,repeat_type指定为每月重复,那么每2月重复一次 + /// + [CanBeNull] + [JsonProperty("repeat_interval")] + [JsonPropertyName("repeat_interval")] + public uint? RepeatInterval { get; set; } + /// + /// 每周周几重复 + /// + /// + /// 仅当指定为自定义重复且重复类型为每周时有效。 + /// 取值范围:1 ~ 7,分别表示周一至周日 + /// + [CanBeNull] + [JsonProperty("repeat_day_of_week")] + [JsonPropertyName("repeat_day_of_week")] + public uint[]? RepeatDayOfWeek { get; set; } + /// + /// 每月哪几天重复 + /// + /// + /// 仅当指定为自定义重复且重复类型为每月时有效。 + /// 取值范围:1 ~ 31,分别表示1~31号 + /// + [CanBeNull] + [JsonProperty("repeat_day_of_month")] + [JsonPropertyName("repeat_day_of_month")] + public uint[]? RepeatDayOfMonth { get; set; } + /// + /// 时区。 + /// + /// + /// UTC偏移量表示(即偏离零时区的小时数),东区为正数,西区为负数。 + /// 例如:+8 表示北京时间东八区 + /// 默认为北京时间东八区 + /// 取值范围:-12 ~ +12 + /// + [CanBeNull] + [JsonProperty("timezone")] + [JsonPropertyName("timezone")] + public uint? TimeZone { get; set; } + /// + /// 重复日程不包含的日期列表。 + /// + /// + /// 对重复日程修改/删除特定一天或多天,则原来的日程将会排除对应的日期。 + /// + [CanBeNull] + [JsonProperty("exclude_time_list")] + [JsonPropertyName("exclude_time_list")] + public ScheduleReminderExcludeTime[]? ExcludeTimeList { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleReminderExcludeTime.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleReminderExcludeTime.cs new file mode 100644 index 000000000..02e39b478 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleReminderExcludeTime.cs @@ -0,0 +1,18 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +/// +/// 重复日程不包含的日期 +/// +public class ScheduleReminderExcludeTime +{ + /// + /// 不包含的日期时间戳 + /// + [NotNull] + [JsonProperty("start_time")] + [JsonPropertyName("start_time")] + public long StartTime { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleReminderRepeatType.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleReminderRepeatType.cs new file mode 100644 index 000000000..ba99420f0 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleReminderRepeatType.cs @@ -0,0 +1,35 @@ +using System.ComponentModel; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +/// +/// 重复类型 +/// +[Description("重复类型")] +public enum ScheduleReminderRepeatType : uint +{ + /// + /// 每日 + /// + [Description("每日")] + Daily = 0, + /// + /// 每周 + /// + [Description("每周")] + Weekly = 1, + /// + /// 每月 + /// + [Description("每月")] + EveryMonth = 2, + /// + /// 每年 + /// + [Description("每年")] + EveryYear = 5, + /// + /// 工作日 + /// + [Description("工作日")] + WorkingDays = 7, +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleStatus.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleStatus.cs new file mode 100644 index 000000000..465b9dca3 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleStatus.cs @@ -0,0 +1,20 @@ +using System.ComponentModel; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +/// +/// 日程状态 +/// +[Description("日程状态")] +public enum ScheduleStatus : uint +{ + /// + /// 正常 + /// + [Description("正常")] + Normal = 0, + /// + /// 已取消 + /// + [Description("已取消")] + Cancelled = 1, +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleUpdateMode.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleUpdateMode.cs new file mode 100644 index 000000000..87e30cefe --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/ScheduleUpdateMode.cs @@ -0,0 +1,25 @@ +using System.ComponentModel; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +/// +/// 日程更新操作模式 +/// +[Description("日程更新操作模式")] +public enum ScheduleUpdateMode : uint +{ + /// + /// 全部修改 + /// + [Description("全部修改")] + ModifyAll = 0, + /// + /// 仅修改此日程 + /// + [Description("仅修改此日程")] + ModifyThisSchedule = 1, + /// + /// 修改将来的所有日程 + /// + [Description("修改将来的所有日程")] + ModifyAllFutureSchedules = 2, +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/UpdateCalendar.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/UpdateCalendar.cs new file mode 100644 index 000000000..5b7f74cfc --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/UpdateCalendar.cs @@ -0,0 +1,29 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +/// +/// 更新日历 +/// +public class UpdateCalendar : CreateOrUpdateCalendar +{ + /// + /// 日历ID + /// + [NotNull] + [JsonProperty("cal_id")] + [JsonPropertyName("cal_id")] + public string CalId { get; } + + public UpdateCalendar( + string calId, + string summary, + string color, + string? description) + : base(summary, color, description) + { + CalId = Check.NotNullOrWhiteSpace(calId, nameof(calId)); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/UpdateSchedule.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/UpdateSchedule.cs new file mode 100644 index 000000000..0ec4bf89a --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Models/UpdateSchedule.cs @@ -0,0 +1,30 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; + +public class UpdateSchedule : CreateOrUpdateSchedule +{ + /// + /// 日程ID + /// + /// + /// 创建日程时返回的ID + /// + [NotNull] + [JsonProperty("schedule_id")] + [JsonPropertyName("schedule_id")] + public string ScheduleId { get; } + + public UpdateSchedule( + string scheduleId, + DateTime startTime, + DateTime endTime) + : base(startTime, endTime) + { + ScheduleId = Check.NotNullOrWhiteSpace(scheduleId, nameof(scheduleId)); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkCreateCalendarRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkCreateCalendarRequest.cs new file mode 100644 index 000000000..b12915458 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkCreateCalendarRequest.cs @@ -0,0 +1,41 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Request; +/// +/// 创建日历请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkCreateCalendarRequest : WeChatWorkRequest +{ + /// + /// 日历信息 + /// + [NotNull] + [JsonProperty("calendar")] + [JsonPropertyName("calendar")] + public CreateCalendar Calendar { get; } + /// + /// 授权方安装的应用agentid。仅旧的第三方多应用套件需要填此参数 + /// + [CanBeNull] + [JsonProperty("agentid")] + [JsonPropertyName("agentid")] + public int? AgentId { get; set; } + public WeChatWorkCreateCalendarRequest(CreateCalendar calendar) + { + Calendar = calendar; + } + + protected override void Validate() + { + Check.NotNull(Calendar, nameof(Calendar)); + + Calendar.Validate(); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkCreateScheduleRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkCreateScheduleRequest.cs new file mode 100644 index 000000000..c456e59dd --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkCreateScheduleRequest.cs @@ -0,0 +1,41 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Request; +/// +/// 创建日程请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkCreateScheduleRequest : WeChatWorkRequest +{ + /// + /// 日历信息 + /// + [NotNull] + [JsonProperty("schedule")] + [JsonPropertyName("schedule")] + public CreateSchedule Schedule { get; } + /// + /// 授权方安装的应用agentid。仅旧的第三方多应用套件需要填此参数 + /// + [CanBeNull] + [JsonProperty("agentid")] + [JsonPropertyName("agentid")] + public int? AgentId { get; set; } + public WeChatWorkCreateScheduleRequest(CreateSchedule schedule) + { + Schedule = schedule; + } + + protected override void Validate() + { + Check.NotNull(Schedule, nameof(Schedule)); + + Schedule.Validate(); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkDeleteCalendarRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkDeleteCalendarRequest.cs new file mode 100644 index 000000000..f18bc7e46 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkDeleteCalendarRequest.cs @@ -0,0 +1,26 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Request; +/// +/// 删除日历请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkDeleteCalendarRequest : WeChatWorkRequest +{ + /// + /// 日历ID + /// + [NotNull] + [JsonProperty("cal_id")] + [JsonPropertyName("cal_id")] + public string CalId { get; } + public WeChatWorkDeleteCalendarRequest(string calId) + { + CalId = Check.NotNullOrWhiteSpace(calId, nameof(calId)); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkDeleteScheduleRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkDeleteScheduleRequest.cs new file mode 100644 index 000000000..e50767fa2 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkDeleteScheduleRequest.cs @@ -0,0 +1,67 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +using Newtonsoft.Json; +using System; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Request; +/// +/// 取消日程请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkDeleteScheduleRequest : WeChatWorkRequest +{ + /// + /// 日程ID + /// + [NotNull] + [JsonProperty("schedule_id")] + [JsonPropertyName("schedule_id")] + public string ScheduleId { get; } + /// + /// 操作模式。 + /// + /// + /// 是重复日程时有效。 + /// + [CanBeNull] + [JsonProperty("op_mode")] + [JsonPropertyName("op_mode")] + public ScheduleDeleteMode? OpMode { get; private set; } + /// + /// 操作起始时间。 + /// + /// + /// 仅当操作模式是 DeleteThisSchedule 或 DeleteAllFutureSchedules 时有效。 + /// 该时间必须是重复日程的某一次开始时间。 + /// + [CanBeNull] + [JsonProperty("op_start_time")] + [JsonPropertyName("op_start_time")] + public long? OpStartTime { get; private set; } + public WeChatWorkDeleteScheduleRequest(string scheduleId) + { + ScheduleId = Check.NotNullOrWhiteSpace(scheduleId, nameof(scheduleId)); + } + /// + /// 删除此日程起始时间 + /// + /// + public void DeleteThisSchedule(DateTime startTime) + { + OpMode = ScheduleDeleteMode.DeleteThisSchedule; + OpStartTime = startTime.GetUnixTimeSeconds(); + } + /// + /// 删除所有日程起始时间 + /// + /// + public void DeleteAllFutureSchedules(DateTime startTime) + { + OpMode = ScheduleDeleteMode.DeleteAllFutureSchedules; + OpStartTime = startTime.GetUnixTimeSeconds(); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkGetCalendarListRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkGetCalendarListRequest.cs new file mode 100644 index 000000000..d4d20cc81 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkGetCalendarListRequest.cs @@ -0,0 +1,47 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Request; +/// +/// 获取日历详情请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetCalendarListRequest : WeChatWorkRequest +{ + private List _calIdList = new List(); + /// + /// 日历ID列表,调用创建日历接口后获得。一次最多可获取1000条 + /// + [NotNull] + [JsonProperty("cal_id_list")] + [JsonPropertyName("cal_id_list")] + public string[] CalIdList => _calIdList.ToArray(); + public WeChatWorkGetCalendarListRequest(string[] calIdList) + { + Check.NotNullOrEmpty(calIdList, nameof(calIdList)); + + _calIdList.AddIfNotContains(calIdList); + } + /// + /// 添加日历Id + /// + /// + public void WithCalId(params string[] calIdList) + { + _calIdList.AddIfNotContains(calIdList); + } + + protected override void Validate() + { + if (CalIdList.Length > 2000) + { + throw new ArgumentException("A single calendar query can obtain up to 1,000 entries at most!", nameof(CalIdList)); + } + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkGetScheduleListByCalendarRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkGetScheduleListByCalendarRequest.cs new file mode 100644 index 000000000..f7082563a --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkGetScheduleListByCalendarRequest.cs @@ -0,0 +1,51 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Request; +/// +/// 获取日历下的日程列表请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetScheduleListByCalendarRequest : WeChatWorkRequest +{ + /// + /// 日历ID + /// + [NotNull] + [JsonProperty("cal_id")] + [JsonPropertyName("cal_id")] + public string CalId { get; } + /// + /// 分页,偏移量, 默认为0 + /// + [NotNull] + [JsonProperty("offset")] + [JsonPropertyName("offset")] + public int Offset { get; } + /// + /// 分页,预期请求的数据量,默认为500,取值范围 1 ~ 1000 + /// + [NotNull] + [JsonProperty("limit")] + [JsonPropertyName("limit")] + public int Limit { get; } + public WeChatWorkGetScheduleListByCalendarRequest(string calId, int offset = 0, int limit = 500) + { + CalId = Check.NotNullOrWhiteSpace(calId, nameof(calId)); + Offset = offset; + Limit = limit; + + if (Limit <= 0) + { + Limit = 1; + } + if (Limit > 1000) + { + Limit = 1000; + } + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkGetScheduleListRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkGetScheduleListRequest.cs new file mode 100644 index 000000000..f295e0288 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkGetScheduleListRequest.cs @@ -0,0 +1,47 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Request; +/// +/// 获取日程详情请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetScheduleListRequest : WeChatWorkRequest +{ + private List _scheduleIdList = new List(); + /// + /// 日程ID列表。一次最多拉取1000条 + /// + [NotNull] + [JsonProperty("schedule_id_list")] + [JsonPropertyName("schedule_id_list")] + public string[] ScheduleIdList => _scheduleIdList.ToArray(); + public WeChatWorkGetScheduleListRequest(string[] calIdList) + { + Check.NotNullOrEmpty(calIdList, nameof(calIdList)); + + _scheduleIdList.AddIfNotContains(calIdList); + } + /// + /// 添加日历Id + /// + /// + public void WithCalId(params string[] calIdList) + { + _scheduleIdList.AddIfNotContains(calIdList); + } + + protected override void Validate() + { + if (ScheduleIdList.Length > 2000) + { + throw new ArgumentException("A single schedule query can obtain up to 1,000 entries at most!", nameof(ScheduleIdList)); + } + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkScheduleAddAttendeesRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkScheduleAddAttendeesRequest.cs new file mode 100644 index 000000000..c6d17b965 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkScheduleAddAttendeesRequest.cs @@ -0,0 +1,13 @@ +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Request; +/// +/// 新增日程参与者请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkScheduleAddAttendeesRequest : WeChatWorkScheduleChangeAttendeesRequest +{ + public WeChatWorkScheduleAddAttendeesRequest(string scheduleId) : base(scheduleId) + { + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkScheduleChangeAttendeesRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkScheduleChangeAttendeesRequest.cs new file mode 100644 index 000000000..ed1501a5c --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkScheduleChangeAttendeesRequest.cs @@ -0,0 +1,69 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Request; + +public abstract class WeChatWorkScheduleChangeAttendeesRequest : WeChatWorkRequest +{ + private List _attendees = new List(); + /// + /// 日程ID。 + /// + /// + /// 创建日程时返回的ID + /// + [NotNull] + [JsonProperty("schedule_id")] + [JsonPropertyName("schedule_id")] + public string ScheduleId { get; } + /// + /// 日程参与者列表 + /// + /// + /// 累计最多支持1000人 + /// + [CanBeNull] + [JsonProperty("attendees")] + [JsonPropertyName("attendees")] + public ScheduleAttendee[]? Attendees { + get { + if (_attendees.Count > 0) + { + return _attendees.ToArray(); + } + return null; + } + } + protected WeChatWorkScheduleChangeAttendeesRequest(string scheduleId) + { + ScheduleId = Check.NotNullOrWhiteSpace(scheduleId, nameof(scheduleId)); + } + + /// + /// 添加一个日程参与者 + /// + /// + public void AddAttendee(string userId) + { + _attendees.Add(new ScheduleAttendee(userId)); + } + /// + /// 移除一个日程参与者 + /// + /// + public void RemoveAttendee(string userId) + { + _attendees.RemoveAll(x => x.UserId == userId); + } + /// + /// 清空日程参与者 + /// + public void ClearAttendee() + { + _attendees.Clear(); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkScheduleDeleteAttendeesRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkScheduleDeleteAttendeesRequest.cs new file mode 100644 index 000000000..b6dc5fed7 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkScheduleDeleteAttendeesRequest.cs @@ -0,0 +1,13 @@ +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Request; +/// +/// 删除日程参与者 +/// +/// +/// 详情见: +/// +public class WeChatWorkScheduleDeleteAttendeesRequest : WeChatWorkScheduleChangeAttendeesRequest +{ + public WeChatWorkScheduleDeleteAttendeesRequest(string scheduleId) : base(scheduleId) + { + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkUpdateCalendarRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkUpdateCalendarRequest.cs new file mode 100644 index 000000000..e0710c2ed --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkUpdateCalendarRequest.cs @@ -0,0 +1,42 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Request; +/// +/// 更新日历请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkUpdateCalendarRequest : WeChatWorkRequest +{ + /// + /// 日历信息 + /// + [NotNull] + [JsonProperty("calendar")] + [JsonPropertyName("calendar")] + public UpdateCalendar Calendar { get; } + /// + /// 是否不更新可订阅范围。0-否;1-是。默认会为0,会更新可订阅范围 + /// + [CanBeNull] + [JsonProperty("skip_public_range")] + [JsonPropertyName("skip_public_range")] + public uint? SkipPublicRange { get; } + public WeChatWorkUpdateCalendarRequest(UpdateCalendar calendar, bool skipPublicRange = false) + { + Calendar = calendar; + SkipPublicRange = skipPublicRange ? 1u : 0u; + } + + protected override void Validate() + { + Check.NotNull(Calendar, nameof(Calendar)); + + Calendar.Validate(); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkUpdateScheduleRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkUpdateScheduleRequest.cs new file mode 100644 index 000000000..af9a87c3c --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Request/WeChatWorkUpdateScheduleRequest.cs @@ -0,0 +1,84 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +using Newtonsoft.Json; +using System; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Request; +/// +/// 更新日程请求参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkUpdateScheduleRequest : WeChatWorkRequest +{ + /// + /// 日程信息 + /// + [NotNull] + [JsonProperty("schedule")] + [JsonPropertyName("schedule")] + public UpdateSchedule Schedule { get; } + /// + /// 是否不更新参与人 + /// + [CanBeNull] + [JsonProperty("skip_attendees")] + [JsonPropertyName("skip_attendees")] + public uint? SkipAttendees { get; } + /// + /// 操作模式。 + /// + /// + /// 是重复日程时有效。 + /// + [CanBeNull] + [JsonProperty("op_mode")] + [JsonPropertyName("op_mode")] + public ScheduleUpdateMode? OpMode { get; private set; } + /// + /// 操作起始时间。 + /// + /// + /// 仅当操作模式是 OnlyModifyThisSchedule 或 ModifyAllFutureSchedules 时有效。 + /// 该时间必须是重复日程的某一次开始时间。 + /// 例如: + /// 假如日程开始时间start_time为1661990950(2022-09-01 08:09:10),且重复类型是每周,那么op_start_time可以是:1661990950(2022-09-01 08:09:10)、1662595750(2022-09-08 08:09:10)、1663200550(2022-09-15 08:09:10)...... + /// + [CanBeNull] + [JsonProperty("op_start_time")] + [JsonPropertyName("op_start_time")] + public long? OpStartTime { get; private set; } + public WeChatWorkUpdateScheduleRequest(UpdateSchedule schedule, bool skipAttendees = false) + { + Schedule = schedule; + SkipAttendees = skipAttendees ? 1u : 0u; + } + /// + /// 修改此日程起始时间 + /// + /// + public void ModifyThisSchedule(DateTime startTime) + { + OpMode = ScheduleUpdateMode.ModifyThisSchedule; + OpStartTime = startTime.GetUnixTimeSeconds(); + } + /// + /// 修改所有日程起始时间 + /// + /// + public void ModifyAllFutureSchedules(DateTime startTime) + { + OpMode = ScheduleUpdateMode.ModifyAllFutureSchedules; + OpStartTime = startTime.GetUnixTimeSeconds(); + } + + protected override void Validate() + { + Check.NotNull(Schedule, nameof(Schedule)); + + Schedule.Validate(); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkCreateCalendarResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkCreateCalendarResponse.cs new file mode 100644 index 000000000..af72dd826 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkCreateCalendarResponse.cs @@ -0,0 +1,29 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Response; +/// +/// 创建日历响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkCreateCalendarResponse : WeChatWorkResponse +{ + /// + /// 日历ID + /// + [NotNull] + [JsonProperty("cal_id")] + [JsonPropertyName("cal_id")] + public string CalId { get; set; } + /// + /// 无效的输入内容 + /// + [NotNull] + [JsonProperty("fail_result")] + [JsonPropertyName("fail_result")] + public CalendarFailResult FailResult { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkCreateScheduleResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkCreateScheduleResponse.cs new file mode 100644 index 000000000..66135f8f6 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkCreateScheduleResponse.cs @@ -0,0 +1,21 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Response; +/// +/// 创建日程响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkCreateScheduleResponse : WeChatWorkResponse +{ + /// + /// 日程ID + /// + [NotNull] + [JsonProperty("schedule_id")] + [JsonPropertyName("schedule_id")] + public string ScheduleId { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkGetCalendarListResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkGetCalendarListResponse.cs new file mode 100644 index 000000000..711e1698f --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkGetCalendarListResponse.cs @@ -0,0 +1,22 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Response; +/// +/// 获取日历详情响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetCalendarListResponse : WeChatWorkResponse +{ + /// + /// 日历列表 + /// + [NotNull] + [JsonProperty("calendar_list")] + [JsonPropertyName("calendar_list")] + public CalendarInfo[] CalendarList { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkGetScheduleListByCalendarResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkGetScheduleListByCalendarResponse.cs new file mode 100644 index 000000000..7cd960d14 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkGetScheduleListByCalendarResponse.cs @@ -0,0 +1,22 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Response; +/// +/// 获取日历下的日程列表响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetScheduleListByCalendarResponse : WeChatWorkResponse +{ + /// + /// 日程列表 + /// + [NotNull] + [JsonProperty("schedule_list")] + [JsonPropertyName("schedule_list")] + public CalendarScheduleInfo[] ScheduleList { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkGetScheduleListResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkGetScheduleListResponse.cs new file mode 100644 index 000000000..b59e9b977 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkGetScheduleListResponse.cs @@ -0,0 +1,22 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Response; +/// +/// 获取日程详情响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkGetScheduleListResponse : WeChatWorkResponse +{ + /// + /// 日程列表 + /// + [NotNull] + [JsonProperty("schedule_list")] + [JsonPropertyName("schedule_list")] + public ScheduleInfo[] ScheduleList { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkUpdateCalendarResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkUpdateCalendarResponse.cs new file mode 100644 index 000000000..95df2183b --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkUpdateCalendarResponse.cs @@ -0,0 +1,22 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Response; +/// +/// 更新日历响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkUpdateCalendarResponse : WeChatWorkResponse +{ + /// + /// 无效的输入内容 + /// + [NotNull] + [JsonProperty("fail_result")] + [JsonPropertyName("fail_result")] + public CalendarFailResult FailResult { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkUpdateScheduleResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkUpdateScheduleResponse.cs new file mode 100644 index 000000000..11f71ce92 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/Response/WeChatWorkUpdateScheduleResponse.cs @@ -0,0 +1,24 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules.Response; +/// +/// 更新日程响应参数 +/// +/// +/// 详情见: +/// +public class WeChatWorkUpdateScheduleResponse : WeChatWorkResponse +{ + /// + /// 修改重复日程新产生的日程ID。 + /// + /// + /// 对于重复日程,如果不是修改全部周期,会修剪原重复日程,产生新的重复日程,此时会返回新日程的ID + /// + [NotNull] + [JsonProperty("schedule_id")] + [JsonPropertyName("schedule_id")] + public string ScheduleId { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/WeChatWorkCalendarProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/WeChatWorkCalendarProvider.cs new file mode 100644 index 000000000..9c4732592 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/WeChatWorkCalendarProvider.cs @@ -0,0 +1,76 @@ +using LINGYUN.Abp.WeChat.Work.OA.Features; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Request; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Response; +using LINGYUN.Abp.WeChat.Work.Token; +using Microsoft.Extensions.DependencyInjection; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Features; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules; + +[RequiresFeature(WeChatWorkOAFeatureNames.Enable)] +public class WeChatWorkCalendarProvider : IWeChatWorkCalendarProvider, ISingletonDependency +{ + protected IHttpClientFactory HttpClientFactory { get; } + protected IWeChatWorkTokenProvider WeChatWorkTokenProvider { get; } + + public WeChatWorkCalendarProvider( + IHttpClientFactory httpClientFactory, + IWeChatWorkTokenProvider weChatWorkTokenProvider) + { + HttpClientFactory = httpClientFactory; + WeChatWorkTokenProvider = weChatWorkTokenProvider; + } + + public async virtual Task CreateCalendarAsync( + WeChatWorkCreateCalendarRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.CreateCalendarAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task UpdateCalendarAsync( + WeChatWorkUpdateCalendarRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.UpdateCalendarAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task GetCalendarListAsync( + WeChatWorkGetCalendarListRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.GetCalendarListAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task DeleteCalendarAsync( + WeChatWorkDeleteCalendarRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.DeleteCalendarAsync(token.AccessToken, request, cancellationToken); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/WeChatWorkScheduleProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/WeChatWorkScheduleProvider.cs new file mode 100644 index 000000000..9a836136f --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/LINGYUN/Abp/WeChat/Work/OA/Schedules/WeChatWorkScheduleProvider.cs @@ -0,0 +1,112 @@ +using LINGYUN.Abp.WeChat.Work.OA.Features; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Request; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Response; +using LINGYUN.Abp.WeChat.Work.Token; +using Microsoft.Extensions.DependencyInjection; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Features; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules; + +[RequiresFeature(WeChatWorkOAFeatureNames.Enable)] +public class WeChatWorkScheduleProvider : IWeChatWorkScheduleProvider, ISingletonDependency +{ + protected IHttpClientFactory HttpClientFactory { get; } + protected IWeChatWorkTokenProvider WeChatWorkTokenProvider { get; } + + public WeChatWorkScheduleProvider( + IHttpClientFactory httpClientFactory, + IWeChatWorkTokenProvider weChatWorkTokenProvider) + { + HttpClientFactory = httpClientFactory; + WeChatWorkTokenProvider = weChatWorkTokenProvider; + } + + public async virtual Task CreateScheduleAsync( + WeChatWorkCreateScheduleRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.CreateScheduleAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task UpdateScheduleAsync( + WeChatWorkUpdateScheduleRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.UpdateScheduleAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task AddAttendeesAsync( + WeChatWorkScheduleAddAttendeesRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.AddAttendeesAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task DeleteAttendeesAsync( + WeChatWorkScheduleDeleteAttendeesRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.DeleteAttendeesAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task GetScheduleListByCalendarAsync( + WeChatWorkGetScheduleListByCalendarRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.GetScheduleListByCalendarAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task GetScheduleListAsync( + WeChatWorkGetScheduleListRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.GetScheduleListAsync(token.AccessToken, request, cancellationToken); + } + + public async virtual Task DeleteScheduleAsync( + WeChatWorkDeleteScheduleRequest request, + CancellationToken cancellationToken = default) + { + Check.NotNull(request, nameof(request)); + + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateWeChatWorkApiClient(); + + return await client.DeleteScheduleAsync(token.AccessToken, request, cancellationToken); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/Newtonsoft/Json/ControlNewtonsoftJsonConverter.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/Newtonsoft/Json/ControlNewtonsoftJsonConverter.cs similarity index 74% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/Newtonsoft/Json/ControlNewtonsoftJsonConverter.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/Newtonsoft/Json/ControlNewtonsoftJsonConverter.cs index ba9bc173b..07f6412a8 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/Newtonsoft/Json/ControlNewtonsoftJsonConverter.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/Newtonsoft/Json/ControlNewtonsoftJsonConverter.cs @@ -1,4 +1,4 @@ -using LINGYUN.Abp.WeChat.Work.Approvals.Models; +using LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; using Newtonsoft.Json.Linq; using System; @@ -7,17 +7,17 @@ internal class ControlNewtonsoftJsonConverter : JsonConverter { public override bool CanWrite => true; - public override void WriteJson(JsonWriter writer, Control value, JsonSerializer serializer) + public override void WriteJson(JsonWriter writer, Control? value, JsonSerializer serializer) { writer.WriteStartObject(); - if (value.Property != null) + if (value?.Property != null) { writer.WritePropertyName("property"); serializer.Serialize(writer, value.Property); } - if (value.Config != null) + if (value?.Config != null) { writer.WritePropertyName("config"); serializer.Serialize(writer, value.Config, value.Config.GetType()); @@ -26,7 +26,7 @@ internal class ControlNewtonsoftJsonConverter : JsonConverter writer.WriteEndObject(); } - public override Control ReadJson(JsonReader reader, Type objectType, Control existingValue, bool hasExistingValue, JsonSerializer serializer) + public override Control? ReadJson(JsonReader reader, Type objectType, Control existingValue, bool hasExistingValue, JsonSerializer serializer) { var jObject = JObject.Load(reader); @@ -34,7 +34,7 @@ internal class ControlNewtonsoftJsonConverter : JsonConverter if (jObject.TryGetValue("property", out var propertyToken)) { - control.Property = propertyToken.ToObject(serializer); + control.Property = propertyToken.ToObject(serializer)!; } // 根据 Control 类型动态反序列化 Config if (jObject.TryGetValue("config", out var configToken) && configToken.Type != JTokenType.Null) diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/README.md b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/README.md new file mode 100644 index 000000000..c5e4ee87f --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/README.md @@ -0,0 +1,38 @@ +# LINGYUN.Abp.WeChat.Work.OA + +企业微信办公模块,提供企业微信应用开发的办公模块功能实现。 + +## 功能特性 + + +## 模块引用 + +```csharp +[DependsOn(typeof(AbpWeChatWorkOAModule))] +public class YouProjectModule : AbpModule +{ + // other +} +``` + +## 配置项 + + +## 消息处理 + + +## 事件处理 + +* [会议室预定事件](https://developer.work.weixin.qq.com/document/path/95333#%E4%BC%9A%E8%AE%AE%E5%AE%A4%E9%A2%84%E5%AE%9A%E4%BA%8B%E4%BB%B6) +* [会议室取消事件](https://developer.work.weixin.qq.com/document/path/95333#%E4%BC%9A%E8%AE%AE%E5%AE%A4%E5%8F%96%E6%B6%88%E4%BA%8B%E4%BB%B6) +* [删除日历事件](https://developer.work.weixin.qq.com/document/path/97728) +* [修改日历事件](https://developer.work.weixin.qq.com/document/path/97730) +* [修改日程事件](https://developer.work.weixin.qq.com/document/path/97731) +* [删除日程事件](https://developer.work.weixin.qq.com/document/path/97732) +* [日程回执事件](https://developer.work.weixin.qq.com/document/path/98111) + + +## 更多文档 + +* [企业微信日程文档](https://developer.work.weixin.qq.com/document/path/93624) +* [企业微信会议室文档](https://developer.work.weixin.qq.com/document/path/93618) diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/DateTimeTimeStampExtenssions.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/DateTimeTimeStampExtenssions.cs new file mode 100644 index 000000000..f2b637020 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/DateTimeTimeStampExtenssions.cs @@ -0,0 +1,15 @@ +namespace System; + +internal static class DateTimeTimeStampExtenssions +{ + private readonly static DateTime _beginUnixTime = new DateTime(1970, 1, 1); + /// + /// 获取Unix时间戳(秒) + /// + /// + /// + public static long GetUnixTimeSeconds(this DateTime dateTime) + { + return (long)(dateTime - _beginUnixTime).TotalSeconds; + } +} 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.OA/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Approval.cs similarity index 61% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Approval.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Approval.cs index afed091c8..2f5d9b2d3 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Approval.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Approval.cs @@ -1,4 +1,6 @@ -using LINGYUN.Abp.WeChat.Work.Approvals.Request; +using LINGYUN.Abp.WeChat.Work; +using LINGYUN.Abp.WeChat.Work.OA.Approvals.Request; +using LINGYUN.Abp.WeChat.Work.OA.Approvals.Response; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -6,7 +8,7 @@ using System.Threading.Tasks; namespace System.Net.Http; internal static partial class HttpClientWeChatWorkRequestExtensions { - public async static Task ApplyEventAsync( + public async static Task ApplyEventAsync( this HttpMessageInvoker client, string accessToken, WeChatWorkApplyEventRequest request, @@ -16,17 +18,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions urlBuilder.Append("/cgi-bin/oa/applyevent"); urlBuilder.AppendFormat("?access_token={0}", accessToken); - var httpRequest = new HttpRequestMessage( + using var httpRequest = new HttpRequestMessage( HttpMethod.Post, urlBuilder.ToString()) { Content = new StringContent(request.SerializeToJson()) }; - return await client.SendAsync(httpRequest, cancellationToken); + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); } - public async static Task CreateTemplateAsync( + public async static Task CreateTemplateAsync( this HttpMessageInvoker client, string accessToken, WeChatWorkCreateTemplateRequest request, @@ -36,17 +40,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions urlBuilder.Append("/cgi-bin/oa/approval/create_template"); urlBuilder.AppendFormat("?access_token={0}", accessToken); - var httpRequest = new HttpRequestMessage( + using var httpRequest = new HttpRequestMessage( HttpMethod.Post, urlBuilder.ToString()) { Content = new StringContent(request.SerializeToJson()) }; - return await client.SendAsync(httpRequest, cancellationToken); + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); } - public async static Task GetApprovalDetailAsync( + public async static Task GetApprovalDetailAsync( this HttpMessageInvoker client, string accessToken, WeChatWorkGetApprovalDetailRequest request, @@ -56,17 +62,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions urlBuilder.Append("/cgi-bin/oa/getapprovaldetail"); urlBuilder.AppendFormat("?access_token={0}", accessToken); - var httpRequest = new HttpRequestMessage( + using var httpRequest = new HttpRequestMessage( HttpMethod.Post, urlBuilder.ToString()) { Content = new StringContent(request.SerializeToJson()) }; - return await client.SendAsync(httpRequest, cancellationToken); + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); } - public async static Task GetApprovalInfoAsync( + public async static Task GetApprovalInfoAsync( this HttpMessageInvoker client, string accessToken, WeChatWorkGetApprovalInfoRequest request, @@ -76,17 +84,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions urlBuilder.Append("/cgi-bin/oa/getapprovalinfo"); urlBuilder.AppendFormat("?access_token={0}", accessToken); - var httpRequest = new HttpRequestMessage( + using var httpRequest = new HttpRequestMessage( HttpMethod.Post, urlBuilder.ToString()) { Content = new StringContent(request.SerializeToJson()) }; - return await client.SendAsync(httpRequest, cancellationToken); + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); } - public async static Task GetTemplateAsync( + public async static Task GetTemplateAsync( this HttpMessageInvoker client, string accessToken, WeChatWorkGetTemplateRequest request, @@ -96,17 +106,19 @@ internal static partial class HttpClientWeChatWorkRequestExtensions urlBuilder.Append("/cgi-bin/oa/gettemplatedetail"); urlBuilder.AppendFormat("?access_token={0}", accessToken); - var httpRequest = new HttpRequestMessage( + using var httpRequest = new HttpRequestMessage( HttpMethod.Post, urlBuilder.ToString()) { Content = new StringContent(request.SerializeToJson()) }; - return await client.SendAsync(httpRequest, cancellationToken); + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); } - public async static Task UpdateTemplateAsync( + public async static Task UpdateTemplateAsync( this HttpMessageInvoker client, string accessToken, WeChatWorkCreateTemplateRequest request, @@ -116,13 +128,15 @@ internal static partial class HttpClientWeChatWorkRequestExtensions urlBuilder.Append("/cgi-bin/oa/approval/update_template"); urlBuilder.AppendFormat("?access_token={0}", accessToken); - var httpRequest = new HttpRequestMessage( + using var httpRequest = new HttpRequestMessage( HttpMethod.Post, urlBuilder.ToString()) { Content = new StringContent(request.SerializeToJson()) }; - return await client.SendAsync(httpRequest, cancellationToken); + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); } } diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Net/Http/HttpClientWeChatWorkRequestExtensions.MeetingRooms.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Net/Http/HttpClientWeChatWorkRequestExtensions.MeetingRooms.cs new file mode 100644 index 000000000..0af06463c --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Net/Http/HttpClientWeChatWorkRequestExtensions.MeetingRooms.cs @@ -0,0 +1,231 @@ +using LINGYUN.Abp.WeChat.Work; +using LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Request; +using LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Response; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace System.Net.Http; + +internal static partial class HttpClientWeChatWorkRequestExtensions +{ + public async static Task CreateMeetingRoomAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkCreateMeetingRoomRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/meetingroom/add"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task GetMeetingRoomListAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkGetMeetingRoomListRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/meetingroom/list"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task UpdateMeetingRoomAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkUpdateMeetingRoomRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/meetingroom/edit"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task DeleteMeetingRoomAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkDeleteMeetingRoomRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/meetingroom/del"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task GetMeetingRoomBookingListAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkGetMeetingRoomBookingListRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/meetingroom/get_booking_info"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task BookMeetingRoomAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkBookMeetingRoomRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/meetingroom/book"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task BookMeetingRoomByScheduleAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkBookMeetingRoomByScheduleRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/meetingroom/book_by_schedule"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task BookMeetingRoomByMeetingAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkBookMeetingRoomByMeetingRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/meetingroom/book_by_meeting"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task CancelBookMeetingRoomAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkCancelBookMeetingRoomRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/meetingroom/cancel_book"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task GetMeetingRoomBookAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkGetMeetingRoomBookRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/meetingroom/bookinfo/get"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Schedules.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Schedules.cs new file mode 100644 index 000000000..11492b61c --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Schedules.cs @@ -0,0 +1,253 @@ +using LINGYUN.Abp.WeChat.Work; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Request; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Response; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace System.Net.Http; + +internal static partial class HttpClientWeChatWorkRequestExtensions +{ + public async static Task CreateCalendarAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkCreateCalendarRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/calendar/add"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task UpdateCalendarAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkUpdateCalendarRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/calendar/update"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task GetCalendarListAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkGetCalendarListRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/calendar/get"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task DeleteCalendarAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkDeleteCalendarRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/calendar/del"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task CreateScheduleAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkCreateScheduleRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/schedule/add"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task UpdateScheduleAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkUpdateScheduleRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/schedule/update"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task AddAttendeesAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkScheduleAddAttendeesRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/schedule/add_attendees"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task DeleteAttendeesAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkScheduleDeleteAttendeesRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/schedule/del_attendees"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task GetScheduleListByCalendarAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkGetScheduleListByCalendarRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/schedule/get_by_calendar"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task GetScheduleListAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkGetScheduleListRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/schedule/get"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } + + public async static Task DeleteScheduleAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkDeleteScheduleRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/schedule/del"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + using var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + using var httpResponse = await client.SendAsync(httpRequest, cancellationToken); + + return await httpResponse.DeserializeObjectAsync(); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Net/Http/HttpClientWeChatWorkRequestExtensions.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Net/Http/HttpClientWeChatWorkRequestExtensions.cs new file mode 100644 index 000000000..251c0db45 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Net/Http/HttpClientWeChatWorkRequestExtensions.cs @@ -0,0 +1,6 @@ +namespace System.Net.Http; + +internal static partial class HttpClientWeChatWorkRequestExtensions +{ + +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Net/Http/HttpResponseDeserializeExtensions.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Net/Http/HttpResponseDeserializeExtensions.cs new file mode 100644 index 000000000..f3abd415d --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Net/Http/HttpResponseDeserializeExtensions.cs @@ -0,0 +1,19 @@ +using LINGYUN.Abp.WeChat.Work; +using Newtonsoft.Json; +using System.Threading.Tasks; +using Volo.Abp.Http.Client; + +namespace System.Net.Http; +internal static class HttpResponseDeserializeExtensions +{ + public async static Task DeserializeObjectAsync(this HttpResponseMessage response) where T : WeChatWorkResponse + { + if (!response.IsSuccessStatusCode) + { + throw new AbpRemoteCallException($"Wechat work request error: {response.StatusCode} - {response.ReasonPhrase}"); + } + var responseContent = await response.Content.ReadAsStringAsync(); + + return JsonConvert.DeserializeObject(responseContent)!; + } +} 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.OA/System/Text/Json/Serialization/ControlSystemTextJsonConverter.cs similarity index 93% rename from aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Text/Json/Serialization/ControlSystemTextJsonConverter.cs rename to aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Text/Json/Serialization/ControlSystemTextJsonConverter.cs index 344250745..d65db5da0 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Text/Json/Serialization/ControlSystemTextJsonConverter.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.OA/System/Text/Json/Serialization/ControlSystemTextJsonConverter.cs @@ -1,4 +1,4 @@ -using LINGYUN.Abp.WeChat.Work.Approvals.Models; +using LINGYUN.Abp.WeChat.Work.OA.Approvals.Models; namespace System.Text.Json.Serialization; internal class ControlSystemTextJsonConverter : JsonConverter @@ -13,7 +13,7 @@ internal class ControlSystemTextJsonConverter : JsonConverter // 反序列化基本字段 if (root.TryGetProperty("property", out var propertyElement)) { - control.Property = JsonSerializer.Deserialize(propertyElement.GetRawText(), options); + control.Property = JsonSerializer.Deserialize(propertyElement.GetRawText(), options)!; } // 根据 Control 类型动态反序列化 Config if (root.TryGetProperty("config", out var configElement) && configElement.ValueKind != JsonValueKind.Null) diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/IWeChatWorkMessageManager.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/IWeChatWorkMessageManager.cs index dada5f1ea..1c336ded2 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/IWeChatWorkMessageManager.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/IWeChatWorkMessageManager.cs @@ -11,7 +11,7 @@ public interface IWeChatWorkMessageManager /// 撤回应用消息 /// /// - /// 参考:https://developer.work.weixin.qq.com/document/path/94867 + /// 参考: /// /// 消息ID。从应用发送消息接口 处获得。 /// diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/IWeChatWorkMessageSender.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/IWeChatWorkMessageSender.cs index 0f133bf67..ba3b29f0a 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/IWeChatWorkMessageSender.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/IWeChatWorkMessageSender.cs @@ -12,7 +12,7 @@ public interface IWeChatWorkMessageSender /// 发送应用消息 /// /// - /// 参考:https://developer.work.weixin.qq.com/document/path/90236 + /// 参考: /// /// 继承自 的企业微信消息载体 /// @@ -24,7 +24,7 @@ public interface IWeChatWorkMessageSender /// 发送群聊消息 /// /// - /// 参考:https://developer.work.weixin.qq.com/document/path/90248 + /// 参考: /// /// 继承自 的企业微信群聊消息载体 /// @@ -36,7 +36,7 @@ public interface IWeChatWorkMessageSender /// 发送Webhook消息 /// /// - /// 参考:https://developer.work.weixin.qq.com/document/path/99110 + /// 参考: /// /// 消息推送的webhook Key /// 继承自 的企业微信Webhook消息载体 diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Token/IWeChatWorkTokenProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Token/IWeChatWorkTokenProvider.cs index 09e0c3b15..7d7fd5f88 100644 --- a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Token/IWeChatWorkTokenProvider.cs +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Token/IWeChatWorkTokenProvider.cs @@ -14,7 +14,6 @@ public interface IWeChatWorkTokenProvider /// /// 参考:https://developer.work.weixin.qq.com/document/path/91039 /// - /// 应用标识 /// /// Task GetTokenAsync(CancellationToken cancellationToken = default); diff --git a/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/LY.MicroService.WechatManagement.HttpApi.Host.csproj b/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/LY.MicroService.WechatManagement.HttpApi.Host.csproj index 4e876d8d7..f7fdfd299 100644 --- a/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/LY.MicroService.WechatManagement.HttpApi.Host.csproj +++ b/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/LY.MicroService.WechatManagement.HttpApi.Host.csproj @@ -61,9 +61,11 @@ + + diff --git a/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/WechatManagementHttpApiHostModule.cs b/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/WechatManagementHttpApiHostModule.cs index 442fc1387..280fa5e41 100644 --- a/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/WechatManagementHttpApiHostModule.cs +++ b/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/WechatManagementHttpApiHostModule.cs @@ -19,8 +19,10 @@ using LINGYUN.Abp.WeChat.MiniProgram; using LINGYUN.Abp.WeChat.Official; using LINGYUN.Abp.WeChat.SettingManagement; using LINGYUN.Abp.WeChat.Work; +using LINGYUN.Abp.WeChat.Work.Contacts; using LINGYUN.Abp.WeChat.Work.ExternalContact; using LINGYUN.Abp.WeChat.Work.Handlers; +using LINGYUN.Abp.WeChat.Work.OA; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -50,7 +52,9 @@ namespace LY.MicroService.WechatManagement; typeof(AbpAspNetCoreSerilogModule), typeof(AbpWeChatWorkApplicationModule), typeof(AbpWeChatWorkHttpApiModule), + typeof(AbpWeChatWorkContactModule), typeof(AbpWeChatWorkExternalContactModule), + typeof(AbpWeChatWorkOAModule), typeof(AbpWeChatWorkHandlersModule), typeof(AbpWeChatOfficialApplicationModule), typeof(AbpWeChatOfficialHttpApiModule), diff --git a/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/GlobalUsings.cs b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/GlobalUsings.cs new file mode 100644 index 000000000..bd8299f6f --- /dev/null +++ b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/GlobalUsings.cs @@ -0,0 +1,2 @@ +global using Xunit; +global using Shouldly; \ No newline at end of file diff --git a/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests.csproj b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests.csproj new file mode 100644 index 000000000..cf06854d0 --- /dev/null +++ b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests.csproj @@ -0,0 +1,20 @@ + + + + net9.0 + + false + Debug;Release;PostgreSQL + AnyCPU + + + + + + + + + + + + diff --git a/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/LINGYUN/Abp/WeChat/Work/Contacts/AbpWeChatWorkContactTestBase.cs b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/LINGYUN/Abp/WeChat/Work/Contacts/AbpWeChatWorkContactTestBase.cs new file mode 100644 index 000000000..ad116292d --- /dev/null +++ b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/LINGYUN/Abp/WeChat/Work/Contacts/AbpWeChatWorkContactTestBase.cs @@ -0,0 +1,6 @@ +using LINGYUN.Abp.Tests; + +namespace LINGYUN.Abp.WeChat.Work.Contacts; +public abstract class AbpWeChatWorkContactTestBase : AbpTestsBase +{ +} diff --git a/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/LINGYUN/Abp/WeChat/Work/Contacts/AbpWeChatWorkContactTestModule.cs b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/LINGYUN/Abp/WeChat/Work/Contacts/AbpWeChatWorkContactTestModule.cs new file mode 100644 index 000000000..c648ce594 --- /dev/null +++ b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/LINGYUN/Abp/WeChat/Work/Contacts/AbpWeChatWorkContactTestModule.cs @@ -0,0 +1,22 @@ +using LINGYUN.Abp.Tests.Features; +using LINGYUN.Abp.WeChat.Work.Contacts.Features; +using Volo.Abp.Modularity; + +namespace LINGYUN.Abp.WeChat.Work.Contacts; + +[DependsOn( + typeof(AbpWeChatWorkContactModule), + typeof(AbpWeChatWorkTestModule))] +public class AbpWeChatWorkContactTestModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.Map(WeChatWorkContactsFeatureNames.Enable, (feature) => + { + return true.ToString(); + }); + }); + } +} diff --git a/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/LINGYUN/Abp/WeChat/Work/Contacts/Members/WeChatWorkMemberProvider_Tests.cs b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/LINGYUN/Abp/WeChat/Work/Contacts/Members/WeChatWorkMemberProvider_Tests.cs new file mode 100644 index 000000000..2e17dfd9f --- /dev/null +++ b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.Contacts.Tests/LINGYUN/Abp/WeChat/Work/Contacts/Members/WeChatWorkMemberProvider_Tests.cs @@ -0,0 +1,24 @@ +using Microsoft.Extensions.Configuration; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.WeChat.Work.Contacts.Members; +public class WeChatWorkMemberProvider_Tests : AbpWeChatWorkContactTestBase +{ + public readonly IWeChatWorkMemberProvider _provider; + public readonly IConfiguration _configuration; + public WeChatWorkMemberProvider_Tests() + { + _provider = GetRequiredService(); + _configuration = GetRequiredService(); + } + + [Fact] + public async virtual Task Should_Get_Member() + { + var userId = _configuration["WeChat:Work:Contacts:Members:GetMember:UserId"]; + var res = await _provider.GetMemberAsync(userId); + + res.ErrorCode.ShouldBe(0); + res.ErrorMessage.ShouldBe("ok"); + } +} \ No newline at end of file diff --git a/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/GlobalUsings.cs b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/GlobalUsings.cs new file mode 100644 index 000000000..bd8299f6f --- /dev/null +++ b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/GlobalUsings.cs @@ -0,0 +1,2 @@ +global using Xunit; +global using Shouldly; \ No newline at end of file diff --git a/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN.Abp.WeChat.Work.OA.Tests.csproj b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN.Abp.WeChat.Work.OA.Tests.csproj new file mode 100644 index 000000000..3d5eef255 --- /dev/null +++ b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN.Abp.WeChat.Work.OA.Tests.csproj @@ -0,0 +1,20 @@ + + + + net9.0 + + false + Debug;Release;PostgreSQL + AnyCPU + + + + + + + + + + + + diff --git a/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/AbpWeChatWorkOATestBase.cs b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/AbpWeChatWorkOATestBase.cs new file mode 100644 index 000000000..dd51b052a --- /dev/null +++ b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/AbpWeChatWorkOATestBase.cs @@ -0,0 +1,6 @@ +using LINGYUN.Abp.Tests; + +namespace LINGYUN.Abp.WeChat.Work.OA; +public abstract class AbpWeChatWorkOATestBase : AbpTestsBase +{ +} diff --git a/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/AbpWeChatWorkOATestModule.cs b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/AbpWeChatWorkOATestModule.cs new file mode 100644 index 000000000..066e9136f --- /dev/null +++ b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/AbpWeChatWorkOATestModule.cs @@ -0,0 +1,22 @@ +using LINGYUN.Abp.Tests.Features; +using LINGYUN.Abp.WeChat.Work.OA.Features; +using Volo.Abp.Modularity; + +namespace LINGYUN.Abp.WeChat.Work.OA; + +[DependsOn( + typeof(AbpWeChatWorkOAModule), + typeof(AbpWeChatWorkTestModule))] +public class AbpWeChatWorkOATestModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.Map(WeChatWorkOAFeatureNames.Enable, (feature) => + { + return true.ToString(); + }); + }); + } +} diff --git a/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/WeChatWorkMeetingRoomProvider_Tests.cs b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/WeChatWorkMeetingRoomProvider_Tests.cs new file mode 100644 index 000000000..22ccea4aa --- /dev/null +++ b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/MeetingRooms/WeChatWorkMeetingRoomProvider_Tests.cs @@ -0,0 +1,174 @@ +using LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Models; +using LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Request; +using LINGYUN.Abp.WeChat.Work.OA.MeetingRooms.Response; +using Microsoft.Extensions.Configuration; +using System; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.WeChat.Work.OA.MeetingRooms; + +public class WeChatWorkMeetingRoomProvider_Tests : AbpWeChatWorkOATestBase +{ + private readonly IWeChatWorkMeetingRoomProvider _provider; + public WeChatWorkMeetingRoomProvider_Tests() + { + _provider = GetRequiredService(); + } + + [Fact] + public async virtual Task Should_Create_Meeting_Room() + { + var res = await CreateMeetingRoomAsync(); + + res.ErrorCode.ShouldBe(0); + res.ErrorMessage.ShouldBe("ok"); + res.MeetingRoomId.ShouldNotBe(0); + + await _provider.DeleteMeetingRoomAsync( + new WeChatWorkDeleteMeetingRoomRequest(res.MeetingRoomId)); + } + + [Fact] + public async virtual Task Should_Get_Meeting_Room_List() + { + var createRes = await CreateMeetingRoomAsync(); + + var req = new WeChatWorkGetMeetingRoomListRequest(); + + var res = await _provider.GetMeetingRoomListAsync(req); + + await _provider.DeleteMeetingRoomAsync( + new WeChatWorkDeleteMeetingRoomRequest(createRes.MeetingRoomId)); + + res.ErrorCode.ShouldBe(0); + res.ErrorMessage.ShouldBe("ok"); + res.MeetingRoomList.ShouldNotBeEmpty(); + + var meetingRoom = res.MeetingRoomList[0]; + meetingRoom.MeetingRoomId.ShouldNotBe(0); + meetingRoom.Name.ShouldBe("18F-会议室"); + meetingRoom.Capacity.ShouldBe(10); + meetingRoom.City.ShouldBe("深圳"); + meetingRoom.Building.ShouldBe("腾讯大厦"); + meetingRoom.Floor.ShouldBe("18F"); + meetingRoom.Equipment.ShouldContain(1); + meetingRoom.Equipment.ShouldContain(2); + meetingRoom.Equipment.ShouldContain(3); + meetingRoom.NeedApproval.ShouldBeFalse(); + meetingRoom.Coordinate.ShouldNotBeNull(); + meetingRoom.Coordinate.Latitude.ShouldBe("22.540503"); + meetingRoom.Coordinate.Longitude.ShouldBe("113.934528"); + meetingRoom.Range.ShouldBeNull(); + } + + [Fact] + public async virtual Task Should_Update_Meeting_Room() + { + var createRes = await CreateMeetingRoomAsync(); + + var req = new WeChatWorkUpdateMeetingRoomRequest(createRes.MeetingRoomId); + req.Name = "18F-会议室1"; + req.WithWhiteboard(); + + var res = await _provider.UpdateMeetingRoomAsync(req); + + res.ErrorCode.ShouldBe(0); + res.ErrorMessage.ShouldBe("ok"); + + var getRes = await _provider.GetMeetingRoomListAsync( + new WeChatWorkGetMeetingRoomListRequest()); + + await _provider.DeleteMeetingRoomAsync( + new WeChatWorkDeleteMeetingRoomRequest(createRes.MeetingRoomId)); + + var meetingRoom = getRes.MeetingRoomList[0]; + meetingRoom.Name.ShouldBe("18F-会议室1"); + meetingRoom.Equipment.ShouldContain(4); + } + + [Fact] + public async virtual Task Should_Delete_Meeting_Room() + { + var createRes = await CreateMeetingRoomAsync(); + + var res = await _provider.DeleteMeetingRoomAsync( + new WeChatWorkDeleteMeetingRoomRequest(createRes.MeetingRoomId)); + + res.ErrorCode.ShouldBe(0); + res.ErrorMessage.ShouldBe("ok"); + } + + [Fact] + public async virtual Task Should_Book_Meeting_Room() + { + var createRes = await CreateMeetingRoomAsync(); + + var configuration = GetRequiredService(); + + var nowTime = DateTime.Now; + + var res = await _provider.BookMeetingRoomAsync( + new WeChatWorkBookMeetingRoomRequest( + createRes.MeetingRoomId, + nowTime.AddHours(2), + nowTime.AddHours(4), + configuration["WeChat:Work:OA:MeetingRooms:BookMeetingRoom:Booker"])); + + await _provider.CancelBookMeetingRoomAsync( + new WeChatWorkCancelBookMeetingRoomRequest(res.BookingId)); + + await _provider.DeleteMeetingRoomAsync( + new WeChatWorkDeleteMeetingRoomRequest(createRes.MeetingRoomId)); + + res.ErrorCode.ShouldBe(0); + res.ErrorMessage.ShouldBe("ok"); + res.BookingId.ShouldNotBeNull(); + res.ScheduleId.ShouldNotBeNull(); + } + + [Fact] + public async virtual Task Should_Get_Meeting_Room_Book() + { + var createRes = await CreateMeetingRoomAsync(); + + var configuration = GetRequiredService(); + + var nowTime = DateTime.Now; + + var bookRes = await _provider.BookMeetingRoomAsync( + new WeChatWorkBookMeetingRoomRequest( + createRes.MeetingRoomId, + nowTime.AddHours(2), + nowTime.AddHours(4), + configuration["WeChat:Work:OA:MeetingRooms:BookMeetingRoom:Booker"])); + + var res = await _provider.GetMeetingRoomBookAsync( + new WeChatWorkGetMeetingRoomBookRequest(createRes.MeetingRoomId, bookRes.BookingId)); + + await _provider.CancelBookMeetingRoomAsync( + new WeChatWorkCancelBookMeetingRoomRequest(bookRes.BookingId)); + + await _provider.DeleteMeetingRoomAsync( + new WeChatWorkDeleteMeetingRoomRequest(createRes.MeetingRoomId)); + + res.ErrorCode.ShouldBe(0); + res.ErrorMessage.ShouldBe("ok"); + res.Schedule.ShouldNotBeNull(); + res.Schedule.Booker.ShouldBe(configuration["WeChat:Work:OA:MeetingRooms:BookMeetingRoom:Booker"]); + res.Schedule.Status.ShouldBe(MeetingRoomScheduleStatus.Reserved); + res.Schedule.BookingId.ShouldBe(bookRes.BookingId); + res.Schedule.ScheduleId.ShouldBe(bookRes.ScheduleId); + } + + protected async virtual Task CreateMeetingRoomAsync() + { + var req = new WeChatWorkCreateMeetingRoomRequest("18F-会议室", 10); + req.WithLocation("深圳", "腾讯大厦", "18F"); + req.WithTv(); + req.WithPhone(); + req.WithProjection(); + req.Coordinate = new MeetingRoomCoordinate(22.540503m, 113.934528m); + + return await _provider.CreateMeetingRoomAsync(req); + } +} diff --git a/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/Messages/AbpWeChatWorkMessageResolveOptions_Tests.cs b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/Messages/AbpWeChatWorkMessageResolveOptions_Tests.cs new file mode 100644 index 000000000..c37ece28a --- /dev/null +++ b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/Messages/AbpWeChatWorkMessageResolveOptions_Tests.cs @@ -0,0 +1,26 @@ +using LINGYUN.Abp.WeChat.Work.Common.Messages; +using Microsoft.Extensions.Options; + +namespace LINGYUN.Abp.WeChat.Work.OA.Messages; + +public class AbpWeChatWorkMessageResolveOptions_Tests : AbpWeChatWorkOATestBase +{ + private readonly IOptions _options; + public AbpWeChatWorkMessageResolveOptions_Tests() + { + _options = GetRequiredService>(); + } + + [Theory] + [InlineData("book_meeting_room")] + [InlineData("cancel_meeting_room")] + [InlineData("delete_calendar")] + [InlineData("modify_calendar")] + [InlineData("delete_schedule")] + [InlineData("modify_schedule")] + [InlineData("respond_schedule")] + public void Should_Map_Event(string eventName) + { + _options.Value.EventMaps.ContainsKey(eventName).ShouldBeTrue(); + } +} diff --git a/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/Schedules/WeChatWorkCalendarProvider_Tests.cs b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/Schedules/WeChatWorkCalendarProvider_Tests.cs new file mode 100644 index 000000000..e455f0882 --- /dev/null +++ b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/Schedules/WeChatWorkCalendarProvider_Tests.cs @@ -0,0 +1,114 @@ +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Request; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules; + +public class WeChatWorkCalendarProvider_Tests : AbpWeChatWorkOATestBase +{ + private readonly IWeChatWorkCalendarProvider _provider; + public WeChatWorkCalendarProvider_Tests() + { + _provider = GetRequiredService(); + } + + [Fact] + public async virtual Task Should_Create_Calendar() + { + var req = new WeChatWorkCreateCalendarRequest( + new Models.CreateCalendar( + "test_summary", + "#FF3030", + "test_describe")); + + var res = await _provider.CreateCalendarAsync(req); + + res.ErrorCode.ShouldBe(0); + res.ErrorMessage.ShouldBe("ok"); + res.CalId.ShouldNotBeNullOrWhiteSpace(); + res.FailResult.ShouldNotBeNull(); + res.FailResult.Shares.ShouldBeEmpty(); + + await _provider.DeleteCalendarAsync( + new WeChatWorkDeleteCalendarRequest(res.CalId)); + } + + [Fact] + public async virtual Task Should_Update_Calendar() + { + var createReq = new WeChatWorkCreateCalendarRequest( + new Models.CreateCalendar( + "test_summary", + "#FF3030", + "test_describe")); + + var createRes = await _provider.CreateCalendarAsync(createReq); + + var req = new WeChatWorkUpdateCalendarRequest( + new Models.UpdateCalendar( + createRes.CalId, + "test_summary1", + "#FF0000", + "test_describe1")); + + var res = await _provider.UpdateCalendarAsync(req); + + res.ErrorCode.ShouldBe(0); + res.ErrorMessage.ShouldBe("ok"); + res.FailResult.ShouldNotBeNull(); + res.FailResult.Shares.ShouldBeEmpty(); + + var getRes = await _provider.GetCalendarListAsync( + new WeChatWorkGetCalendarListRequest(new string[] { createRes.CalId })); + + getRes.ErrorCode.ShouldBe(0); + getRes.ErrorMessage.ShouldBe("ok"); + getRes.CalendarList.ShouldNotBeEmpty(); + + var calendar = getRes.CalendarList[0]; + calendar.CalId.ShouldBe(createRes.CalId); + calendar.Admins.ShouldBeEmpty(); + calendar.Summary.ShouldBe("test_summary1"); + calendar.Color.ShouldBe("#FF0000"); + calendar.Description.ShouldBe("test_describe1"); + calendar.IsPublic.ShouldBeFalse(); + calendar.PublicRange.ShouldBeNull(); + calendar.IsCorpCalendar.ShouldBeFalse(); + calendar.Shares.ShouldBeEmpty(); + + await _provider.DeleteCalendarAsync( + new WeChatWorkDeleteCalendarRequest(createRes.CalId)); + } + + [Fact] + public async virtual Task Should_Get_Calendar_List() + { + var createReq = new WeChatWorkCreateCalendarRequest( + new Models.CreateCalendar( + "test_summary", + "#FF3030", + "test_describe")); + + var createRes = await _provider.CreateCalendarAsync(createReq); + + var res = await _provider.GetCalendarListAsync( + new WeChatWorkGetCalendarListRequest(new string[] { createRes.CalId })); + + await _provider.DeleteCalendarAsync( + new WeChatWorkDeleteCalendarRequest(createRes.CalId)); + + res.ErrorCode.ShouldBe(0); + res.ErrorMessage.ShouldBe("ok"); + res.CalendarList.ShouldNotBeEmpty(); + + var calendar = res.CalendarList[0]; + calendar.CalId.ShouldBe(createRes.CalId); + calendar.Admins.ShouldBeEmpty(); + calendar.Summary.ShouldBe("test_summary"); + calendar.Color.ShouldBe("#FF3030"); + calendar.Description.ShouldBe("test_describe"); + calendar.IsPublic.ShouldBeFalse(); + calendar.PublicRange.ShouldBeNull(); + calendar.IsCorpCalendar.ShouldBeFalse(); + calendar.Shares.ShouldBeEmpty(); + } +} diff --git a/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/Schedules/WeChatWorkScheduleProvider_Tests.cs b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/Schedules/WeChatWorkScheduleProvider_Tests.cs new file mode 100644 index 000000000..2be973539 --- /dev/null +++ b/aspnet-core/tests/LINGYUN.Abp.WeChat.Work.OA.Tests/LINGYUN/Abp/WeChat/Work/OA/Schedules/WeChatWorkScheduleProvider_Tests.cs @@ -0,0 +1,122 @@ +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Request; +using LINGYUN.Abp.WeChat.Work.OA.Schedules.Response; +using Shouldly; +using System; +using System.Globalization; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.WeChat.Work.OA.Schedules; + +public class WeChatWorkScheduleProvider_Tests : AbpWeChatWorkOATestBase +{ + private readonly static DateTime _beginUnixTime = new DateTime(1970, 1, 1); + + private readonly IWeChatWorkScheduleProvider _provider; + public WeChatWorkScheduleProvider_Tests() + { + _provider = GetRequiredService(); + } + + [Fact] + public async virtual Task Should_Create_Schedule() + { + var res = await CreateSchedule(); + + res.ErrorCode.ShouldBe(0); + res.ErrorMessage.ShouldBe("ok"); + res.ScheduleId.ShouldNotBeNullOrWhiteSpace(); + + await _provider.DeleteScheduleAsync( + new WeChatWorkDeleteScheduleRequest(res.ScheduleId)); + } + + [Fact] + public async virtual Task Should_Update_Schedule() + { + var createRes = await CreateSchedule(); + + var req = new WeChatWorkUpdateScheduleRequest( + new Models.UpdateSchedule( + createRes.ScheduleId, + DateTime.Now.AddHours(5), + DateTime.Now.AddHours(8))); + var repeatUntil = (long)(DateTime.Now.AddHours(10) - _beginUnixTime).TotalSeconds; + req.Schedule.Summary = "test_summary"; + req.Schedule.Description = "test_description"; + req.Schedule.Location = "test_place"; + req.Schedule.Reminders = new Models.ScheduleReminder + { + IsRemind = true, + RemindBeforeEventSecs = 3600u, + RemindTimeDiffs = new[] { 0, -300 }, + IsRepeat = true, + RepeatType = Models.ScheduleReminderRepeatType.WorkingDays, + RepeatUntil = repeatUntil, + IsCustomRepeat = true, + RepeatInterval = 1, + RepeatDayOfWeek = new[] { 3u, 7u }, + RepeatDayOfMonth = new[] { 10u, 21u }, + TimeZone = 8u, + }; + + var res = await _provider.UpdateScheduleAsync(req); + + res.ErrorCode.ShouldBe(0); + res.ErrorMessage.ShouldBe("ok"); + res.ScheduleId.ShouldNotBeNullOrWhiteSpace(); + + var getRes = await _provider.GetScheduleListAsync( + new WeChatWorkGetScheduleListRequest(new[] { res.ScheduleId } )); + + getRes.ErrorCode.ShouldBe(0); + getRes.ErrorMessage.ShouldBe("ok"); + getRes.ScheduleList.ShouldNotBeEmpty(); + + var schedule = getRes.ScheduleList[0]; + schedule.Summary.ShouldBe("test_summary"); + schedule.Description.ShouldBe("test_description"); + schedule.Location.ShouldBe("test_place"); + schedule.Reminders.ShouldNotBeNull(); + schedule.Reminders.IsRemind.ShouldBeTrue(); + schedule.Reminders.RemindTimeDiffs.ShouldContain(0); + schedule.Reminders.RemindTimeDiffs.ShouldContain(-300); + schedule.Reminders.IsRepeat.ShouldBeTrue(); + schedule.Reminders.RepeatType.ShouldBe(Models.ScheduleReminderRepeatType.WorkingDays); + schedule.Reminders.RepeatUntil.ShouldBe(repeatUntil); + schedule.Reminders.IsCustomRepeat.ShouldBeTrue(); + schedule.Reminders.RepeatInterval.ShouldBe(1u); + schedule.Reminders.TimeZone.ShouldBe(8u); + + await _provider.DeleteScheduleAsync( + new WeChatWorkDeleteScheduleRequest(createRes.ScheduleId)); + } + + protected async virtual Task CreateSchedule() + { + var req = new WeChatWorkCreateScheduleRequest( + new Models.CreateSchedule( + DateTime.Now.AddHours(2), + DateTime.Now.AddHours(5))); + + req.Schedule.Summary = "需求评审会议"; + req.Schedule.Description = "2.0版本需求初步评审"; + req.Schedule.Location = "广州国际媒体港10楼1005会议室"; + req.Schedule.IsWholeDay = true; + req.Schedule.Reminders = new Models.ScheduleReminder + { + IsRemind = true, + RemindBeforeEventSecs = 3600, + RemindTimeDiffs = new[] { 0, -3600 }, + IsRepeat = true, + RepeatType = Models.ScheduleReminderRepeatType.WorkingDays, + RepeatUntil = (long)(DateTime.Now.AddHours(8) - _beginUnixTime).TotalSeconds, + IsCustomRepeat = true, + RepeatInterval = 1, + RepeatDayOfWeek = new[] { 3u, 7u }, + RepeatDayOfMonth = new[] { 10u, 21u }, + TimeZone = 8u, + }; + + return await _provider.CreateScheduleAsync(req); + } +}