😎1、升级依赖 2、增加企业微信插件工程

This commit is contained in:
zuohuaijun 2025-02-04 01:30:09 +08:00
parent 251bb4d6e6
commit 6cef3597ee
19 changed files with 1071 additions and 5 deletions

View File

@ -20,9 +20,9 @@
<PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
<PackageReference Include="BouncyCastle.Cryptography" Version="2.5.0" Aliases="BouncyCastleV2" />
<PackageReference Include="Elastic.Clients.Elasticsearch" Version="8.17.1" />
<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.7.2" />
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.7.2" />
<PackageReference Include="Furion.Pure" Version="4.9.7.2" />
<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.7.3" />
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.7.3" />
<PackageReference Include="Furion.Pure" Version="4.9.7.3" />
<PackageReference Include="Hardware.Info" Version="101.0.0" />
<PackageReference Include="Hashids.net" Version="1.7.0" />
<PackageReference Include="IPTools.China" Version="1.6.0" />
@ -36,13 +36,13 @@
<PackageReference Include="MiniWord" Version="0.9.2" />
<PackageReference Include="MQTTnet" Version="5.0.1.1416" />
<PackageReference Include="MySqlBackup.NET.MySqlConnector" Version="2.3.8" />
<PackageReference Include="NewLife.Redis" Version="6.0.2025.101" />
<PackageReference Include="NewLife.Redis" Version="6.1.2025.202" />
<PackageReference Include="Novell.Directory.Ldap.NETStandard" Version="3.6.0" />
<PackageReference Include="OnceMi.AspNetCore.OSS" Version="1.2.0" />
<PackageReference Include="QRCoder" Version="1.6.0" />
<PackageReference Include="RabbitMQ.Client" Version="7.0.0" />
<PackageReference Include="SixLabors.ImageSharp.Web" Version="3.1.3" />
<PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="3.6.0" />
<PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="3.7.0" />
<PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="3.10.0" />
<PackageReference Include="SqlSugarCore" Version="5.1.4.175" />
<PackageReference Include="SSH.NET" Version="2024.2.0" />

View File

@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net8.0;net9.0</TargetFrameworks>
<NoWarn>1701;1702;1591;8632</NoWarn>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>disable</Nullable>
<GenerateDocumentationFile>True</GenerateDocumentationFile>
<Copyright>Admin.NET</Copyright>
<Description>Admin.NET 通用权限开发平台</Description>
<RootNamespace>Admin.NET.Plugin.WorkWeixin</RootNamespace>
</PropertyGroup>
<ItemGroup>
<None Update="Configuration\**">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Admin.NET.Core\Admin.NET.Core.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,8 @@
{
"$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json",
"WorkWeixin": {
"CorpId": "xxxx", // ID
"CorpSecret": "xxxx" //
}
}

View File

@ -0,0 +1,15 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Plugin.WorkWeixin.Const;
public class WorkWeixinConst
{
/// <summary>
/// API分组名称
/// </summary>
public const string GroupName = "WorkWeixin";
}

View File

@ -0,0 +1,12 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
global using Admin.NET.Core;
global using Furion;
global using Furion.HttpRemote;
global using Newtonsoft.Json;
global using System.ComponentModel.DataAnnotations;
global using System.Text.Json.Serialization;

View File

@ -0,0 +1,25 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
using Furion.ConfigurableOptions;
namespace Admin.NET.Plugin.WorkWeixin.Option;
/// <summary>
/// 企业微信配置项
/// </summary>
public class WorkWeixinOptions : IConfigurableOptions
{
/// <summary>
/// 企业ID
/// </summary>
public string CorpId { get; set; }
/// <summary>
/// 企业微信凭证密钥
/// </summary>
public string CorpSecret { get; set; }
}

View File

