Przeglądaj źródła

新增钉钉角色信息

彭聪 1 rok temu
rodzic
commit
dd8a27a5ec

+ 40 - 0
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Entity/DingTalkRoleUser.cs

@@ -0,0 +1,40 @@
+namespace Admin.NET.Plugin.DingTalk;
+/// <summary>
+/// 钉钉角色信息
+/// </summary>
+[SugarTable(null, "钉钉角色表")]
+public class DingTalkRoleUser : EntityBase
+{
+    /// <summary>
+    /// 钉钉用户id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "钉钉用户id", Length = 64)]
+    [Required, MaxLength(64)]
+    public virtual string? DingTalkUserId { get; set; }
+    /// <summary>
+    /// 角色组id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "角色组id")]
+    [Required]
+    public virtual long groupId { get; set; }
+
+    /// <summary>
+    /// 角色组名称
+    /// </summary>
+    [SugarColumn(ColumnDescription = "角色组名", Length = 64)]
+    [MaxLength(64)]
+    public string? groupName { get; set; }
+    /// <summary>
+    /// 角色id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "角色id")]
+    [Required]
+    public virtual long roleId { get; set; }
+
+    /// <summary>
+    /// 角色名
+    /// </summary>
+    [SugarColumn(ColumnDescription = "角色名", Length = 64)]
+    [MaxLength(64)]
+    public string? roleName { get; set; }
+}

+ 134 - 0
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Job/SyncDingTalkRoleJob.cs

@@ -0,0 +1,134 @@
+using Admin.NET.Plugin.DingTalk;
+using Furion.Schedule;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+namespace Admin.NET.Plugin.Job;
+/// <summary>
+/// 同步钉钉角色job,自动同步触发器请在web页面按需求设置
+/// </summary>
+[JobDetail("SyncDingTalkRoleJob", Description = "同步钉钉角色", GroupName = "default", Concurrent = false)]
+public class SyncDingTalkRoleJob : IJob
+{
+    private readonly IServiceScopeFactory _scopeFactory;
+    private readonly IDingTalkApi _dingTalkApi;
+    private readonly ILogger _logger;
+    public SyncDingTalkRoleJob(IServiceScopeFactory scopeFactory, IDingTalkApi dingTalkApi, ILoggerFactory loggerFactory)
+    {
+        _scopeFactory = scopeFactory;
+        _dingTalkApi = dingTalkApi;
+        _logger = loggerFactory.CreateLogger(CommonConst.SysLogCategoryName);
+    }
+    public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
+    {
+        using var serviceScope = _scopeFactory.CreateScope();
+        var _dingTalkRoleRepo = serviceScope.ServiceProvider.GetRequiredService<SqlSugarRepository<DingTalkRoleUser>>();
+        var _dingTalkOptions = serviceScope.ServiceProvider.GetRequiredService<IOptions<DingTalkOptions>>();
+
+        // 获取Token
+        var tokenRes = await _dingTalkApi.GetDingTalkToken(_dingTalkOptions.Value.ClientId, _dingTalkOptions.Value.ClientSecret);
+        if (tokenRes.ErrCode != 0)
+            throw Oops.Oh(tokenRes.ErrMsg);
+
+        var dingTalkRoleUserList = new List<DingTalkRoleUser>();
+        // 获取角色列表
+        var roleIdsRes = await _dingTalkApi.GetDingTalkRoleList(tokenRes.AccessToken, new GetDingTalkCurrentRoleListInput
+        { });
+        if (roleIdsRes.Success)
+        {
+            _logger.LogError(roleIdsRes.ErrMsg);
+            throw Oops.Oh(roleIdsRes.ErrMsg);
+        }
+        foreach (var item in roleIdsRes.Result.list)
+        {
+            foreach (var role_item in item.roles)
+            {
+                // 根据角色id获取指定角色的员工列表
+                var role_user = await _dingTalkApi.GetDingTalkRoleSimplelist(
+                    tokenRes.AccessToken,
+                    new GetDingTalkCurrentRoleSimplelistInput()
+                    {
+                        role_id = role_item.id,
+                    }
+                );
+
+                if (role_user.Success)
+                {
+                    _logger.LogError(role_user.ErrMsg);
+                    break;
+                }
+                var tempList = role_user.Result.list.Select(u => new DingTalkRoleUser
+                {
+                    DingTalkUserId = u.userid,
+                    groupId = item.groupId,
+                    groupName = item.name,
+                    roleId = role_item.id,
+                    roleName = role_item.name
+                }).ToList();
+                if (tempList?.Count > 0)
+                {
+                    dingTalkRoleUserList.AddRange(tempList);
+                }
+
+
+            }
+        }
+
+
+        // 判断新增还是更新
+        var sysDingTalkRoleList = await _dingTalkRoleRepo.AsQueryable().ToListAsync();
+        // 需要更新的用户Id
+        var uDingTalkRole = dingTalkRoleUserList.Where(u => sysDingTalkRoleList.Any(m => m.DingTalkUserId == u.DingTalkUserId && m.groupId == u.groupId));
+        // 需要新增的用户Id
+        var iDingTalkRole = dingTalkRoleUserList.Where(u => !sysDingTalkRoleList.Any(m => m.DingTalkUserId == u.DingTalkUserId && m.groupId == u.groupId));
+        // 需要删除的数据
+        var dDingTalkRole = sysDingTalkRoleList.Where(u => !dingTalkRoleUserList.Any(m => m.DingTalkUserId == u.DingTalkUserId && m.groupId == u.groupId)).ToList();
+        // 新增钉钉角色
+        var iUser = iDingTalkRole.Select(res => new DingTalkRoleUser
+        {
+            DingTalkUserId = res.DingTalkUserId,
+            groupId = res.groupId,
+            groupName = res.groupName,
+            roleId = res.roleId,
+            roleName = res.roleName,
+        }).ToList();
+        if (iUser.Count > 0)
+        {
+            await _dingTalkRoleRepo.CopyNew().AsInsertable(iUser).ExecuteCommandAsync();
+        }
+
+        // 更新钉钉角色
+        var uUser = uDingTalkRole.Select(res => new DingTalkRoleUser
+        {
+            Id = sysDingTalkRoleList.Where(u => u.DingTalkUserId == res.DingTalkUserId).Select(u => u.Id).FirstOrDefault(),
+            DingTalkUserId = res.DingTalkUserId,
+            groupId = res.groupId,
+            groupName = res.groupName,
+            roleId = res.roleId,
+            roleName = res.roleName
+        }).ToList();
+        //添加需要删除的数据
+        Parallel.ForEach(dDingTalkRole, user => user.IsDelete = true);
+        uUser.AddRange(dDingTalkRole);
+        if (uUser.Count > 0)
+        {
+            await _dingTalkRoleRepo.CopyNew().AsUpdateable(uUser).UpdateColumns(u => new
+            {
+                u.DingTalkUserId,
+                u.groupId,
+                u.groupName,
+                u.roleId,
+                u.roleName,
+                u.UpdateTime,
+                u.UpdateUserName,
+                u.UpdateUserId,
+                u.IsDelete
+            }).ExecuteCommandAsync();
+        }
+
+        var originColor = Console.ForegroundColor;
+        Console.ForegroundColor = ConsoleColor.Blue;
+        Console.WriteLine("【" + DateTime.Now + "】同步钉钉角色");
+        Console.ForegroundColor = originColor;
+    }
+}

