From 2f5f8ad7bd7f9ac8fff3d5f5a7c49fbfe03c0069 Mon Sep 17 00:00:00 2001 From: Jimmy Wu Date: Thu, 31 Dec 2020 15:37:20 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E5=A4=96=E9=83=A8=E8=81=94=E7=B3=BB=E4=BA=BAApi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdvancedAPIs/CustomerTag/CorpTagJson.cs | 65 ++++++ .../CustomerTag/CustomerTagApi.cs | 199 ++++++++++++++++++ .../AdvancedAPIs/External/ExternalApi.cs | 149 ++++++++++++- .../ExternalJson/AddMsgTemplateRequest.cs | 40 ++++ .../ExternalJson/AddMsgTemplateResult.cs | 14 ++ .../ExternalJson/ExternalContactResult.cs | 38 ++++ .../GetExternalContactInfoBatchResult.cs | 7 +- .../ExternalJson/GetFollowUserListResult.cs | 17 ++ .../External/ExternalJson/GroupMsgResult.cs | 40 ++++ .../ExternalJson/SendWelcomeMessageRequest.cs | 13 ++ .../External/GetExternalContactResult.cs | 17 +- .../Entities/JsonResult/ExternalProfile.cs | 77 +++++++ .../Entities/Models/MessageContentModels.cs | 74 +++++++ .../Entities/MsgTypeHelper.cs | 22 ++ .../Senparc.Weixin.Work/Enums.cs | 50 +++++ .../Senparc.Weixin.Work.csproj | 9 + 16 files changed, 828 insertions(+), 3 deletions(-) create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/CustomerTag/CorpTagJson.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/CustomerTag/CustomerTagApi.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/AddMsgTemplateRequest.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/AddMsgTemplateResult.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/ExternalContactResult.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/GetFollowUserListResult.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/GroupMsgResult.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/SendWelcomeMessageRequest.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/JsonResult/ExternalProfile.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Models/MessageContentModels.cs diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/CustomerTag/CorpTagJson.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/CustomerTag/CorpTagJson.cs new file mode 100644 index 0000000000..142cf515b7 --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/CustomerTag/CorpTagJson.cs @@ -0,0 +1,65 @@ +using System.Collections.Generic; +using Senparc.Weixin.Entities; + +namespace Senparc.Weixin.Work.AdvancedAPIs.CustomerTag +{ + public class GetCorpTagListResult : WorkJsonResult + { + public List tag_group { get; set; } + } + + public class AddCorpCustomerTagResult : WorkJsonResult + { + public CorpTagGroup tag_group { get; set; } + } + + public class EditCorpCustomerTagRequest + { + /// + /// 标签或标签组的id + /// + public string id { get; set; } + /// + /// 新的标签或标签组名称,最长为30个字符 + /// + public string name { get; set; } + /// + /// 标签/标签组的次序值 + /// order值大的排序靠前。有效的值范围是[0, 2^32) + /// + public int order { get; set; } + } + + public class DeleteCorpCustomerTagRequest + { + public List tag_id { get; set; } + public List group_id { get; set; } + } + + public class ExternalContactMarkTagRequest + { + public string userid { get; set; } + public string external_userid { get; set; } + public List add_tag { get; set; } + public List remove_tag { get; set; } + } + + public class CorpTagGroup + { + public string group_id { get; set; } + public string group_name { get; set; } + public long create_time { get; set; } + public long order { get; set; } + public bool deleted { get; set; } + public List tag { get; set; } + } + + public class CorpTag + { + public string id { get; set; } + public string name { get; set; } + public long create_time { get; set; } + public long order { get; set; } + public bool deleted { get; set; } + } +} \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/CustomerTag/CustomerTagApi.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/CustomerTag/CustomerTagApi.cs new file mode 100644 index 0000000000..cb64350a21 --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/CustomerTag/CustomerTagApi.cs @@ -0,0 +1,199 @@ +using System.Threading.Tasks; +using Senparc.CO2NET.Extensions; +using Senparc.NeuChar; +using Senparc.Weixin.Entities; + +namespace Senparc.Weixin.Work.AdvancedAPIs.CustomerTag +{ + /// + /// 客户标签管理Api + /// + public class CustomerTagApi + { + + #region 同步方法 + + /// + /// 获取企业标签库 + /// + /// + /// + /// + [ApiBind(NeuChar.PlatformType.WeChat_Work, "CustomerTagApi.GetCustomerTagList", true)] + public static GetCorpTagListResult GetCustomerTagList(string accessTokenOrAppKey, int timeOut = Config.TIME_OUT) + { + return ApiHandlerWapper.TryCommonApi(accessToken => + { + var url = string.Format(Config.ApiWorkHost + "/cgi-bin/externalcontact/get_corp_tag_list?access_token={0}", accessToken.AsUrlData()); + + return Senparc.Weixin.CommonAPIs.CommonJsonSend.Send(accessToken, url, null, CommonJsonSendType.POST, timeOut); + }, accessTokenOrAppKey); + } + + /// + /// 添加企业客户标签 + /// + /// + /// + /// + [ApiBind(NeuChar.PlatformType.WeChat_Work, "CustomerTagApi.AddCorpCustomerTag", true)] + public static AddCorpCustomerTagResult AddCorpCustomerTag(string accessTokenOrAppKey, CorpTagGroup data, int timeOut = Config.TIME_OUT) + { + return ApiHandlerWapper.TryCommonApi(accessToken => + { + var url = string.Format(Config.ApiWorkHost + "/cgi-bin/externalcontact/add_corp_tag?access_token={0}", accessToken.AsUrlData()); + + return Senparc.Weixin.CommonAPIs.CommonJsonSend.Send(accessToken, url, data, timeOut: timeOut); + }, accessTokenOrAppKey); + } + + /// + /// 编辑企业客户标签 + /// + /// + /// + /// + /// + [ApiBind(NeuChar.PlatformType.WeChat_Work, "CustomerTagApi.EditCorpCustomerTag", true)] + public static WorkJsonResult EditCorpCustomerTag(string accessTokenOrAppKey, EditCorpCustomerTagRequest data, int timeOut = Config.TIME_OUT) + { + return ApiHandlerWapper.TryCommonApi(accessToken => + { + var url = string.Format(Config.ApiWorkHost + "/cgi-bin/externalcontact/edit_corp_tag?access_token={0}", accessToken.AsUrlData()); + + return Senparc.Weixin.CommonAPIs.CommonJsonSend.Send(accessToken, url, data, timeOut: timeOut); + }, accessTokenOrAppKey); + } + + /// + /// 删除企业客户标签 + /// + /// + /// + /// + /// + [ApiBind(NeuChar.PlatformType.WeChat_Work, "CustomerTagApi.DeleteCorpCustomerTag", true)] + public static WorkJsonResult DeleteCorpCustomerTag(string accessTokenOrAppKey, DeleteCorpCustomerTagRequest data, int timeOut = Config.TIME_OUT) + { + return ApiHandlerWapper.TryCommonApi(accessToken => + { + var url = string.Format(Config.ApiWorkHost + "/cgi-bin/externalcontact/del_corp_tag?access_token={0}", accessToken.AsUrlData()); + + return Senparc.Weixin.CommonAPIs.CommonJsonSend.Send(accessToken, url, data, timeOut: timeOut); + }, accessTokenOrAppKey); + } + + /// + /// 编辑客户企业标签标签 + /// + /// + /// + /// + /// + [ApiBind(NeuChar.PlatformType.WeChat_Work, "CustomerTagApi.ExternalContactMarkTag", true)] + public static WorkJsonResult ExternalContactMarkTag(string accessTokenOrAppKey, ExternalContactMarkTagRequest data, int timeOut = Config.TIME_OUT) + { + return ApiHandlerWapper.TryCommonApi(accessToken => + { + var url = string.Format(Config.ApiWorkHost + "/cgi-bin/externalcontact/mark_tag?access_token={0}", accessToken.AsUrlData()); + + return Senparc.Weixin.CommonAPIs.CommonJsonSend.Send(accessToken, url, data, timeOut: timeOut); + }, accessTokenOrAppKey); + } + + #endregion + + #region 异步方法 + + /// + /// 获取企业标签库 + /// + /// + /// + /// + [ApiBind(NeuChar.PlatformType.WeChat_Work, "CustomerTagApi.GetCustomerTagListAsync", true)] + public static async Task GetCustomerTagListAsync(string accessTokenOrAppkey, int timeOut = Config.TIME_OUT) + { + return await ApiHandlerWapper.TryCommonApiAsync(async accessToken => + { + var url = string.Format(Config.ApiWorkHost + "/cgi-bin/externalcontact/get_corp_tag_list?access_token={0}", accessToken.AsUrlData()); + + return await Weixin.CommonAPIs.CommonJsonSend.SendAsync(accessToken, url, null, CommonJsonSendType.POST, timeOut).ConfigureAwait(false); + }, accessTokenOrAppkey).ConfigureAwait(false); + } + + /// + /// 添加企业客户标签 + /// + /// + /// + /// + [ApiBind(NeuChar.PlatformType.WeChat_Work, "CustomerTagApi.AddCorpCustomerTagAsync", true)] + public static async Task AddCorpCustomerTagAsync(string accessTokenOrAppKey, CorpTagGroup data, int timeOut = Config.TIME_OUT) + { + return await ApiHandlerWapper.TryCommonApiAsync(async accessToken => + { + var url = string.Format(Config.ApiWorkHost + "/cgi-bin/externalcontact/add_corp_tag?access_token={0}", accessToken.AsUrlData()); + + return await Senparc.Weixin.CommonAPIs.CommonJsonSend.SendAsync(accessToken, url, data, timeOut: timeOut).ConfigureAwait(false); + }, accessTokenOrAppKey).ConfigureAwait(false); + } + + /// + /// 编辑企业客户标签 + /// + /// + /// + /// + /// + [ApiBind(NeuChar.PlatformType.WeChat_Work, "CustomerTagApi.EditCorpCustomerTagAsync", true)] + public static async Task EditCorpCustomerTagAsync(string accessTokenOrAppKey, EditCorpCustomerTagRequest data, int timeOut = Config.TIME_OUT) + { + return await ApiHandlerWapper.TryCommonApiAsync(async accessToken => + { + var url = string.Format(Config.ApiWorkHost + "/cgi-bin/externalcontact/edit_corp_tag?access_token={0}", accessToken.AsUrlData()); + + return await Senparc.Weixin.CommonAPIs.CommonJsonSend.SendAsync(accessToken, url, data, timeOut: timeOut).ConfigureAwait(false); + }, accessTokenOrAppKey).ConfigureAwait(false); + } + + /// + /// 删除企业客户标签 + /// + /// + /// + /// + /// + [ApiBind(NeuChar.PlatformType.WeChat_Work, "CustomerTagApi.DeleteCorpCustomerTagAsync", true)] + public static async Task DeleteCorpCustomerTagAsync(string accessTokenOrAppKey, DeleteCorpCustomerTagRequest data, int timeOut = Config.TIME_OUT) + { + return await ApiHandlerWapper.TryCommonApiAsync(async accessToken => + { + var url = string.Format(Config.ApiWorkHost + "/cgi-bin/externalcontact/del_corp_tag?access_token={0}", accessToken.AsUrlData()); + + return await Senparc.Weixin.CommonAPIs.CommonJsonSend.SendAsync(accessToken, url, data, timeOut: timeOut).ConfigureAwait(false); + }, accessTokenOrAppKey).ConfigureAwait(false); + } + + /// + /// 编辑客户企业标签标签 + /// + /// + /// + /// + /// + [ApiBind(NeuChar.PlatformType.WeChat_Work, "CustomerTagApi.ExternalContactMarkTagAsync", true)] + public static async Task ExternalContactMarkTagAsync(string accessTokenOrAppKey, ExternalContactMarkTagRequest data, int timeOut = Config.TIME_OUT) + { + return await ApiHandlerWapper.TryCommonApiAsync(async accessToken => + { + var url = string.Format(Config.ApiWorkHost + "/cgi-bin/externalcontact/mark_tag?access_token={0}", accessToken.AsUrlData()); + + return await Senparc.Weixin.CommonAPIs.CommonJsonSend.SendAsync(accessToken, url, data, timeOut: timeOut).ConfigureAwait(false); + }, accessTokenOrAppKey).ConfigureAwait(false); + } + + #endregion + + } +} \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalApi.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalApi.cs index 6eba16033c..bd7c29bd57 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalApi.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalApi.cs @@ -35,6 +35,26 @@ public static class ExternalApi { #region 同步方法 + #region 企业服务人员管理 + + /// + /// 获取配置了客户联系功能的成员列表 + /// + /// 调用接口凭证 + /// + [ApiBind(NeuChar.PlatformType.WeChat_Work, "ExternalApi.GetFollowUserList", true)] + public static GetFollowUserListResult GetFollowUserList(string accessTokenOrAppKey, int timeOut = Config.TIME_OUT) + { + return ApiHandlerWapper.TryCommonApi(accessToken => + { + var url = $"{Config.ApiWorkHost}/cgi-bin/externalcontact/get_follow_user_list?access_token={accessToken}"; + + return CommonJsonSend.Send(null, url, null, CommonJsonSendType.GET, timeOut); + }, accessTokenOrAppKey); + } + + #endregion + /// /// 离职成员的外部联系人再分配 /// @@ -208,10 +228,83 @@ public static WorkJsonResult UpdateExternalContactRemark(string accessTokenOrApp #endregion - #endregion + #region 消息推送 + + /// + /// 添加企业群发消息任务 + /// + /// + /// + [ApiBind(NeuChar.PlatformType.WeChat_Work, "ExternalApi.AddMsgTemplate", true)] + public static AddMsgTemplateResult AddMsgTemplate(string accessTokenOrAppKey, AddMsgTemplateRequest request, int timeOut = Config.TIME_OUT) + { + return ApiHandlerWapper.TryCommonApi(accessToken => + { + var url = $"{Config.ApiWorkHost}/cgi-bin/externalcontact/add_msg_template?access_token={accessToken}"; + + return CommonJsonSend.Send(null, url, request, CommonJsonSendType.POST, timeOut); + }, accessTokenOrAppKey); + } + + /// + /// 获取企业群发消息发送结果 + /// + /// + /// + [ApiBind(NeuChar.PlatformType.WeChat_Work, "ExternalApi.GetGroupMsgResult", true)] + public static GroupMsgResult GetGroupMsgResult(string accessTokenOrAppKey, string msgid, int timeOut = Config.TIME_OUT) + { + return ApiHandlerWapper.TryCommonApi(accessToken => + { + var url = $"{Config.ApiWorkHost}/cgi-bin/externalcontact/add_msg_template?access_token={accessToken}"; + + return CommonJsonSend.Send(null, url, new { msgid }, CommonJsonSendType.POST, timeOut); + }, accessTokenOrAppKey); + } + + /// + /// 发送新客户欢迎语 + /// + /// + /// + /// + /// + [ApiBind(NeuChar.PlatformType.WeChat_Work, "ExternalApi.SendWelcomeMessage", true)] + public static WorkJsonResult SendWelcomeMessage(string accessTokenOrAppKey, SendWelcomeMessageRequest request, int timeOut = Config.TIME_OUT) + { + return ApiHandlerWapper.TryCommonApi(accessToken => + { + var url = $"{Config.ApiWorkHost}/cgi-bin/externalcontact/send_welcome_msg?access_token={accessToken}"; + return CommonJsonSend.Send(null, url, request, CommonJsonSendType.POST, timeOut); + }, accessTokenOrAppKey); + } + #endregion + + #endregion + #region 异步方法 + + #region 企业服务人员管理 + + /// + /// 获取配置了客户联系功能的成员列表 + /// + /// 调用接口凭证 + /// + [ApiBind(NeuChar.PlatformType.WeChat_Work, "ExternalApi.GetFollowUserListAsync", true)] + public static async Task GetFollowUserListAsync(string accessTokenOrAppKey, int timeOut = Config.TIME_OUT) + { + return await ApiHandlerWapper.TryCommonApiAsync(async accessToken => + { + var url = $"{Config.ApiWorkHost}/cgi-bin/externalcontact/get_follow_user_list?access_token={accessToken}"; + + return await CommonJsonSend.SendAsync(null, url, null, CommonJsonSendType.GET, timeOut).ConfigureAwait(false); + }, accessTokenOrAppKey).ConfigureAwait(false); + } + + #endregion /// /// 【异步方法】离职成员的外部联系人再分配 @@ -386,6 +479,60 @@ public static async Task UpdateExternalContactRemarkAsync(string #endregion + #region 消息推送 + + /// + /// 添加企业群发消息任务 + /// + /// + /// + [ApiBind(NeuChar.PlatformType.WeChat_Work, "ExternalApi.AddMsgTemplateAsync", true)] + public static async Task AddMsgTemplateAsync(string accessTokenOrAppKey, AddMsgTemplateRequest request, int timeOut = Config.TIME_OUT) + { + return await ApiHandlerWapper.TryCommonApiAsync(async accessToken => + { + var url = $"{Config.ApiWorkHost}/cgi-bin/externalcontact/add_msg_template?access_token={accessToken}"; + + return await CommonJsonSend.SendAsync(null, url, request, CommonJsonSendType.POST, timeOut).ConfigureAwait(false); + }, accessTokenOrAppKey).ConfigureAwait(false); + } + + /// + /// 获取企业群发消息发送结果 + /// + /// + /// + [ApiBind(NeuChar.PlatformType.WeChat_Work, "ExternalApi.GetGroupMsgResultAsync", true)] + public static async Task GetGroupMsgResultAsync(string accessTokenOrAppKey, string msgid, int timeOut = Config.TIME_OUT) + { + return await ApiHandlerWapper.TryCommonApiAsync(async accessToken => + { + var url = $"{Config.ApiWorkHost}/cgi-bin/externalcontact/add_msg_template?access_token={accessToken}"; + + return await CommonJsonSend.SendAsync(null, url, new { msgid }, CommonJsonSendType.POST, timeOut).ConfigureAwait(false); + }, accessTokenOrAppKey).ConfigureAwait(false); + } + + /// + /// 发送新客户欢迎语 + /// + /// + /// + /// + /// + [ApiBind(NeuChar.PlatformType.WeChat_Work, "ExternalApi.SendWelcomeMessageAsync", true)] + public static async Task SendWelcomeMessageAsync(string accessTokenOrAppKey, SendWelcomeMessageRequest request, int timeOut = Config.TIME_OUT) + { + return await ApiHandlerWapper.TryCommonApiAsync(async accessToken => + { + var url = $"{Config.ApiWorkHost}/cgi-bin/externalcontact/send_welcome_msg?access_token={accessToken}"; + + return await CommonJsonSend.SendAsync(null, url, request, CommonJsonSendType.POST, timeOut).ConfigureAwait(false); + }, accessTokenOrAppKey).ConfigureAwait(false); + } + + #endregion + #endregion } } diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/AddMsgTemplateRequest.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/AddMsgTemplateRequest.cs new file mode 100644 index 0000000000..4e1de236af --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/AddMsgTemplateRequest.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using Senparc.Weixin.Work.Entities.Models; + +namespace Senparc.Weixin.Work.AdvancedAPIs.External.ExternalJson +{ + /// + /// 添加企业群发消息任务参数实体 + /// + public class AddMsgTemplateRequest + { + /// + /// 群发任务的类型,默认为single,表示发送给客户,group表示发送给客户群 + /// + public string chat_type { get; set; } = "single"; + /// + /// 客户的外部联系人id列表,仅在chat_type为single时有效,不可与sender同时为空,最多可传入1万个客户 + /// + public List external_userid { get; set; } + /// + /// 发送企业群发消息的成员userid,当类型为发送给客户群时必填 + /// + public string sender { get; set; } + /// + /// 文本消息 + /// + public MessageText text { get; set; } + /// + /// 图片消息 + /// + public MessageImage image { get; set; } + /// + /// 图文消息 + /// + public MessageLink link { get; set; } + /// + /// 小程序消息 + /// + public MessageMiniprogram miniprogram { get; set; } + } +} \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/AddMsgTemplateResult.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/AddMsgTemplateResult.cs new file mode 100644 index 0000000000..b108e26a68 --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/AddMsgTemplateResult.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using Senparc.Weixin.Entities; + +namespace Senparc.Weixin.Work.AdvancedAPIs.External.ExternalJson +{ + /// + /// + /// + public class AddMsgTemplateResult : WorkJsonResult + { + public List fail_list { get; set; } + public string msgid { get; set; } + } +} \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/ExternalContactResult.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/ExternalContactResult.cs new file mode 100644 index 0000000000..c57762017d --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/ExternalContactResult.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Senparc.Weixin.Entities; + +namespace Senparc.Weixin.Work.AdvancedAPIs.External.ExternalJson +{ + public class GetExternalContactInfoResult : WorkJsonResult + { + public ExternalContactInfo external_contact { get; set; } + public FollowUserInfo follow_user { get; set; } + } + + public class ExternalContactInfo + { + public string external_userid { get; set; } + public string name { get; set; } + public int type { get; set; } + public string avatar { get; set; } + public int gender { get; set; } + public string unionid { get; set; } + } + + public class FollowUserInfo + { + public string remark { get; set; } + public string description { get; set; } + public long creattime { get; set; } + public string[] tag_id { get; set; } + public string[] remark_mobiles { get; set; } + public int add_way { get; set; } + public string remark_corp_name { get; set; } + public string oper_userid { get; set; } + public string state { get; set; } + } +} diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/GetExternalContactInfoBatchResult.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/GetExternalContactInfoBatchResult.cs index a268df2109..1dad1c105a 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/GetExternalContactInfoBatchResult.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/GetExternalContactInfoBatchResult.cs @@ -15,6 +15,7 @@ using System.Text; using System.Threading.Tasks; using Senparc.Weixin.Entities; +using Senparc.Weixin.Work.Entities.JsonResult; namespace Senparc.Weixin.Work.AdvancedAPIs.External.ExternalJson { @@ -47,8 +48,12 @@ public class ExternalContact public string name { get; set; } public int type { get; set; } public string avatar { get; set; } - public int gender { get; set; } + public TencentGender gender { get; set; } public string unionid { get; set; } + public string position { get; set; } + public string corp_name { get; set; } + public string corp_full_name { get; set; } + public ExternalProfile external_profile { get; set; } } public class FollowUser diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/GetFollowUserListResult.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/GetFollowUserListResult.cs new file mode 100644 index 0000000000..ef7b63309a --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/GetFollowUserListResult.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; +using Senparc.Weixin.Entities; + +namespace Senparc.Weixin.Work.AdvancedAPIs.External.ExternalJson +{ + /// + /// 获取配置了客户联系功能的成员列表返回 + /// + public class GetFollowUserListResult : WorkJsonResult + { + /// + /// 配置了客户联系功能的成员userid列表 + /// + public List follow_user { get; set; } + + } +} \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/GroupMsgResult.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/GroupMsgResult.cs new file mode 100644 index 0000000000..232be9b96a --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/GroupMsgResult.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using Senparc.Weixin.Entities; + +namespace Senparc.Weixin.Work.AdvancedAPIs.External.ExternalJson +{ + /// + /// 获取企业群发消息发送结果返回参数 + /// + public class GroupMsgResult : WorkJsonResult + { + /// + /// 返回结果明细 + /// + public List detail_list { get; set; } + } + + public class GroupMsgResultDetail + { + /// + /// 外部联系人userid + /// + public string external_userid { get; set; } + /// + /// 外部客户群id + /// + public string chat_id { get; set; } + /// + /// 企业服务人员的userid + /// + public string userid { get; set; } + /// + /// 发送状态 0-未发送 1-已发送 2-因客户不是好友导致发送失败 3-因客户已经收到其他群发消息导致发送失败 + /// + public GroupTaskSentStatus status { get; set; } + /// + /// 发送时间,发送状态为1时返回 + /// + public long send_time { get; set; } + } +} \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/SendWelcomeMessageRequest.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/SendWelcomeMessageRequest.cs new file mode 100644 index 0000000000..680a231a9e --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/SendWelcomeMessageRequest.cs @@ -0,0 +1,13 @@ +using Senparc.Weixin.Work.Entities.Models; + +namespace Senparc.Weixin.Work.AdvancedAPIs.External.ExternalJson +{ + public class SendWelcomeMessageRequest + { + public string welcome_code { get; set; } + public MessageText text { get; set; } + public MessageImage image { get; set; } + public MessageLink link { get; set; } + public MessageMiniprogram miniprogram { get; set; } + } +} \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/GetExternalContactResult.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/GetExternalContactResult.cs index 916b28bbd5..2340bba773 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/GetExternalContactResult.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/GetExternalContactResult.cs @@ -9,6 +9,7 @@ ----------------------------------------------------------------*/ +using System.Collections.Generic; using Senparc.Weixin.Entities; namespace Senparc.Weixin.Work.AdvancedAPIs.External @@ -71,7 +72,21 @@ public class Follow_User public string userid { get; set; } public string remark { get; set; } public string description { get; set; } - public int createtime { get; set; } + public long createtime { get; set; } + public List tags { get; set; } + public string remark_corp_name { get; set; } + public string[] remark_mobiles { get; set; } + public string oper_userid { get; set; } + public string state { get; set; } + public int add_way { get; set; } + } + + public class Follow_User_Tag + { + public string group_name { get; set; } + public string tag_name { get; set; } + public string tag_id { get; set; } + public int type { get; set; } } diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/JsonResult/ExternalProfile.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/JsonResult/ExternalProfile.cs new file mode 100644 index 0000000000..7df783782e --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/JsonResult/ExternalProfile.cs @@ -0,0 +1,77 @@ +namespace Senparc.Weixin.Work.Entities.JsonResult +{ + public class ExternalProfile + { + public string external_corp_name { get; set; } + public ExternalAttribute external_attr { get; set; } + } + + public class ExternalAttribute + { + /// + /// 属性类型: 0-文本 1-网页 2-小程序 + /// + public ExternalAttributeType type { get; set; } + /// + /// 属性名称 + /// + public string name { get; set; } + /// + /// 文本类型的属性 + /// + public ExternalAttrText text { get; set; } + /// + /// 网页类型的属性,url和title字段要么同时为空表示清除该属性,要么同时不为空 + /// + public ExternalAttrWeb web { get; set; } + /// + /// 小程序类型的属性,appid和title字段要么同时为空表示清除改属性,要么同时不为空 + /// + public ExternalAttrMiniprogram miniprogram { get; set; } + } + + /// + /// 文本类型的属性 + /// + public class ExternalAttrText + { + /// + /// 文本属性内容,长度限制12个UTF8字符 + /// + public string value { get; set; } + } + + /// + /// 网页类型的属性 + /// + public class ExternalAttrWeb + { + /// + /// 网页的url,必须包含http或者https头 + /// + public string url { get; set; } + /// + /// 网页的展示标题,长度限制12个UTF8字符 + /// + public string title { get; set; } + } + + /// + /// 小程序类型的属性 + /// + public class ExternalAttrMiniprogram + { + /// + /// 小程序appid,必须是有在本企业安装授权的小程序,否则会被忽略 + /// + public string appid { get; set; } + /// + /// 小程序的页面路径 + /// + public string pagepath { get; set; } + /// + /// 小程序的展示标题,长度限制12个UTF8字符 + /// + public string title { get; set; } + } +} \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Models/MessageContentModels.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Models/MessageContentModels.cs new file mode 100644 index 0000000000..bcd6fc0c20 --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Models/MessageContentModels.cs @@ -0,0 +1,74 @@ +namespace Senparc.Weixin.Work.Entities.Models +{ + /// + /// 文本消息 + /// + public class MessageText + { + /// + /// 文本消息内容,最长为4000字节 + /// + public string content { get; set; } + } + + /// + /// 图片消息 + /// + public class MessageImage + { + /// + /// 图片的media_id,可以通过素材管理接口获得 + /// + public string media_id { get; set; } + /// + /// 图片的链接,仅可使用上传图片接口得到的链接 + /// + public string pic_url { get; set; } + } + + /// + /// 图文消息 + /// + public class MessageLink + { + /// + /// 图文消息标题,最长为128字节 + /// + public string title { get; set; } + /// + /// 图文消息封面的url + /// + public string picurl { get; set; } + /// + /// 图文消息的描述,最长为512字节 + /// + public string desc { get; set; } + /// + /// 图文消息的链接 + /// + public string url { get; set; } + } + + /// + /// 小程序消息 + /// + public class MessageMiniprogram + { + /// + /// 小程序消息标题,最长为64字节 + /// + public string title { get; set; } + /// + /// 小程序消息封面的mediaid,封面图建议尺寸为520*416 + /// + public string pic_media_id { get; set; } + /// + /// 小程序appid,必须是关联到企业的小程序应用 + /// + public string appid { get; set; } + /// + /// 小程序page路径 + /// + public string page { get; set; } + } +} diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/MsgTypeHelper.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/MsgTypeHelper.cs index 8a031d9e05..6578a440ba 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/MsgTypeHelper.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/MsgTypeHelper.cs @@ -13,6 +13,7 @@ using System; using System.Xml.Linq; +using Senparc.Weixin.Work.Entities.Request.Event; namespace Senparc.Weixin.Work.Helpers { @@ -39,6 +40,27 @@ public static ThirdPartyInfo GetThirdPartyInfo(string str) } #endregion + + #region ExternalContactChangeType + + /// + /// 根据xml信息,返回ExternalContactChangeType + /// + /// + public static ExternalContactChangeType GetExternalContactChangeType(XDocument doc) + { + return GetExternalContactChangeType(doc.Root.Element("ChangeType").Value); + } + /// + /// 根据xml信息,返回ExternalContactChangeType + /// + /// + public static ExternalContactChangeType GetExternalContactChangeType(string str) + { + return (ExternalContactChangeType)Enum.Parse(typeof(ExternalContactChangeType), str, true); + } + + #endregion } } diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Enums.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Enums.cs index f01316b5fa..f79a79fc1f 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Enums.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Enums.cs @@ -155,6 +155,22 @@ public enum Event /// CHANGE_EXTERNAL_CHAT } + + public enum TencentGender + { + /// + /// 未知 + /// + Unknown = 0, + /// + /// 男 + /// + Male = 1, + /// + /// 女 + /// + Female = 2 + } public enum ThirdPartyInfo { @@ -198,6 +214,40 @@ public enum ThirdPartyInfo /// REGISTER_CORP } + + public enum ExternalAttributeType + { + Text, + Web, + Miniprogram + } + + public enum GroupChatJoinScene + { + /// + /// 由成员邀请入群(直接邀请入群) + /// + INVITE_BY_DIRECT = 1, + /// + /// 由成员邀请入群(通过邀请链接入群) + /// + INVITE_BY_LINK = 2, + /// + /// 通过扫描群二维码入群 + /// + QR_CODE = 3 + } + + /// + /// 群发任务发送状态 + /// + public enum GroupTaskSentStatus + { + 未发送, + 已发送, + 因客户不是好友导致发送失败, + 因客户已经收到其他群发消息导致发送失败, + } ///// diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Senparc.Weixin.Work.csproj b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Senparc.Weixin.Work.csproj index 47d1162b73..ed1681829e 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Senparc.Weixin.Work.csproj +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Senparc.Weixin.Work.csproj @@ -81,9 +81,16 @@ + + + + + + + @@ -135,6 +142,7 @@ + @@ -159,6 +167,7 @@ + From e18bbe645129f391abeec08cf0b2c648d8b311b3 Mon Sep 17 00:00:00 2001 From: Jimmy Wu Date: Thu, 31 Dec 2020 15:40:09 +0800 Subject: [PATCH 2/6] Add directory .idea to list of ignore. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ce490284e3..c7080feed3 100644 --- a/.gitignore +++ b/.gitignore @@ -88,3 +88,4 @@ packages/ /Samples/netcore3.0-mvc/Senparc.Weixin.Sample.NetCore3/appsettings.Development.json /Samples/netcore3.0-mvc/Senparc.Weixin.Sample.NetCore3/App_Data/WeChat_OfficialAccount /Samples/netcore3.0-mvc/.idea +/src/Senparc.Weixin.Work/.idea From 46dcf5cbf539f419680aa983f222f679e303f2dc Mon Sep 17 00:00:00 2001 From: gokeiyou Date: Mon, 9 Aug 2021 14:18:35 +0800 Subject: [PATCH 3/6] =?UTF-8?q?1=E3=80=81=E6=B7=BB=E5=8A=A0=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E7=B1=BB=E5=9E=8B=EF=BC=9A=E4=BB=BB=E5=8A=A1=E5=8D=A1?= =?UTF-8?q?=E7=89=87=E4=BA=8B=E4=BB=B6=202=E3=80=81=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=8B=A5=E5=B9=B2=E5=A4=96=E9=83=A8=E8=81=94=E7=B3=BB=E4=BA=BA?= =?UTF-8?q?api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.idea/.gitignore | 13 ++++ .../.idea/.name | 1 + .../.idea/encodings.xml | 4 ++ .../.idea/indexLayout.xml | 8 +++ .../.idea/riderModule.iml | 9 +++ .../.idea/vcs.xml | 6 ++ .../AdvancedAPIs/External/ExternalApi.cs | 60 +----------------- .../ExternalJson/GetFollowUserListResult.cs | 17 ----- .../External/GetExternalContactResult.cs | 7 --- .../External/GroupChatGetResult.cs | 39 ++++++------ .../AdvancedAPIs/Mass/MassResult.cs | 35 ++++++++++- .../AdvancedAPIs/Schedule/ScheduleApi.cs | 14 +---- .../Schedule/ScheduleJson/Schedule.cs | 62 +++++++++++++++++++ .../RequestMessageEvent_TaskCardClick.cs | 24 +++++++ .../Response/ResponseMessageUpdateTaskCard.cs | 25 ++++++++ .../Senparc.Weixin.Work/Enums.cs | 5 +- .../MessageHandlers/WorkMessageHandler.cs | 13 ++++ 17 files changed, 223 insertions(+), 119 deletions(-) create mode 100644 src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/.gitignore create mode 100644 src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/.name create mode 100644 src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/encodings.xml create mode 100644 src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/indexLayout.xml create mode 100644 src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/riderModule.iml create mode 100644 src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/vcs.xml delete mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/GetFollowUserListResult.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Request/Event/RequestMessageEvent_TaskCardClick.cs create mode 100644 src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Response/ResponseMessageUpdateTaskCard.cs diff --git a/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/.gitignore b/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/.gitignore new file mode 100644 index 0000000000..1e1f82d279 --- /dev/null +++ b/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/projectSettingsUpdater.xml +/modules.xml +/.idea.Senparc.Weixin.Work.net45.iml +/contentModel.xml +# Datasource local storage ignored files +/../../../../../../../:\WeiXinMPSDK-Fork\src\Senparc.Weixin.Work\.idea\.idea.Senparc.Weixin.Work.net45\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/.name b/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/.name new file mode 100644 index 0000000000..d2ee3e84fa --- /dev/null +++ b/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/.name @@ -0,0 +1 @@ +Senparc.Weixin.Work.net45 \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/encodings.xml b/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/encodings.xml new file mode 100644 index 0000000000..df87cf951f --- /dev/null +++ b/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/indexLayout.xml b/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/indexLayout.xml new file mode 100644 index 0000000000..27ba142e96 --- /dev/null +++ b/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/riderModule.iml b/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/riderModule.iml new file mode 100644 index 0000000000..3d9111478a --- /dev/null +++ b/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/riderModule.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/vcs.xml b/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/vcs.xml new file mode 100644 index 0000000000..b2bdec2d71 --- /dev/null +++ b/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalApi.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalApi.cs index 031f7677a2..1977b7b7fe 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalApi.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalApi.cs @@ -235,29 +235,6 @@ public static WorkJsonResult UpdateExternalContactRemark(string accessTokenOrApp }, accessTokenOrAppKey); } - - /// - /// 获取配置了客户联系功能的成员列表 - /// 权限说明: - /// 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用 - /// 第三方应用需具有“企业客户权限->客户基础信息”权限 - /// 第三方/自建应用只能获取到可见范围内的配置了客户联系功能的成员。 - /// - /// 调用接口凭证 - /// 请求报文 - /// - /// - [ApiBind(NeuChar.PlatformType.WeChat_Work, "ExternalApi.GetFollowUserList", true)] - public static WorkJsonResult GetFollowUserList(string accessTokenOrAppKey, int timeOut = Config.TIME_OUT) - { - return ApiHandlerWapper.TryCommonApi(accessToken => - { - var url = $"{Config.ApiWorkHost}/cgi-bin/externalcontact/get_follow_user_list?access_token={accessToken}"; - - return CommonJsonSend.Send(null, url, null, CommonJsonSendType.POST, timeOut); - }, accessTokenOrAppKey); - } - #region 「联系我」 /// @@ -392,22 +369,11 @@ public static WorkJsonResult SendWelcomeMessage(string accessTokenOrAppKey, Send } #endregion - - #endregion - - - - #endregion - - - #endregion - #endregion - #region 异步方法 - + #region 企业服务人员管理 /// @@ -599,29 +565,6 @@ public static async Task UpdateExternalContactRemarkAsync(string }, accessTokenOrAppKey).ConfigureAwait(false); } - - /// - /// 【异步方法】获取配置了客户联系功能的成员列表 - /// 权限说明: - /// 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用 - /// 第三方应用需具有“企业客户权限->客户基础信息”权限 - /// 第三方/自建应用只能获取到可见范围内的配置了客户联系功能的成员。 - /// - /// 调用接口凭证 - /// 请求报文 - /// - /// - [ApiBind(NeuChar.PlatformType.WeChat_Work, "ExternalApi.GetFollowUserListAsync", true)] - public static async Task GetFollowUserListAsync(string accessTokenOrAppKey, int timeOut = Config.TIME_OUT) - { - return await ApiHandlerWapper.TryCommonApiAsync(async accessToken => - { - var url = $"{Config.ApiWorkHost}/cgi-bin/externalcontact/get_follow_user_list?access_token={accessToken}"; - - return await CommonJsonSend.SendAsync(null, url, null, CommonJsonSendType.POST, timeOut).ConfigureAwait(false); - }, accessTokenOrAppKey); - } - #endregion #region 消息推送 @@ -756,7 +699,6 @@ public static async Task AddContactWayAsync(string accessTo #endregion - #endregion } } diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/GetFollowUserListResult.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/GetFollowUserListResult.cs deleted file mode 100644 index ef7b63309a..0000000000 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/ExternalJson/GetFollowUserListResult.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Collections.Generic; -using Senparc.Weixin.Entities; - -namespace Senparc.Weixin.Work.AdvancedAPIs.External.ExternalJson -{ - /// - /// 获取配置了客户联系功能的成员列表返回 - /// - public class GetFollowUserListResult : WorkJsonResult - { - /// - /// 配置了客户联系功能的成员userid列表 - /// - public List follow_user { get; set; } - - } -} \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/GetExternalContactResult.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/GetExternalContactResult.cs index 06f992237e..2116b5eccd 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/GetExternalContactResult.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/GetExternalContactResult.cs @@ -182,13 +182,6 @@ public class Follow_User public string[] remark_mobiles { get; set; } public Follow_User_Tags[] tags { get; set; } - public long createtime { get; set; } - public List tags { get; set; } - public string remark_corp_name { get; set; } - public string[] remark_mobiles { get; set; } - public string oper_userid { get; set; } - public string state { get; set; } - public int add_way { get; set; } } public class Follow_User_Tag diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/GroupChatGetResult.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/GroupChatGetResult.cs index 8863bf26dc..a36b459f1e 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/GroupChatGetResult.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/External/GroupChatGetResult.cs @@ -38,48 +38,48 @@ and limitations under the License. namespace Senparc.Weixin.Work.AdvancedAPIs.External { /// - /// 获取客户群详情 返回结果 + /// 获取客户群详情 返回结果 /// public class GroupChatGetResult : WorkJsonResult { /// - /// 客户群详情 + /// 客户群详情 /// public Group_Chat group_chat { get; set; } } /// - /// 客户群详情 + /// 客户群详情 /// public class Group_Chat { /// - /// 客户群ID + /// 客户群ID /// public string chat_id { get; set; } /// - /// 群名 + /// 群名 /// public string name { get; set; } /// - /// 群主ID + /// 群主ID /// public string owner { get; set; } /// - /// 群的创建时间 + /// 群的创建时间 /// public int create_time { get; set; } /// - /// 群公告 + /// 群公告 /// public string notice { get; set; } /// - /// 群成员列表 + /// 群成员列表 /// public Member_List[] member_list { get; set; } @@ -90,36 +90,35 @@ public class Group_Chat } /// - /// 群成员列表 + /// 群成员列表 /// public class Member_List { /// - /// 群成员id + /// 群成员id /// public string userid { get; set; } /// - /// 成员类型。 - /// 1 - 企业成员 - /// 2 - 外部联系人 + /// 成员类型。 + /// 1 - 企业成员 + /// 2 - 外部联系人 /// public int type { get; set; } /// - /// 入群时间 + /// 入群时间 /// public int join_time { get; set; } /// - /// 入群方式。 - /// 1 - 由成员邀请入群(直接邀请入群) - /// 2 - 由成员邀请入群(通过邀请链接入群) - /// 3 - 通过扫描群二维码入群 + /// 入群方式。 + /// 1 - 由成员邀请入群(直接邀请入群) + /// 2 - 由成员邀请入群(通过邀请链接入群) + /// 3 - 通过扫描群二维码入群 /// public int join_scene { get; set; } - /// /// 外部联系人在微信开放平台的唯一身份标识(微信unionid),通过此字段企业可将外部联系人与公众号/小程序用户关联起来。仅当群成员类型是微信用户(包括企业成员未添加好友),且企业或第三方服务商绑定了微信开发者ID有此字段 /// diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/Mass/MassResult.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/Mass/MassResult.cs index be9b99d299..f29ce67913 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/Mass/MassResult.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/Mass/MassResult.cs @@ -64,20 +64,48 @@ public class SendMiniProgramNoticeData public class SendTaskCardNoticeData { + /// + /// 成员ID列表(消息接收者,多个接收者用‘|’分隔,最多支持1000个) + /// 特殊情况:指定为@all,则向关注该企业应用的全部成员发送 + /// public string touser { get; set; } + /// + /// 部门ID列表,多个接收者用‘|’分隔,最多支持100个 + /// 当touser为@all时忽略本参数 + /// public string toparty { get; set; } + /// + /// 标签ID列表,多个接收者用‘|’分隔,最多支持100个 + /// 当touser为@all时忽略本参数 + /// public string totag { get; set; } - public string msgtype { get; set; } + /// + /// 消息类型,此时固定为:interactive_taskcard + /// + public string msgtype => "interactive_taskcard"; + /// + /// 企业应用的id,整型 + /// 企业内部开发,可在应用的设置页面查看; + /// 第三方服务商,可通过接口 获取企业授权信息 获取该参数值 + /// public int agentid { get; set; } + /// + /// 卡片内容 + /// + public Taskcard_Notice interactive_taskcard { get; set; } public Taskcard_Notice taskcard { get; set; } /// + /// 表示是否开启id转译,0表示否,1表示是,默认0 + /// + public int? enable_id_trans { get; set; } + /// /// 表示是否开启重复消息检查,0表示否,1表示是,默认0 /// - public int enableDuplicateCheck { get; set; } + public int? enable_duplicate_check { get; set; } /// /// 表示是否重复消息检查的时间间隔,默认1800s,最大不超过4小时 /// - public int duplicateCheckInterval { get; set; } = 1800; + public int? duplicate_check_interval { get; set; } = 1800; } /// @@ -89,6 +117,7 @@ public class UpdateTaskCardData public int agentid { get; set; } public string task_id { get; set; } public string clicked_key { get; set; } + public string replace_name { get; set; } } diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/Schedule/ScheduleApi.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/Schedule/ScheduleApi.cs index ec6fa353d4..0cb1ff977e 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/Schedule/ScheduleApi.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/Schedule/ScheduleApi.cs @@ -34,17 +34,12 @@ public static class ScheduleApi /// /// [ApiBind(NeuChar.PlatformType.WeChat_Work, "ScheduleApi.Add", true)] - public static AddScheduleJsonResult Add(string accessTokenOrAppKey, ScheduleJson.Schedule schedule, int timeOut = Config.TIME_OUT) + public static AddScheduleJsonResult Add(string accessTokenOrAppKey, ScheduleAdd data, int timeOut = Config.TIME_OUT) { return ApiHandlerWapper.TryCommonApi(accessToken => { var url = Config.ApiWorkHost + "/cgi-bin/oa/schedule/add?access_token={0}"; - var data = new - { - schedule - }; - return Senparc.Weixin.CommonAPIs.CommonJsonSend.Send(accessToken, url, data, CommonJsonSendType.POST, timeOut); }, accessTokenOrAppKey); } @@ -125,17 +120,12 @@ public static GetScheduleJsonResult Get(string accessTokenOrAppKey, List /// /// [ApiBind(NeuChar.PlatformType.WeChat_Work, "ScheduleApi.AddAsync", true)] - public static async Task AddAsync(string accessTokenOrAppKey, ScheduleJson.Schedule schedule, int timeOut = Config.TIME_OUT) + public static async Task AddAsync(string accessTokenOrAppKey, ScheduleAdd data, int timeOut = Config.TIME_OUT) { return await ApiHandlerWapper.TryCommonApiAsync(async accessToken => { var url = Config.ApiWorkHost + "/cgi-bin/oa/schedule/add?access_token={0}"; - var data = new - { - schedule - }; - return await Weixin.CommonAPIs.CommonJsonSend.SendAsync(accessToken, url, data, CommonJsonSendType.POST, timeOut).ConfigureAwait(false); }, accessTokenOrAppKey).ConfigureAwait(false); } diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/Schedule/ScheduleJson/Schedule.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/Schedule/ScheduleJson/Schedule.cs index 0575791c2e..eeec222469 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/Schedule/ScheduleJson/Schedule.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/Schedule/ScheduleJson/Schedule.cs @@ -33,6 +33,16 @@ public enum Repeat_Type 每年 = 5, 工作日 = 7 } + public enum RepeatDayOfWeek + { + Monday = 1, + Tuesday = 2, + Wednesday = 3, + Thursday = 4, + Friday = 5, + Saturday = 6, + Sunday = 7 + } /// /// 日程信息 /// @@ -70,6 +80,11 @@ public class Schedule /// 日程地址。0 ~ 128 字符 /// public string location { get; set; } + /// + /// 日程所属日历ID + /// 第三方应用必须指定cal_id + /// + public string cal_id { get; set; } } public class Reminders @@ -90,6 +105,42 @@ public class Reminders /// 重复类型,当is_repeat为1时有效。 /// public Repeat_Type repeat_type { get; set; } + /// + /// 重复结束时刻,Unix时间戳。不填或填0表示一直重复 + /// + public int repeat_unit { get; set; } + /// + /// 是否自定义重复。0-否;1-是 + /// + public ushort is_custom_repeat { get; set; } + /// + /// 重复间隔 + /// 仅当指定为自定义重复时有效 + /// 该字段随repeat_type不同而含义不同 + /// 例如: + /// repeat_interval指定为3,repeat_type指定为每周重复,那么每3周重复一次; + /// repeat_interval指定为3,repeat_type指定为每月重复,那么每3个月重复一次 + /// + public int repeat_interval { get; set; } + /// + /// 每周周几重复 + /// 仅当指定为自定义重复且重复类型为每周时有效 + /// 取值范围:1 ~ 7,分别表示周一至周日 + /// + public RepeatDayOfWeek[] repeat_day_of_week { get; set; } + /// + /// 每月哪几天重复 + /// 仅当指定为自定义重复且重复类型为每月时有效 + /// 取值范围:1 ~ 31,分别表示1~31号 + /// + public int[] repeat_day_of_month { get; set; } + /// + /// 时区。UTC偏移量表示(即偏离零时区的小时数),东区为正数,西区为负数。 + /// 例如:+8 表示北京时间东八区 + /// 默认为北京时间东八区 + /// 取值范围:-12 ~ +12 + /// + public int timezone { get; set; } = 8; } public class Attendee @@ -99,6 +150,17 @@ public class Attendee /// public string userid { get; set; } } + public class ScheduleAdd + { + /// + /// 日程信息 + /// + public Schedule schedule { get; set; } + /// + /// 授权方安装的应用agentid + /// + public int agentid { get; set; } + } /// /// 注意,更新日程,不可变更组织者 /// diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Request/Event/RequestMessageEvent_TaskCardClick.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Request/Event/RequestMessageEvent_TaskCardClick.cs new file mode 100644 index 0000000000..1b76ac9c04 --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Request/Event/RequestMessageEvent_TaskCardClick.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Senparc.Weixin.Work.Entities +{ + public class RequestMessageEvent_TaskCardClick : RequestMessageEventBase, IRequestMessageEventBase, IRequestMessageEventKey + { + /// + /// 事件类型 + /// + public override Event Event + { + get { return Event.TASKCARD_CLICK; } + } + + /// + /// 事件KEY值,与自定义菜单接口中KEY值对应 + /// + public string EventKey { get; set; } + } +} diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Response/ResponseMessageUpdateTaskCard.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Response/ResponseMessageUpdateTaskCard.cs new file mode 100644 index 0000000000..b14bb82ff2 --- /dev/null +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Response/ResponseMessageUpdateTaskCard.cs @@ -0,0 +1,25 @@ +using Senparc.NeuChar; +using Senparc.NeuChar.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Senparc.Weixin.Work.Entities.Response +{ + public class ResponseMessageUpdateTaskCard : WorkResponseMessageBase, IResponseMessageUpdateTaskCard + { + public new virtual ResponseMsgType MsgType + { + get { return ResponseMsgType.TaskCard; } + } + + public Image Image { get; set; } + + public ResponseMessageUpdateTaskCard() + { + Image = new Image(); + } + } +} diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Enums.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Enums.cs index 1d2c9f079f..c37c01cce6 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Enums.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Enums.cs @@ -85,7 +85,10 @@ public enum Event /// 自定义菜单点击事件 /// CLICK, - + /// + /// 任务卡片事件推送 + /// + TASKCARD_CLICK, /// /// 二维码扫描 /// diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/WorkMessageHandler.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/WorkMessageHandler.cs index ac365e4aeb..1a1d218ad7 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/WorkMessageHandler.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/WorkMessageHandler.cs @@ -359,6 +359,9 @@ public virtual IWorkResponseMessageBase OnEventRequest(IRequestMessageEventBase case Event.CLICK://菜单点击 responseMessage = OnEvent_ClickRequest(RequestMessage as RequestMessageEvent_Click); break; + case Event.TASKCARD_CLICK: + responseMessage = OnEvent_TaskCardClickRequest(responseMessage as RequestMessageEvent_TaskCardClick); + break; case Event.VIEW://URL跳转(view视图) responseMessage = OnEvent_ViewRequest(RequestMessage as RequestMessageEvent_View); break; @@ -498,6 +501,16 @@ public virtual IWorkResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent return DefaultResponseMessage(requestMessage); } + /// + /// Event事件类型请求之TASKCARDCLICK + /// + /// + /// + public virtual IWorkResponseMessageBase OnEvent_TaskCardClickRequest(RequestMessageEvent_TaskCardClick requestMessage) + { + return DefaultResponseMessage(requestMessage); + } + /// /// 事件之URL跳转视图(View) /// From 39caca426eb11f7ffb36115dbc2d35dbcfb48d3b Mon Sep 17 00:00:00 2001 From: gokeiyou Date: Mon, 9 Aug 2021 15:03:37 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdvancedAPIs/Schedule/ScheduleApi.cs | 4 ++-- .../Entities/Response/ResponseMessageUpdateTaskCard.cs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/Schedule/ScheduleApi.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/Schedule/ScheduleApi.cs index ee47f34cc3..069836a4c4 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/Schedule/ScheduleApi.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/AdvancedAPIs/Schedule/ScheduleApi.cs @@ -34,7 +34,7 @@ public static class ScheduleApi /// 日程信息 /// /// - public static AddScheduleJsonResult Add(string accessTokenOrAppKey, ScheduleJson.Schedule schedule, int timeOut = Config.TIME_OUT) + public static AddScheduleJsonResult Add(string accessTokenOrAppKey, ScheduleJson.ScheduleAdd data, int timeOut = Config.TIME_OUT) { return ApiHandlerWapper.TryCommonApi(accessToken => { @@ -116,7 +116,7 @@ public static GetScheduleJsonResult Get(string accessTokenOrAppKey, List /// 日程信息 /// /// - public static async Task AddAsync(string accessTokenOrAppKey, ScheduleJson.Schedule schedule, int timeOut = Config.TIME_OUT) + public static async Task AddAsync(string accessTokenOrAppKey, ScheduleJson.ScheduleAdd data, int timeOut = Config.TIME_OUT) { return await ApiHandlerWapper.TryCommonApiAsync(async accessToken => { diff --git a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Response/ResponseMessageUpdateTaskCard.cs b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Response/ResponseMessageUpdateTaskCard.cs index b14bb82ff2..419af411a4 100644 --- a/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Response/ResponseMessageUpdateTaskCard.cs +++ b/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Response/ResponseMessageUpdateTaskCard.cs @@ -8,18 +8,18 @@ namespace Senparc.Weixin.Work.Entities.Response { - public class ResponseMessageUpdateTaskCard : WorkResponseMessageBase, IResponseMessageUpdateTaskCard + public class ResponseMessageUpdateTaskCard : WorkResponseMessageBase, IResponseMessageTaskCard { public new virtual ResponseMsgType MsgType { get { return ResponseMsgType.TaskCard; } } - public Image Image { get; set; } + public TaskCard TaskCard { get; set; } public ResponseMessageUpdateTaskCard() { - Image = new Image(); + TaskCard = new TaskCard(); } } } From 4a48a7be6dc6f2b4dc6f2b687fda357953acd3a3 Mon Sep 17 00:00:00 2001 From: Jimmy Wu Date: Fri, 24 Feb 2023 16:15:40 +0800 Subject: [PATCH 5/6] Delete src/Senparc.Weixin.Work/.idea directory --- .../.idea/.gitignore | 13 ------------- .../.idea.Senparc.Weixin.Work.net45/.idea/.name | 1 - .../.idea/encodings.xml | 4 ---- .../.idea/indexLayout.xml | 8 -------- .../.idea/riderModule.iml | 9 --------- .../.idea.Senparc.Weixin.Work.net45/.idea/vcs.xml | 6 ------ 6 files changed, 41 deletions(-) delete mode 100644 src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/.gitignore delete mode 100644 src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/.name delete mode 100644 src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/encodings.xml delete mode 100644 src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/indexLayout.xml delete mode 100644 src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/riderModule.iml delete mode 100644 src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/vcs.xml diff --git a/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/.gitignore b/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/.gitignore deleted file mode 100644 index 1e1f82d279..0000000000 --- a/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Rider ignored files -/projectSettingsUpdater.xml -/modules.xml -/.idea.Senparc.Weixin.Work.net45.iml -/contentModel.xml -# Datasource local storage ignored files -/../../../../../../../:\WeiXinMPSDK-Fork\src\Senparc.Weixin.Work\.idea\.idea.Senparc.Weixin.Work.net45\.idea/dataSources/ -/dataSources.local.xml -# Editor-based HTTP Client requests -/httpRequests/ diff --git a/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/.name b/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/.name deleted file mode 100644 index d2ee3e84fa..0000000000 --- a/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -Senparc.Weixin.Work.net45 \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/encodings.xml b/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/encodings.xml deleted file mode 100644 index df87cf951f..0000000000 --- a/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/indexLayout.xml b/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/indexLayout.xml deleted file mode 100644 index 27ba142e96..0000000000 --- a/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/indexLayout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/riderModule.iml b/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/riderModule.iml deleted file mode 100644 index 3d9111478a..0000000000 --- a/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/riderModule.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/vcs.xml b/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/vcs.xml deleted file mode 100644 index b2bdec2d71..0000000000 --- a/src/Senparc.Weixin.Work/.idea/.idea.Senparc.Weixin.Work.net45/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 6fa68af096b94e9c2f409d9860836e1526929d75 Mon Sep 17 00:00:00 2001 From: Jimmy Wu Date: Fri, 24 Feb 2023 16:17:56 +0800 Subject: [PATCH 6/6] Update .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 16c63edc7d..2e788d8be6 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,9 @@ bak.zip *.pdb *.tmp +# JetBrains Rider +.idea/ + #/Tools/* *.DotSettings .vs