@ -0,0 +1,425 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Plugin.WorkWeixin.Proxy;
/// <summary>
/// 创建群聊会话输入参数
/// </summary>
public class CreatAppChatInput
{
/// <summary>
/// 群名称
/// </summary>
[JsonProperty("name")]
[JsonPropertyName("name")]
[Required(ErrorMessage = "群名称不能为空"), MaxLength(50, ErrorMessage = "群名称最多不能超过50个字符")]
public string Name { get; set; }
/// <summary>
/// 群主Id
/// </summary>
[JsonProperty("owner")]
[JsonPropertyName("owner")]
[Required(ErrorMessage = "群主Id不能为空")]
public string Owner { get; set; }
/// <summary>
/// 群成员Id列表
/// </summary>
[JsonProperty("userlist")]
[JsonPropertyName("userlist")]
[NotEmpty(ErrorMessage = "群成员列表不能为空")]
public List<string> UserList { get; set; }
/// <summary>
/// 群Id
/// </summary>
[JsonProperty("chatid")]
[JsonPropertyName("chatid")]
[Required(ErrorMessage = "群Id不能为空"), MaxLength(32, ErrorMessage = "群Id最多不能超过32个字符")]
public string ChatId { get; set; }
}
/// <summary>
/// 修改群聊会话输入参数
/// </summary>
public class UpdateAppChatInput
{
/// <summary>
/// 群Id
/// </summary>
[JsonProperty("chatid")]
[JsonPropertyName("chatid")]
[Required(ErrorMessage = "群Id不能为空"), MaxLength(32, ErrorMessage = "群Id最多不能超过32个字符")]
public string ChatId { get; set; }
/// <summary>
/// 群名称
/// </summary>
[JsonProperty("name")]
[JsonPropertyName("name")]
[Required(ErrorMessage = "群名称不能为空"), MaxLength(50, ErrorMessage = "群名称最多不能超过50个字符")]
public string Name { get; set; }
/// <summary>
/// 群主Id
/// </summary>
[JsonProperty("owner")]
[JsonPropertyName("owner")]
[Required(ErrorMessage = "群主Id不能为空")]
public string Owner { get; set; }
/// <summary>
/// 添加成员的id列表
/// </summary>
[JsonProperty("add_user_list")]
[JsonPropertyName("add_user_list")]
public List<string> AddUserList { get; set; }
/// <summary>
/// 踢出成员的id列表
/// </summary>
[JsonProperty("del_user_list")]
[JsonPropertyName("del_user_list")]
public List<string> DelUserList { get; set; }
}
/// <summary>
/// 应用消息推送输入基类参数
/// </summary>
public class SendBaseAppChatInput
{
/// <summary>
/// 群Id
/// </summary>
[JsonProperty("chatid")]
[JsonPropertyName("chatid")]
[Required(ErrorMessage = "群Id不能为空"), MaxLength(32, ErrorMessage = "群Id最多不能超过32个字符")]
public string ChatId { get; set; }
/// <summary>
/// 消息类型
/// </summary>
/// <example>text文本消息</example>
/// <example>image图片消息</example>
/// <example>voice图片消息</example>
/// <example>video视频消息</example>
/// <example>file文件消息</example>
/// <example>textcard文本卡片</example>
/// <example>news图文消息</example>
/// <example>mpnews图文消息存储在企业微信</example>
/// <example>markdownmarkdown消息</example>
[JsonProperty("msgtype")]
[JsonPropertyName("msgtype")]
[Required(ErrorMessage = "消息类型不能为空")]
protected string MsgType { get; set; }
/// <summary>
/// 是否是保密消息
/// </summary>
[JsonProperty("safe")]
[JsonPropertyName("safe")]
[Required(ErrorMessage = "消息类型不能为空")]
public int Safe { get; set; }
public SendBaseAppChatInput(string chatId, string msgType, bool safe = false)
{
ChatId = chatId;
MsgType = msgType;
Safe = safe ? 1 : 0;
}
}
/// <summary>
/// 推送文本消息输入参数
/// </summary>
public class SendTextAppChatInput : SendBaseAppChatInput
{
/// <summary>
/// 消息内容
/// </summary>
[JsonProperty("text")]
[JsonPropertyName("text")]
public object Text { get; set; }
/// <summary>
/// 文本消息
/// </summary>
/// <param name="chatId"></param>
/// <param name="content"></param>
/// <param name="safe"></param>
public SendTextAppChatInput(string chatId, string content, bool safe = false) : base(chatId, "text", safe)
{
Text = new { content };
}
}
/// <summary>
/// 推送图片消息输入参数
/// </summary>
public class SendImageAppChatInput : SendBaseAppChatInput
{
/// <summary>
/// 消息内容
/// </summary>
[JsonProperty("image")]
[JsonPropertyName("image")]
public object Image { get; set; }
/// <summary>
/// 图片消息
/// </summary>
/// <param name="chatId"></param>
/// <param name="mediaId"></param>
/// <param name="safe"></param>
public SendImageAppChatInput(string chatId, string mediaId, bool safe = false) : base(chatId, "image", safe)
{
Image = new { media_id = mediaId };
}
}
/// <summary>
/// 推送语音消息输入参数
/// </summary>
public class SendVoiceAppChatInput : SendBaseAppChatInput
{
/// <summary>
/// 消息内容
/// </summary>
[JsonProperty("voice")]
[JsonPropertyName("voice")]
public object Voice { get; set; }
/// <summary>
/// 语音消息
/// </summary>
/// <param name="chatId"></param>
/// <param name="mediaId"></param>
/// <param name="safe"></param>
public SendVoiceAppChatInput(string chatId, string mediaId, bool safe = false) : base(chatId, "voice", safe)
{
Voice = new { media_id = mediaId };
}
}
/// <summary>
/// 推送视频消息输入参数
/// </summary>
public class SendVideoAppChatInput : SendBaseAppChatInput
{
/// <summary>
/// 消息内容
/// </summary>
[JsonProperty("video")]
[JsonPropertyName("video")]
public object Video { get; set; }
/// <summary>
/// 视频消息
/// </summary>
/// <param name="chatId"></param>
/// <param name="title"></param>
/// <param name="description"></param>
/// <param name="mediaId"></param>
/// <param name="safe"></param>
public SendVideoAppChatInput(string chatId, string title, string description, string mediaId, bool safe = false) : base(chatId, "video", safe)
{
Video = new
{
media_id = mediaId,
description,
title
};
}
}
/// <summary>
/// 推送视频消息输入参数
/// </summary>
public class SendFileAppChatInput : SendBaseAppChatInput
{
/// <summary>
/// 消息内容
/// </summary>
[JsonProperty("file")]
[JsonPropertyName("file")]
public object File { get; set; }
/// <summary>
/// 文件消息
/// </summary>
/// <param name="chatId"></param>
/// <param name="mediaId"></param>
/// <param name="safe"></param>
public SendFileAppChatInput(string chatId, string mediaId, bool safe = false) : base(chatId, "video", safe)
{
File = new { media_id = mediaId };
}
}
/// <summary>
/// 推送文本卡片消息输入参数
/// </summary>
public class SendTextCardAppChatInput : SendBaseAppChatInput
{
/// <summary>
/// 消息内容
/// </summary>
[JsonProperty("textcard")]
[JsonPropertyName("textcard")]
public object TextCard { get; set; }
/// <summary>
/// 文本卡片消息
/// </summary>
/// <param name="chatId"></param>
/// <param name="title">标题</param>
/// <param name="description">描述</param>
/// <param name="url">点击后跳转的链接</param>
/// <param name="btnTxt">按钮文字</param>
/// <param name="safe"></param>
public SendTextCardAppChatInput(string chatId, string title, string description, string url, string btnTxt, bool safe = false) : base(chatId, "textcard", safe)
{
TextCard = new
{
title,
description,
url,
btntxt = btnTxt
};
}
}
/// <summary>
/// 图文消息项
/// </summary>
public class SendNewsItem
{
/// <summary>
/// 标题
/// </summary>
[JsonProperty("title")]
[JsonPropertyName("title")]
public string Title { get; set; }
/// <summary>
/// 描述
/// </summary>
[JsonProperty("description")]
[JsonPropertyName("description")]
public string Description { get; set; }
/// <summary>
/// 描述
/// </summary>
[JsonProperty("url")]
[JsonPropertyName("url")]
public string Url { get; set; }
/// <summary>
/// 图文消息的图片链接推荐大图1068 * 455小图150 * 150
/// </summary>
[JsonProperty("picurl")]
[JsonPropertyName("picurl")]
public string PicUrl { get; set; }
}
/// <summary>
/// 推送图文消息输入参数
/// </summary>
public class SendNewsAppChatInput : SendBaseAppChatInput
{
/// <summary>
/// 消息内容
/// </summary>
[JsonProperty("news")]
[JsonPropertyName("news")]
public object News { get; set; }
/// <summary>
/// 图文消息
/// </summary>
/// <param name="chatId"></param>
/// <param name="newsList">图文消息列表</param>
/// <param name="safe"></param>
public SendNewsAppChatInput(string chatId, List<SendNewsItem> newsList, bool safe = false) : base(chatId, "news", safe)
{
News = new { articles = newsList };
}
}
/// <summary>
/// 图文消息项
/// </summary>
public class SendMpNewsItem
{
/// <summary>
/// 标题
/// </summary>
[JsonProperty("title")]
[JsonPropertyName("title")]
public string Title { get; set; }
/// <summary>
/// 缩略图media_id
/// </summary>
[JsonProperty("thumb_media_id")]
[JsonPropertyName("thumb_media_id")]
public string ThumbMediaId { get; set; }
/// <summary>
/// 作者
/// </summary>
[JsonProperty("author")]
[JsonPropertyName("author")]
public string Author { get; set; }
/// <summary>
/// 点击“阅读原文”之后的页面链接
/// </summary>
[JsonProperty("content_source_url")]
[JsonPropertyName("content_source_url")]
public string ContentSourceUrl { get; set; }
/// <summary>
/// 图文消息的内容
/// </summary>
[JsonProperty("content")]
[JsonPropertyName("content")]
public string Content { get; set; }
/// <summary>
/// 图文消息的描述
/// </summary>
[JsonProperty("digest")]
[JsonPropertyName("digest")]
public string Digest { get; set; }
}
/// <summary>
/// 推送图文消息(存储在企业微信)输入参数
/// </summary>
public class SendMpNewsAppChatInput : SendBaseAppChatInput
{
/// <summary>
/// 消息内容
/// </summary>
[JsonProperty("mpnews")]
[JsonPropertyName("mpnews")]
public object MpNews { get; set; }
/// <summary>
/// 图文消息
/// </summary>
/// <param name="chatId"></param>
/// <param name="mpNewsList">图文消息列表</param>
/// <param name="safe"></param>
public SendMpNewsAppChatInput(string chatId, List<SendMpNewsItem> mpNewsList, bool safe = false) : base(chatId, "mpnews", safe)
{
MpNews = new { articles = mpNewsList };
}
}