+ 10 - 6
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Job/SyncDingTalkUserJob.cs

@@ -58,12 +58,16 @@ public class SyncDingTalkUserJob : IJob
                 break;
             }
             // 根据用户Id获取花名册
-            var rosterRes = await _dingTalkApi.GetDingTalkCurrentEmployeesRosterList(tokenRes.AccessToken, new GetDingTalkCurrentEmployeesRosterListInput()
-            {
-                UserIdList = string.Join(",", userIdsRes.Result.DataList),
-                FieldFilterList = $"{DingTalkConst.NameField},{DingTalkConst.JobNumberField},{DingTalkConst.MobileField}",
-                AgentId = _dingTalkOptions.Value.AgentId
-            });
+            var rosterRes = await _dingTalkApi.GetDingTalkCurrentEmployeesRosterList(
+                tokenRes.AccessToken,
+                new GetDingTalkCurrentEmployeesRosterListInput()
+                {
+                    UserIdList = string.Join(",", userIdsRes.Result.DataList),
+                    FieldFilterList =
+                        $"{DingTalkConst.NameField},{DingTalkConst.JobNumberField},{DingTalkConst.MobileField},{DingTalkConst.DeptId},{DingTalkConst.Dept},{DingTalkConst.Position}",
+                    AgentId = _dingTalkOptions.Value.AgentId
+                }
+            );
             if (!rosterRes.Success)
             {
                 _logger.LogError(rosterRes.ErrMsg);

+ 16 - 0
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/DingTalkRoleListOutput.cs

@@ -0,0 +1,16 @@
+namespace Admin.NET.Plugin.DingTalk;
+public class DingTalkRoleListOutput
+{
+    /// <summary>
+    /// 是否还有更多数据
+    /// </summary>
+    [JsonProperty("hasMore")]
+    [System.Text.Json.Serialization.JsonPropertyName("hasMore")]
+    public bool hasMore { get; set; }
+    /// <summary>
+    /// 角色组列表
+    /// </summary>
+    [JsonProperty("list")]
+    [System.Text.Json.Serialization.JsonPropertyName("list")]
+    public List<DingTalkRoleListResult> list { get; set; }
+}

+ 15 - 0
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/DingTalkRoleListResult.cs

@@ -0,0 +1,15 @@
+
+
+namespace Admin.NET.Plugin.DingTalk;
+public class DingTalkRoleListResult
+{
+    [JsonProperty("groupId")]
+    [System.Text.Json.Serialization.JsonPropertyName("groupId")]
+    public long groupId { get; set; }
+    [JsonProperty("name")]
+    [System.Text.Json.Serialization.JsonPropertyName("name")]
+    public string name { get; set; }
+    [JsonProperty("roles")]
+    [System.Text.Json.Serialization.JsonPropertyName("roles")]
+    public List<DingTalkRoleResult> roles { get; set; }
+}

+ 11 - 0
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/DingTalkRoleResult.cs

@@ -0,0 +1,11 @@
+
+namespace Admin.NET.Plugin.DingTalk;
+public class DingTalkRoleResult
+{
+    [JsonProperty("id")]
+    [System.Text.Json.Serialization.JsonPropertyName("id")]
+    public long id { get; set; }
+    [JsonProperty("name")]
+    [System.Text.Json.Serialization.JsonPropertyName("name")]
+    public string name { get; set; }
+}

+ 16 - 0
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/DingTalkRoleSimplelistOutput.cs

@@ -0,0 +1,16 @@
+namespace Admin.NET.Plugin.DingTalk;
+public class DingTalkRoleSimplelistOutput
+{
+    /// <summary>
+    /// 是否还有更多数据
+    /// </summary>
+    [JsonProperty("hasMore")]
+    [System.Text.Json.Serialization.JsonPropertyName("hasMore")]
+    public bool hasMore { get; set; }
+    /// <summary>
+    /// 角色组列表
+    /// </summary>
+    [JsonProperty("list")]
+    [System.Text.Json.Serialization.JsonPropertyName("list")]
+    public List<DingTalkRoleSimplelistResult> list { get; set; }
+}

+ 10 - 0
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/DingTalkRoleSimplelistResult.cs

@@ -0,0 +1,10 @@
+namespace Admin.NET.Plugin.DingTalk;
+public class DingTalkRoleSimplelistResult
+{
+    [JsonProperty("userid")]
+    [System.Text.Json.Serialization.JsonPropertyName("userid")]
+    public string userid { get; set; }
+    [JsonProperty("name")]
+    [System.Text.Json.Serialization.JsonPropertyName("name")]
+    public string name { get; set; }
+}

+ 14 - 0
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/GetDingTalkCurrentRoleListInput.cs

@@ -0,0 +1,14 @@
+
+namespace Admin.NET.Plugin.DingTalk;
+public class GetDingTalkCurrentRoleListInput
+{
+    /// <summary>
+    /// 分页游标,从0开始。根据返回结果里的next_cursor是否为空来判断是否还有下一页,且再次调用时offset设置成next_cursor的值。
+    /// </summary>
+    public int? Offset { get; set; }
+
+    /// <summary>
+    /// 分页大小,最大50。
+    /// </summary>
+    public int? Size { get; set; }
+}

+ 18 - 0
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/Dto/GetDingTalkCurrentRoleSimplelistInput.cs

@@ -0,0 +1,18 @@
+
+namespace Admin.NET.Plugin.DingTalk;
+public class GetDingTalkCurrentRoleSimplelistInput
+{
+    /// <summary>
+    /// 角色id
+    /// </summary>
+    public long role_id { get; set; }
+    /// <summary>
+    /// 分页游标,从0开始。根据返回结果里的next_cursor是否为空来判断是否还有下一页,且再次调用时offset设置成next_cursor的值。
+    /// </summary>
+    public int? Offset { get; set; }
+
+    /// <summary>
+    /// 分页大小,最大50。
+    /// </summary>
+    public int? Size { get; set; }
+}

+ 20 - 0
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Service/IDingTalkApi.cs

@@ -58,4 +58,24 @@ public interface IDingTalkApi : IHttpDeclarative
     Task<GetDingTalkCardMessageReadStatusOutput> GetDingTalkCardMessageReadStatus(
         [Header("x-acs-dingtalk-access-token")] string token,
         [Query] GetDingTalkCardMessageReadStatusInput input);
+
+    /// <summary>
+    /// 获取角色列表
+    /// </summary>
+    /// <param name="access_token">调用该接口的应用凭证</param>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [Post("https://oapi.dingtalk.com/topapi/role/list")]
+    Task<DingTalkBaseResponse<DingTalkRoleListOutput>> GetDingTalkRoleList([Query] string access_token,
+        [Body, Required] GetDingTalkCurrentRoleListInput input);
+
+    /// <summary>
+    /// 获取指定角色的员工列表
+    /// </summary>
+    /// <param name="access_token">调用该接口的应用凭证</param>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [Post("https://oapi.dingtalk.com/topapi/role/simplelist")]
+    Task<DingTalkBaseResponse<DingTalkRoleSimplelistOutput>> GetDingTalkRoleSimplelist([Query] string access_token,
+        [Body, Required] GetDingTalkCurrentRoleSimplelistInput input);
 }