添加项目文件。
This commit is contained in:
455
common/Tnb.Thirdparty/DingDing/DingUtil.cs
vendored
Normal file
455
common/Tnb.Thirdparty/DingDing/DingUtil.cs
vendored
Normal file
@@ -0,0 +1,455 @@
|
||||
using DingTalk.Api;
|
||||
using DingTalk.Api.Request;
|
||||
using DingTalk.Api.Response;
|
||||
using Mapster;
|
||||
using static DingTalk.Api.Request.OapiRobotSendRequest;
|
||||
using static DingTalk.Api.Response.OapiV2DepartmentListsubResponse;
|
||||
using static DingTalk.Api.Response.OapiV2UserListResponse;
|
||||
|
||||
namespace JNPF.Extras.Thirdparty.DingDing;
|
||||
|
||||
/// <summary>
|
||||
/// 钉钉.
|
||||
/// </summary>
|
||||
public class DingUtil
|
||||
{
|
||||
/// <summary>
|
||||
/// 访问令牌.
|
||||
/// </summary>
|
||||
public string token { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 构造函数.
|
||||
/// </summary>
|
||||
/// <param name="appKey">企业号ID.</param>
|
||||
/// <param name="appSecret">凭证密钥.</param>
|
||||
public DingUtil(string appKey, string appSecret)
|
||||
{
|
||||
token = GetDingToken(appKey, appSecret);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 构造函数.
|
||||
/// </summary>
|
||||
/// <param name="appKey">企业号ID.</param>
|
||||
/// <param name="appSecret">凭证密钥.</param>
|
||||
public DingUtil()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 钉钉token.
|
||||
/// </summary>
|
||||
/// <param name="appKey">企业号ID.</param>
|
||||
/// <param name="appSecret">凭证密钥.</param>
|
||||
/// <returns></returns>
|
||||
public string GetDingToken(string appKey, string appSecret)
|
||||
{
|
||||
try
|
||||
{
|
||||
var tokenurl = "https://oapi.dingtalk.com/gettoken";
|
||||
DefaultDingTalkClient client = new DefaultDingTalkClient(tokenurl);
|
||||
OapiGettokenRequest req = new OapiGettokenRequest();
|
||||
req.SetHttpMethod("GET");
|
||||
req.Appkey = appKey;
|
||||
req.Appsecret = appSecret;
|
||||
OapiGettokenResponse response = client.Execute(req);
|
||||
if (response.Errcode == 0)
|
||||
{
|
||||
// 过期时间
|
||||
var timeout = DateTime.Now.Subtract(DateTime.Now.AddSeconds(response.ExpiresIn));
|
||||
return response.AccessToken;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception("获取钉钉Token失败,失败原因:" + response.Errmsg);
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 钉钉登录.
|
||||
/// </summary>
|
||||
/// <param name="code"></param>
|
||||
/// <returns></returns>
|
||||
public object DingLogin(string code)
|
||||
{
|
||||
var url = "https://oapi.dingtalk.com/user/getuserinfo";
|
||||
DefaultDingTalkClient client = new DefaultDingTalkClient(url);
|
||||
OapiUserGetuserinfoRequest req = new OapiUserGetuserinfoRequest();
|
||||
req.Code = code;
|
||||
req.SetHttpMethod("GET");
|
||||
OapiUserGetuserinfoResponse rsp = client.Execute(req, token);
|
||||
if (rsp.IsError)
|
||||
throw new Exception(rsp.ErrMsg);
|
||||
return rsp.Body;
|
||||
}
|
||||
|
||||
#region 用户
|
||||
|
||||
/// <summary>
|
||||
/// 添加钉钉用户.
|
||||
/// </summary>
|
||||
/// <param name="dingModel"></param>
|
||||
/// <returns></returns>
|
||||
public string CreateUser(DingUserParameter dingModel, ref string msg)
|
||||
{
|
||||
try
|
||||
{
|
||||
var userId = GetUserIdByMobile(dingModel.Mobile);
|
||||
if (!string.IsNullOrEmpty(userId))
|
||||
return userId;
|
||||
var url = "https://oapi.dingtalk.com/topapi/v2/user/create";
|
||||
DefaultDingTalkClient client = new DefaultDingTalkClient(url);
|
||||
OapiV2UserCreateRequest req = dingModel.Adapt<OapiV2UserCreateRequest>();
|
||||
OapiV2UserCreateResponse rsp = client.Execute(req, token);
|
||||
if (!rsp.IsError && rsp.Result != null)
|
||||
{
|
||||
return rsp.Result.Userid;
|
||||
}
|
||||
else
|
||||
{
|
||||
msg = rsp.Errmsg;
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
throw new Exception(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 修改钉钉用户.
|
||||
/// </summary>
|
||||
/// <param name="dingModel">钉钉用户参数.</param>
|
||||
/// <param name="msg">返回信息.</param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="Exception"></exception>
|
||||
public bool UpdateUser(DingUserParameter dingModel, ref string msg)
|
||||
{
|
||||
try
|
||||
{
|
||||
var url = "https://oapi.dingtalk.com/topapi/v2/user/update";
|
||||
DefaultDingTalkClient client = new DefaultDingTalkClient(url);
|
||||
OapiV2UserUpdateRequest req = dingModel.Adapt<OapiV2UserUpdateRequest>();
|
||||
OapiV2UserUpdateResponse rsp = client.Execute(req, token);
|
||||
if (rsp.IsError)
|
||||
msg = rsp.Errmsg;
|
||||
return rsp.Errcode == 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 修改钉钉用户.
|
||||
/// </summary>
|
||||
/// <param name="dingModel"></param>
|
||||
/// <param name="msg">返回信息.</param>
|
||||
public void DeleteUser(DingUserParameter dingModel, ref string msg)
|
||||
{
|
||||
try
|
||||
{
|
||||
var url = "https://oapi.dingtalk.com/topapi/v2/user/delete";
|
||||
DefaultDingTalkClient client = new DefaultDingTalkClient(url);
|
||||
OapiV2UserDeleteRequest req = dingModel.Adapt<OapiV2UserDeleteRequest>();
|
||||
OapiV2UserDeleteResponse rsp = client.Execute(req, token);
|
||||
if (rsp.IsError)
|
||||
{
|
||||
msg = rsp.Errmsg;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据手机号查询用户
|
||||
/// 员工离职后,无法再通过手机号获取userId.
|
||||
/// </summary>
|
||||
/// <param name="mobile"></param>
|
||||
/// <returns></returns>
|
||||
public string GetUserIdByMobile(string mobile)
|
||||
{
|
||||
try
|
||||
{
|
||||
var url = "https://oapi.dingtalk.com/topapi/v2/user/getbymobile";
|
||||
DefaultDingTalkClient client = new DefaultDingTalkClient(url);
|
||||
OapiV2UserGetbymobileRequest req = new OapiV2UserGetbymobileRequest() { Mobile = mobile };
|
||||
OapiV2UserGetbymobileResponse rsp = client.Execute(req, token);
|
||||
if (!rsp.IsError && rsp.Result != null)
|
||||
{
|
||||
return rsp.Result.Userid;
|
||||
}
|
||||
else
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有用户详情.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<ListUserResponseDomain> GetUserList()
|
||||
{
|
||||
try
|
||||
{
|
||||
var url = "https://oapi.dingtalk.com/topapi/v2/user/list";
|
||||
DefaultDingTalkClient client = new DefaultDingTalkClient(url);
|
||||
var userList = new List<ListUserResponseDomain>();
|
||||
var depList = new List<long>();
|
||||
depList.Add(1);
|
||||
GetDepIdList(1, ref depList);
|
||||
if (depList.Count > 0)
|
||||
{
|
||||
foreach (var item in depList)
|
||||
{
|
||||
OapiV2UserListRequest req = new OapiV2UserListRequest() { DeptId = item, Cursor = 0, Size = 10 };
|
||||
OapiV2UserListResponse rsp = client.Execute(req, token);
|
||||
if (rsp.Errcode == 0 && rsp.Errmsg == "ok" && rsp.Result != null && rsp.Result.List != null)
|
||||
{
|
||||
userList = userList.Union(rsp.Result.List).ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return userList;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception(ex.Message);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 部门
|
||||
|
||||
/// <summary>
|
||||
/// 添加钉钉部门.
|
||||
/// </summary>
|
||||
/// <param name="dingModel"></param>
|
||||
/// <param name="msg">返回信息.</param>
|
||||
/// <returns></returns>
|
||||
public string CreateDep(DingDepartmentParameter dingModel, ref string msg)
|
||||
{
|
||||
try
|
||||
{
|
||||
var url = "https://oapi.dingtalk.com/topapi/v2/department/create";
|
||||
DefaultDingTalkClient client = new DefaultDingTalkClient(url);
|
||||
OapiV2DepartmentCreateRequest req = dingModel.Adapt<OapiV2DepartmentCreateRequest>();
|
||||
OapiV2DepartmentCreateResponse rsp = client.Execute(req, token);
|
||||
if (rsp.Errcode == 0)
|
||||
{
|
||||
if (!rsp.IsError && rsp.Result != null)
|
||||
{
|
||||
return rsp.Result.DeptId.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
msg = string.Format("【组织{0}创建失败】{1}", dingModel.Name, rsp.Errmsg);
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
msg = string.Format("【组织{0}创建失败】{1}", dingModel.Name, rsp.Errmsg);
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
msg = string.Format("【组织{0}创建失败】{1}", dingModel.Name, ex.Message);
|
||||
throw new Exception(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 修改钉钉部门.
|
||||
/// </summary>
|
||||
/// <param name="dingModel"></param>
|
||||
/// <param name="msg">返回信息.</param>
|
||||
public bool UpdateDep(DingDepartmentParameter dingModel, ref string msg)
|
||||
{
|
||||
try
|
||||
{
|
||||
var url = "https://oapi.dingtalk.com/topapi/v2/department/update";
|
||||
DefaultDingTalkClient client = new DefaultDingTalkClient(url);
|
||||
OapiV2DepartmentUpdateRequest req = dingModel.Adapt<OapiV2DepartmentUpdateRequest>();
|
||||
OapiV2DepartmentUpdateResponse rsp = client.Execute(req, token);
|
||||
if (!rsp.IsError)
|
||||
{
|
||||
msg = rsp.IsError ? string.Format("【组织{0}修改失败】{1}", dingModel.Name, rsp.Errmsg) : string.Empty;
|
||||
return !rsp.IsError;
|
||||
}
|
||||
else
|
||||
{
|
||||
msg = string.Format("【组织{0}修改失败】{1}", dingModel.Name, rsp.Errmsg);
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
msg = string.Format("【组织{0}修改失败】{1}", dingModel.Name, ex.Message);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除钉钉部门.
|
||||
/// </summary>
|
||||
/// <param name="dingModel"></param>
|
||||
/// <param name="msg">返回信息.</param>
|
||||
public bool DeleteDep(DingDepartmentParameter dingModel, ref string msg)
|
||||
{
|
||||
try
|
||||
{
|
||||
var url = "https://oapi.dingtalk.com/topapi/v2/department/delete";
|
||||
DefaultDingTalkClient client = new DefaultDingTalkClient(url);
|
||||
OapiV2DepartmentDeleteRequest req = dingModel.Adapt<OapiV2DepartmentDeleteRequest>();
|
||||
OapiV2DepartmentDeleteResponse rsp = client.Execute(req, token);
|
||||
if (!rsp.IsError)
|
||||
{
|
||||
msg = rsp.IsError ? rsp.Errmsg : string.Empty;
|
||||
return !rsp.IsError;
|
||||
}
|
||||
else
|
||||
{
|
||||
msg = rsp.Errmsg;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取部门列表.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<DeptBaseResponseDomain> GetDepList()
|
||||
{
|
||||
try
|
||||
{
|
||||
var depId = new List<long>();
|
||||
depId.Add(1);
|
||||
GetDepIdList(1, ref depId);
|
||||
var list = new List<DeptBaseResponseDomain>();
|
||||
if (depId.Count > 0)
|
||||
{
|
||||
var url = "https://oapi.dingtalk.com/topapi/v2/department/listsub";
|
||||
DefaultDingTalkClient client = new DefaultDingTalkClient(url);
|
||||
OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
|
||||
foreach (var item in depId)
|
||||
{
|
||||
req.DeptId = item;
|
||||
OapiV2DepartmentListsubResponse rsp = client.Execute(req, token);
|
||||
if (rsp.Errcode == 0 && rsp.Errmsg == "ok" && rsp.Result != null)
|
||||
{
|
||||
list = list.Union(rsp.Result).ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
throw new Exception(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取部门id列表.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public void GetDepIdList(long depId, ref List<long> ids)
|
||||
{
|
||||
try
|
||||
{
|
||||
var url = "https://oapi.dingtalk.com/topapi/v2/department/listsubid";
|
||||
DefaultDingTalkClient client = new DefaultDingTalkClient(url);
|
||||
OapiV2DepartmentListsubidRequest req = new OapiV2DepartmentListsubidRequest();
|
||||
req.DeptId = depId;
|
||||
OapiV2DepartmentListsubidResponse rsp = client.Execute(req, token);
|
||||
if (rsp.Errcode == 0 && rsp.Errmsg == "ok" && rsp.Result != null)
|
||||
{
|
||||
ids = ids.Union(rsp.Result.DeptIdList).ToList();
|
||||
foreach (var item in rsp.Result.DeptIdList)
|
||||
{
|
||||
GetDepIdList(item, ref ids);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
throw new Exception(ex.Message);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// 发送工作消息.
|
||||
/// </summary>
|
||||
/// <param name="dingModel"></param>
|
||||
public void SendWorkMsg(DingWorkMessageParameter dingModel)
|
||||
{
|
||||
var url = "https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2";
|
||||
DefaultDingTalkClient client = new DefaultDingTalkClient(url);
|
||||
OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request()
|
||||
{
|
||||
AgentId = long.Parse(dingModel.agentId),
|
||||
UseridList = dingModel.toUsers,
|
||||
Msg = dingModel.msg
|
||||
};
|
||||
request.SetHttpMethod("POST");
|
||||
OapiMessageCorpconversationAsyncsendV2Response response = client.Execute(request, token);
|
||||
if (response.IsError)
|
||||
{
|
||||
throw new Exception(response.ErrMsg);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发送群聊消息.
|
||||
/// </summary>
|
||||
/// <param name="url"></param>
|
||||
/// <param name="content"></param>
|
||||
public void SendGroupMsg(string url, string content)
|
||||
{
|
||||
DefaultDingTalkClient client = new DefaultDingTalkClient(url);
|
||||
OapiRobotSendRequest request = new OapiRobotSendRequest();
|
||||
request.Msgtype = "text";
|
||||
TextDomain text = new TextDomain();
|
||||
text.Content = content;
|
||||
request.Text_ = text;
|
||||
request.SetHttpMethod("POST");
|
||||
OapiRobotSendResponse response = client.Execute(request);
|
||||
if (response.IsError)
|
||||
{
|
||||
throw new Exception(response.ErrMsg);
|
||||
}
|
||||
}
|
||||
}
|
||||
112
common/Tnb.Thirdparty/DingDing/Internal/DingDepartmentParameter.cs
vendored
Normal file
112
common/Tnb.Thirdparty/DingDing/Internal/DingDepartmentParameter.cs
vendored
Normal file
@@ -0,0 +1,112 @@
|
||||
namespace JNPF.Extras.Thirdparty.DingDing;
|
||||
|
||||
/// <summary>
|
||||
/// 钉钉部门参数.
|
||||
/// </summary>
|
||||
public class DingDepartmentParameter
|
||||
{
|
||||
/// <summary>
|
||||
/// 部门群是否包含外包部门.
|
||||
/// </summary>
|
||||
public bool? GroupContainOuterDept { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 父部门ID.
|
||||
/// </summary>
|
||||
public long? ParentId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 部门员工可见员工列表.
|
||||
/// </summary>
|
||||
public string OuterPermitUsers { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 部门员工可见部门列表.
|
||||
/// </summary>
|
||||
public string OuterPermitDepts { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 本部门成员是否只能看到所在部门及下级部门通讯录.
|
||||
/// </summary>
|
||||
public bool? OuterDeptOnlySelf { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否限制本部门成员查看通讯录.
|
||||
/// </summary>
|
||||
public bool? OuterDept { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 企业群群主的userid.
|
||||
/// </summary>
|
||||
public string OrgDeptOwner { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 在父部门中的排序值.
|
||||
/// </summary>
|
||||
public long? Order { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 部门名称,长度限制为1~64个字符,不允许包含字符‘-’‘,’以及‘,’.
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 语言.
|
||||
/// </summary>
|
||||
public string Language { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否隐藏本部门.
|
||||
/// </summary>
|
||||
public bool? HideDept { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 部门群是否包含子部门.
|
||||
/// </summary>
|
||||
public bool? GroupContainSubDept { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 指定可以查看本部门的用户userid列表.
|
||||
/// </summary>
|
||||
public string UserPermits { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 部门群是否包含隐藏部门.
|
||||
/// </summary>
|
||||
public bool? GroupContainHiddenDept { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 扩展.
|
||||
/// </summary>
|
||||
public string Extension { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 指定可以查看本部门的其他部门列表.
|
||||
/// </summary>
|
||||
public string DeptPermits { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 部门的主管userid列表.
|
||||
/// </summary>
|
||||
public string DeptManagerUseridList { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 部门ID.
|
||||
/// </summary>
|
||||
public long? DeptId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否创建一个关联此部门的企业群.
|
||||
/// </summary>
|
||||
public bool? CreateDeptGroup { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当部门群已经创建后,有新人加入部门时是否会自动加入该群.
|
||||
/// </summary>
|
||||
public bool? AutoAddUser { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 部门标识字段,开发者可用该字段来唯一标识一个部门,并与钉钉外部通讯录里的部门做映射.
|
||||
/// </summary>
|
||||
public string SourceIdentifier { get; set; }
|
||||
}
|
||||
102
common/Tnb.Thirdparty/DingDing/Internal/DingUserParameter.cs
vendored
Normal file
102
common/Tnb.Thirdparty/DingDing/Internal/DingUserParameter.cs
vendored
Normal file
@@ -0,0 +1,102 @@
|
||||
namespace JNPF.Extras.Thirdparty.DingDing;
|
||||
|
||||
/// <summary>
|
||||
/// 钉钉用户.
|
||||
/// </summary>
|
||||
public class DingUserParameter
|
||||
{
|
||||
/// <summary>
|
||||
/// 入职时间,Unix时间戳,单位毫秒.
|
||||
/// </summary>
|
||||
public long? HiredDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 备注,长度最大2000个字符.
|
||||
/// </summary>
|
||||
public string Remark { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 员工的企业邮箱.
|
||||
/// </summary>
|
||||
public string OrgEmail { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 员工名称.
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 手机号码,企业内必须唯一,不可重复.
|
||||
/// </summary>
|
||||
public string Mobile { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 语言.
|
||||
/// </summary>
|
||||
public string Language { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 员工工号.
|
||||
/// </summary>
|
||||
public string JobNumber { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 钉钉专属帐号初始密码.
|
||||
/// </summary>
|
||||
public string InitPassword { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 职位.
|
||||
/// </summary>
|
||||
public string Title { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否号码隐藏.
|
||||
/// </summary>
|
||||
public bool? HideMobile { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 扩展属性,可以设置多种属性,最大长度2000个字符.
|
||||
/// </summary>
|
||||
public string Extension { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 员工邮箱,长度最大50个字符。企业内必须唯一,不可重复.
|
||||
/// </summary>
|
||||
public string Email { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 员工在对应的部门中的职位.
|
||||
/// </summary>
|
||||
public string DeptTitleList { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 员工在对应的部门中的排序.
|
||||
/// </summary>
|
||||
public string DeptOrderList { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 所属部门id列表.
|
||||
/// </summary>
|
||||
public string DeptIdList { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 员工唯一标识ID(不可修改),企业内必须唯一.
|
||||
/// </summary>
|
||||
public string Userid { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 办公地点.
|
||||
/// </summary>
|
||||
public string WorkPlace { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否开启高管模式.
|
||||
/// </summary>
|
||||
public bool? SeniorMode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 分机号.
|
||||
/// </summary>
|
||||
public string Telephone { get; set; }
|
||||
}
|
||||
22
common/Tnb.Thirdparty/DingDing/Internal/DingWorkMessageParameter.cs
vendored
Normal file
22
common/Tnb.Thirdparty/DingDing/Internal/DingWorkMessageParameter.cs
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
namespace JNPF.Extras.Thirdparty.DingDing;
|
||||
|
||||
/// <summary>
|
||||
/// 钉钉消息.
|
||||
/// </summary>
|
||||
public class DingWorkMessageParameter
|
||||
{
|
||||
/// <summary>
|
||||
/// 接收人.
|
||||
/// </summary>
|
||||
public string toUsers { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 消息内容.
|
||||
/// </summary>
|
||||
public string msg { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 微应用的AgentID.
|
||||
/// </summary>
|
||||
public string agentId { get; set; }
|
||||
}
|
||||
Reference in New Issue
Block a user