View File

@ -0,0 +1,17 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Plugin.WorkWeixin.Proxy;
public class CreatAppChatOutput : BaseWorkOutput
{
/// <summary>
/// 群聊的唯一标志
/// </summary>
[JsonProperty("chatid")]
[JsonPropertyName("chatid")]
public string ChatId { get; set; }
}

View File

@ -0,0 +1,53 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Plugin.WorkWeixin.Proxy.AppChat;
/// <summary>
/// 群聊会话远程调用服务
/// </summary>
public interface IWorkWeixinAppChatHttp : IHttpDeclarative
{
/// <summary>
/// 创建群聊会话
/// </summary>
/// <param name="accessToken"></param>
/// <param name="body"></param>
/// <returns></returns>
/// <inheritdoc cref="https://developer.work.weixin.qq.com/document/path/90245"/>
[Post("https://qyapi.weixin.qq.com/cgi-bin/appchat/create")]
Task<CreatAppChatOutput> Create([Query("access_token")] string accessToken, [Body] CreatAppChatInput body);
/// <summary>
/// 修改群聊会话
/// </summary>
/// <param name="accessToken"></param>
/// <param name="body"></param>
/// <returns></returns>
/// <inheritdoc cref="https://developer.work.weixin.qq.com/document/path/98913"/>
[Post("https://qyapi.weixin.qq.com/cgi-bin/appchat/update")]
Task<CreatAppChatOutput> Update([Query("access_token")] string accessToken, [Body] UpdateAppChatInput body);
/// <summary>
/// 获取群聊会话
/// </summary>
/// <param name="accessToken"></param>
/// <param name="chatId"></param>
/// <returns></returns>
/// <inheritdoc cref="https://developer.work.weixin.qq.com/document/path/98914"/>
[Get("https://qyapi.weixin.qq.com/cgi-bin/appchat/get")]
Task<CreatAppChatOutput> Get([Query("access_token")] string accessToken, [Query("chatid")] string chatId);
/// <summary>
/// 应用推送消息
/// </summary>
/// <param name="accessToken"></param>
/// <param name="body"></param>
/// <returns></returns>
/// <inheritdoc cref="https://developer.work.weixin.qq.com/document/path/90248"/>
[Post("https://qyapi.weixin.qq.com/cgi-bin/appchat/send")]
Task<BaseWorkOutput> Send([Query("access_token")] string accessToken, [Body] SendBaseAppChatInput body);
}

View File

@ -0,0 +1,24 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Plugin.WorkWeixin.Proxy;
public class AuthAccessTokenHttpOutput : BaseWorkOutput
{
/// <summary>
/// 获取到的凭证
/// </summary>
[JsonProperty("access_token")]
[JsonPropertyName("access_token")]
public string AccessToken { get; set; }
/// <summary>
/// 凭证的有效时间(秒)
/// </summary>
[JsonProperty("expires_in")]
[JsonPropertyName("expires_in")]
public int ExpiresIn { get; set; }
}

View File

@ -0,0 +1,23 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Plugin.WorkWeixin.Proxy.AppChat;
/// <summary>
/// 授权会话远程服务
/// </summary>
public interface IWorkWeixinAuthHttp : IHttpDeclarative
{
/// <summary>
/// 获取接口凭证
/// </summary>
/// <param name="corpId">企业ID</param>
/// <param name="corpSecret">应用的凭证密钥</param>
/// <returns></returns>
/// <inheritdoc cref="https://developer.work.weixin.qq.com/document/path/91039"/>
[Post("https://qyapi.weixin.qq.com/cgi-bin/gettoken")]
Task<AuthAccessTokenHttpOutput> GetToken([Query("corpid")] string corpId, [Query("corpsecret")] string corpSecret);
}

View File

@ -0,0 +1,48 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Plugin.WorkWeixin.Proxy;
/// <summary>
/// 创建部门输入参数
/// </summary>
public class DepartmentHttpInput
{
/// <summary>
/// 部门名称
/// </summary>
[JsonProperty("id")]
[JsonPropertyName("id")]
public long? Id { get; set; }
/// <summary>
/// 父部门id
/// </summary>
[JsonProperty("parentid")]
[JsonPropertyName("parentid")]
public long? ParentId { get; set; }
/// <summary>
/// 部门名称
/// </summary>
[JsonProperty("name")]
[JsonPropertyName("name")]
public string Name { get; set; }
/// <summary>
/// 英文名称
/// </summary>
[JsonProperty("name_en")]
[JsonPropertyName("name_en")]
public string NameEn { get; set; }
/// <summary>
/// 序号
/// </summary>
[JsonProperty("order")]
[JsonPropertyName("order")]
public int? Order { get; set; }
}

View File

@ -0,0 +1,95 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Plugin.WorkWeixin.Proxy;
/// <summary>
/// 部门Id列表输出参数
/// </summary>
public class DepartmentIdOutput : BaseWorkOutput
{
/// <summary>
/// id
/// </summary>
[JsonProperty("department_id")]
[JsonPropertyName("department_id")]
public List<DepartmentItemOutput> DepartmentList { get; set; }
}
/// <summary>
/// 部门Id输出参数
/// </summary>
public class DepartmentItemOutput
{
/// <summary>
/// 部门名称
/// </summary>
[JsonProperty("id")]
[JsonPropertyName("id")]
public long? Id { get; set; }
/// <summary>
/// 父部门id
/// </summary>
[JsonProperty("parentid")]
[JsonPropertyName("parentid")]
public long? ParentId { get; set; }
/// <summary>
/// 序号
/// </summary>
[JsonProperty("order")]
[JsonPropertyName("order")]
public int? Order { get; set; }
}
/// <summary>
/// 部门输出参数
/// </summary>
public class DepartmentOutput
{
/// <summary>
/// 部门名称
/// </summary>
[JsonProperty("id")]
[JsonPropertyName("id")]
public long? Id { get; set; }
/// <summary>
/// 父部门id
/// </summary>
[JsonProperty("parentid")]
[JsonPropertyName("parentid")]
public long? ParentId { get; set; }
/// <summary>
/// 部门名称
/// </summary>
[JsonProperty("name")]
[JsonPropertyName("name")]
public string Name { get; set; }
/// <summary>
/// 英文名称
/// </summary>
[JsonProperty("name_en")]
[JsonPropertyName("name_en")]
public string NameEn { get; set; }
/// <summary>
/// 部门负责人列表
/// </summary>
[JsonProperty("department_leader")]
[JsonPropertyName("department_leader")]
public List<string> Leaders { get; set; }
/// <summary>
/// 序号
/// </summary>
[JsonProperty("order")]
[JsonPropertyName("order")]
public int? Order { get; set; }
}

View File

@ -0,0 +1,63 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Plugin.WorkWeixin.Proxy.AppChat;
/// <summary>
/// 部门远程调用服务
/// </summary>
public interface IDepartmentHttp : IHttpDeclarative
{
/// <summary>
/// 创建部门
/// https://developer.work.weixin.qq.com/document/path/90205
/// </summary>
/// <param name="accessToken"></param>
/// <param name="body"></param>
/// <returns></returns>
[Post("https://qyapi.weixin.qq.com/cgi-bin/department/create")]
Task<BaseWorkIdOutput> Create([Query("access_token")] string accessToken, [Body] DepartmentHttpInput body);
/// <summary>
/// 修改部门
/// https://developer.work.weixin.qq.com/document/path/90206
/// </summary>
/// <param name="accessToken"></param>
/// <param name="body"></param>
/// <returns></returns>
[Post("https://qyapi.weixin.qq.com/cgi-bin/department/update")]
Task<BaseWorkOutput> Update([Query("access_token")] string accessToken, [Body] DepartmentHttpInput body);
/// <summary>
/// 删除部门
/// https://developer.work.weixin.qq.com/document/path/90207
/// </summary>
/// <param name="accessToken"></param>
/// <param name="id"></param>
/// <returns></returns>
[Get("https://qyapi.weixin.qq.com/cgi-bin/department/delete")]
Task<BaseWorkOutput> Delete([Query("access_token")] string accessToken, [Query] long id);
/// <summary>
/// 获取部门Id列表
/// https://developer.work.weixin.qq.com/document/path/90208
/// </summary>
/// <param name="accessToken"></param>
/// <param name="id"></param>
/// <returns></returns>
[Get("https://qyapi.weixin.qq.com/cgi-bin/department/simplelist")]
Task<DepartmentIdOutput> SimpleList([Query("access_token")] string accessToken, [Query] long id);
/// <summary>
/// 获取部门详情
/// https://developer.work.weixin.qq.com/document/path/90208
/// </summary>
/// <param name="accessToken"></param>
/// <param name="id"></param>
/// <returns></returns>
[Get("https://qyapi.weixin.qq.com/cgi-bin/department/get")]
Task<DepartmentOutput> Get([Query("access_token")] string accessToken, [Query] long id);
}

View File

@ -0,0 +1,54 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Plugin.WorkWeixin.Proxy;
/// <summary>
/// 标签输入参数
/// </summary>
public class TagHttpInput
{
/// <summary>
/// 标签id
/// </summary>
[JsonProperty("tagid")]
[JsonPropertyName("tagid")]
public long? TagId { get; set; }
/// <summary>
/// 标签名称
/// </summary>
[JsonProperty("tagname")]
[JsonPropertyName("tagname")]
public string TagName { get; set; }
}
/// <summary>
/// 增加标签成员输入参数
/// </summary>
public class TagUsersTagInput
{
/// <summary>
/// 标签id
/// </summary>
[JsonProperty("tagid")]
[JsonPropertyName("tagid")]
public long TagId { get; set; }
/// <summary>
/// 企业成员ID列表
/// </summary>
[JsonProperty("userlist")]
[JsonPropertyName("userlist")]
public List<string> UserList { get; set; }
/// <summary>
/// 企业部门ID列表
/// </summary>
[JsonProperty("partylist")]
[JsonPropertyName("partylist")]
public List<long> PartyList { get; set; }
}

View File

@ -0,0 +1,33 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Plugin.WorkWeixin.Proxy;
/// <summary>
/// 新增标签输出参数
/// </summary>
public class TagIdHttpOutput : BaseWorkOutput
{
/// <summary>
/// 标签Id
/// </summary>
[JsonProperty("tagid")]
[JsonPropertyName("tagid")]
public long? TagId { get; set; }
}
/// <summary>
/// 标签列表输出参数
/// </summary>
public class TagListHttpOutput : BaseWorkOutput
{
/// <summary>
/// 标签Id
/// </summary>
[JsonProperty("taglist")]
[JsonPropertyName("taglist")]
public List<TagHttpInput> TagList { get; set; }
}

View File

@ -0,0 +1,82 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Plugin.WorkWeixin.Proxy;
/// <summary>
/// 标签远程调用服务
/// </summary>
public interface ITagHttp : IHttpDeclarative
{
/// <summary>
/// 创建标签
/// https://developer.work.weixin.qq.com/document/path/90210
/// </summary>
/// <param name="accessToken"></param>
/// <param name="body"></param>
/// <returns></returns>
[Post("https://qyapi.weixin.qq.com/cgi-bin/tag/create")]
Task<BaseWorkIdOutput> Create([Query("access_token")] string accessToken, [Body] TagHttpInput body);
/// <summary>
/// 更新标签名字
/// https://developer.work.weixin.qq.com/document/path/90211
/// </summary>
/// <param name="accessToken"></param>
/// <param name="body"></param>
/// <returns></returns>
[Post("https://qyapi.weixin.qq.com/cgi-bin/tag/update")]
Task<TagIdHttpOutput> Update([Query("access_token")] string accessToken, [Body] TagHttpInput body);
/// <summary>
/// 删除标签
/// https://developer.work.weixin.qq.com/document/path/90212
/// </summary>
/// <param name="accessToken"></param>
/// <param name="tagId"></param>
/// <returns></returns>
[Get("https://qyapi.weixin.qq.com/cgi-bin/tag/delete")]
Task<BaseWorkOutput> Delete([Query("access_token")] string accessToken, [Query("tagid")] long tagId);
/// <summary>
/// 获取标签详情
/// https://developer.work.weixin.qq.com/document/path/90213
/// </summary>
/// <param name="accessToken"></param>
/// <param name="tagId"></param>
/// <returns></returns>
[Get("https://qyapi.weixin.qq.com/cgi-bin/tag/get")]
Task<DepartmentOutput> Get([Query("access_token")] string accessToken, [Query("tagid")] long tagId);
/// <summary>
/// 增加标签成员
/// https://developer.work.weixin.qq.com/document/path/90214
/// </summary>
/// <param name="accessToken"></param>
/// <param name="body"></param>
/// <returns></returns>
[Post("https://qyapi.weixin.qq.com/cgi-bin/tag/addtagusers")]
Task<DepartmentOutput> AddTagUsers([Query("access_token")] string accessToken, [Body] TagUsersTagInput body);
/// <summary>
/// 删除标签成员
/// https://developer.work.weixin.qq.com/document/path/90215
/// </summary>
/// <param name="accessToken"></param>
/// <param name="body"></param>
/// <returns></returns>
[Post("https://qyapi.weixin.qq.com/cgi-bin/tag/deltagusers")]
Task<DepartmentOutput> DelTagUsers([Query("access_token")] string accessToken, [Body] TagUsersTagInput body);
/// <summary>
/// 获取标签列表
/// https://developer.work.weixin.qq.com/document/path/90216
/// </summary>
/// <param name="accessToken"></param>
/// <returns></returns>
[Get("https://qyapi.weixin.qq.com/cgi-bin/tag/list")]
Task<TagListHttpOutput> List([Query("access_token")] string accessToken);
}

View File

@ -0,0 +1,25 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
using Admin.NET.Plugin.WorkWeixin.Option;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
namespace Admin.NET.Plugin.WorkWeixin;
[AppStartup(100)]
public class Startup : AppStartup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddConfigurableOptions<WorkWeixinOptions>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
}
}

View File

@ -0,0 +1,40 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Plugin.WorkWeixin;
/// <summary>
/// 企业微信接口输出基类
/// </summary>
public class BaseWorkOutput
{
/// <summary>
/// 返回码
/// </summary>
[JsonProperty("errcode")]
[JsonPropertyName("errcode")]
public int ErrCode { get; set; }
/// <summary>
/// 对返回码的文本描述内容
/// </summary>
[JsonProperty("errmsg")]
[JsonPropertyName("errmsg")]
public string ErrMsg { get; set; }
}
/// <summary>
/// 带id的输出参数
/// </summary>
public class BaseWorkIdOutput : BaseWorkOutput
{
/// <summary>
/// id
/// </summary>
[JsonProperty("id")]
[JsonPropertyName("id")]
public long? Id { get; set; }
}