Procházet zdrojové kódy

Update SyncDingTalkUserJob

johnechoo před 1 rokem
rodič
revize
8baa25023b

+ 2 - 1
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Configuration/DingTalk.json

@@ -13,6 +13,7 @@
     "AgentId": 123,
     "AgentId": 123,
     "ClientId": "xxxx", // 原 AppKey 和 SuiteKey
     "ClientId": "xxxx", // 原 AppKey 和 SuiteKey
     "ClientSecret": "xxxx", // 原 AppSecret 和 SuiteSecret
     "ClientSecret": "xxxx", // 原 AppSecret 和 SuiteSecret
-    "CorpId": "xxxx"
+    "CorpId": "xxxx",
+    "TenantId": 1300000001001
   }
   }
 }
 }

+ 2 - 2
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Entity/DingTalkUser.cs

@@ -10,7 +10,7 @@ namespace Admin.NET.Plugin.DingTalk;
 /// 钉钉用户表
 /// 钉钉用户表
 /// </summary>
 /// </summary>
 [SugarTable(null, "钉钉用户表")]
 [SugarTable(null, "钉钉用户表")]
-public class DingTalkUser : EntityBase
+public class DingTalkUser : EntityTenant
 {
 {
     /// <summary>
     /// <summary>
     /// 系统用户Id
     /// 系统用户Id
@@ -31,7 +31,7 @@ public class DingTalkUser : EntityBase
     /// </summary>
     /// </summary>
     [SugarColumn(ColumnDescription = "钉钉用户id", Length = 64)]
     [SugarColumn(ColumnDescription = "钉钉用户id", Length = 64)]
     [Required, MaxLength(64)]
     [Required, MaxLength(64)]
-    public virtual string? DingTalkUserId { get; set; }
+    public virtual string DingTalkUserId { get; set; }
 
 
     /// <summary>
     /// <summary>
     /// UnionId
     /// UnionId

+ 35 - 32
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Job/SyncDingTalkUserJob.cs

@@ -35,14 +35,15 @@ public class SyncDingTalkUserJob : IJob
     public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
     public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
     {
     {
         using var serviceScope = _scopeFactory.CreateScope();
         using var serviceScope = _scopeFactory.CreateScope();
-        var sysUserRep = serviceScope.ServiceProvider.GetRequiredService<SqlSugarRepository<SysUser>>();
+        var sysUserRepo = serviceScope.ServiceProvider.GetRequiredService<SqlSugarRepository<SysUser>>();
         var dingTalkUserRepo = serviceScope.ServiceProvider.GetRequiredService<SqlSugarRepository<DingTalkUser>>();
         var dingTalkUserRepo = serviceScope.ServiceProvider.GetRequiredService<SqlSugarRepository<DingTalkUser>>();
-        var dingTalkOptions = serviceScope.ServiceProvider.GetRequiredService<IOptions<DingTalkOptions>>();
+        var dingTalkOptions = serviceScope.ServiceProvider.GetRequiredService<IOptions<DingTalkOptions>>().Value;
         var dingTalkService = serviceScope.ServiceProvider.GetRequiredService<DingTalkService>();
         var dingTalkService = serviceScope.ServiceProvider.GetRequiredService<DingTalkService>();
         var hrmRequest = serviceScope.ServiceProvider.GetRequiredService<HrmRequest>();
         var hrmRequest = serviceScope.ServiceProvider.GetRequiredService<HrmRequest>();
 
 
         // 获取Token
         // 获取Token
         var token = await dingTalkService.GetDingTalkToken();
         var token = await dingTalkService.GetDingTalkToken();
+        ArgumentNullException.ThrowIfNull(token);
 
 
         var dingTalkUserList = new List<RosterListResultDomain>();
         var dingTalkUserList = new List<RosterListResultDomain>();
         var offset = 0;
         var offset = 0;
@@ -60,7 +61,7 @@ public class SyncDingTalkUserJob : IJob
             var rosterRes = await hrmRequest.RosterListsQuery(token,
             var rosterRes = await hrmRequest.RosterListsQuery(token,
                 userIdsRes.Result.DataList,
                 userIdsRes.Result.DataList,
                 new List<string> { DingTalkConst.NameField, DingTalkConst.JobNumberField, DingTalkConst.MobileField, DingTalkConst.DeptField, DingTalkConst.DeptIdField, DingTalkConst.PositionField },
                 new List<string> { DingTalkConst.NameField, DingTalkConst.JobNumberField, DingTalkConst.MobileField, DingTalkConst.DeptField, DingTalkConst.DeptIdField, DingTalkConst.PositionField },
-                dingTalkOptions.Value.AgentId);
+                dingTalkOptions.AgentId);
             if (!rosterRes.Success)
             if (!rosterRes.Success)
             {
             {
                 _logger.LogError(rosterRes.ErrMsg);
                 _logger.LogError(rosterRes.ErrMsg);
@@ -95,6 +96,7 @@ public class SyncDingTalkUserJob : IJob
             DeptId = res.FieldDataList.Where(u => u.FieldCode == DingTalkConst.DeptIdField).Select(u => u.FieldValueList.Select(m => m.Value).FirstOrDefault()).FirstOrDefault(),
             DeptId = res.FieldDataList.Where(u => u.FieldCode == DingTalkConst.DeptIdField).Select(u => u.FieldValueList.Select(m => m.Value).FirstOrDefault()).FirstOrDefault(),
             Dept = res.FieldDataList.Where(u => u.FieldCode == DingTalkConst.DeptField).Select(u => u.FieldValueList.Select(m => m.Value).FirstOrDefault()).FirstOrDefault(),
             Dept = res.FieldDataList.Where(u => u.FieldCode == DingTalkConst.DeptField).Select(u => u.FieldValueList.Select(m => m.Value).FirstOrDefault()).FirstOrDefault(),
             Position = res.FieldDataList.Where(u => u.FieldCode == DingTalkConst.PositionField).Select(u => u.FieldValueList.Select(m => m.Value).FirstOrDefault()).FirstOrDefault(),
             Position = res.FieldDataList.Where(u => u.FieldCode == DingTalkConst.PositionField).Select(u => u.FieldValueList.Select(m => m.Value).FirstOrDefault()).FirstOrDefault(),
+            TenantId = dingTalkOptions.TenantId
         }).ToList();
         }).ToList();
         if (iUser.Count > 0)
         if (iUser.Count > 0)
         {
         {
@@ -112,6 +114,7 @@ public class SyncDingTalkUserJob : IJob
             DeptId = res.FieldDataList.Where(u => u.FieldCode == DingTalkConst.DeptIdField).Select(u => u.FieldValueList.Select(m => m.Value).FirstOrDefault()).FirstOrDefault(),
             DeptId = res.FieldDataList.Where(u => u.FieldCode == DingTalkConst.DeptIdField).Select(u => u.FieldValueList.Select(m => m.Value).FirstOrDefault()).FirstOrDefault(),
             Dept = res.FieldDataList.Where(u => u.FieldCode == DingTalkConst.DeptField).Select(u => u.FieldValueList.Select(m => m.Value).FirstOrDefault()).FirstOrDefault(),
             Dept = res.FieldDataList.Where(u => u.FieldCode == DingTalkConst.DeptField).Select(u => u.FieldValueList.Select(m => m.Value).FirstOrDefault()).FirstOrDefault(),
             Position = res.FieldDataList.Where(u => u.FieldCode == DingTalkConst.PositionField).Select(u => u.FieldValueList.Select(m => m.Value).FirstOrDefault()).FirstOrDefault(),
             Position = res.FieldDataList.Where(u => u.FieldCode == DingTalkConst.PositionField).Select(u => u.FieldValueList.Select(m => m.Value).FirstOrDefault()).FirstOrDefault(),
+            TenantId = dingTalkOptions.TenantId,
         }).ToList();
         }).ToList();
         if (uUser.Count > 0)
         if (uUser.Count > 0)
         {
         {
@@ -127,40 +130,40 @@ public class SyncDingTalkUserJob : IJob
                 u.UpdateTime,
                 u.UpdateTime,
                 u.UpdateUserName,
                 u.UpdateUserName,
                 u.UpdateUserId,
                 u.UpdateUserId,
+                u.TenantId
             }).ExecuteCommandAsync();
             }).ExecuteCommandAsync();
         }
         }
 
 
-        // 通过系统用户账号(工号),更新钉钉用户表里面的系统用户Id
-        var sysUser = await sysUserRep.AsQueryable()
-            .Select(u => new
-            {
-                u.Id,
-                u.Account
-            }).ToListAsync();
-        var sysDingTalkUser = await dingTalkUserRepo.AsQueryable()
-            .Where(u => sysUser.Any(m => m.Account == u.JobNumber))
-            .Select(u => new
-            {
-                u.Id,
-                u.JobNumber,
-                u.Mobile,
-                u.DeptId,
-                u.Dept,
-                u.Position
-            }).ToListAsync();
-        var uSysDingTalkUser = sysDingTalkUser.Select(u => new DingTalkUser
-        {
-            Id = u.Id,
-            SysUserId = sysUser.Where(m => m.Account == u.JobNumber).Select(u => u.Id).FirstOrDefault(),
-        }).ToList();
+        //获取没有对应SysUser的DingTalkUser
+        var dingTalkWithoutSysuser = await dingTalkUserRepo.AsQueryable()
+           .LeftJoin<SysUser>((dUser, sUser) => dUser.DingTalkUserId == sUser.Account)
+           .GroupBy((dUser, sUser) => dUser.Id)
+           .Having((dUser, sUser) => SqlFunc.AggregateCount(sUser.Id) == 0)
+           .Select((dUser, sUser) => dUser)
+           .ToListAsync();
 
 
-        await dingTalkUserRepo.CopyNew().AsUpdateable(uSysDingTalkUser).UpdateColumns(u => new
+        //插入对应的SysUser
+        if (dingTalkWithoutSysuser.Count > 0)
         {
         {
-            u.SysUserId,
-            u.UpdateTime,
-            u.UpdateUserName,
-            u.UpdateUserId,
-        }).ExecuteCommandAsync();
+            var iSysUser = dingTalkWithoutSysuser.Select(dUser => new SysUser
+            {
+                Account = dUser.DingTalkUserId,
+                Password = CryptogramUtil.Encrypt(dUser.DingTalkUserId),
+                RealName = dUser.Name ?? "",
+                TenantId = dingTalkOptions.TenantId,
+            }).ToList();
+            await sysUserRepo.InsertRangeAsync(iSysUser);
+        }
+
+        //将SysUser.Id回填到对应DingTalkUser.SysUserId
+        await dingTalkUserRepo.AsUpdateable()
+            .SetColumns(dUser => new DingTalkUser
+            {
+                SysUserId = SqlFunc.Subqueryable<SysUser>()
+                                    .Where(sUser => sUser.Account == dUser.DingTalkUserId)
+                                    .Select(sUser => sUser.Id)
+            })
+            .ExecuteCommandAsync();
 
 
         var originColor = Console.ForegroundColor;
         var originColor = Console.ForegroundColor;
         Console.ForegroundColor = ConsoleColor.Blue;
         Console.ForegroundColor = ConsoleColor.Blue;

+ 5 - 0
Admin.NET/Plugins/Admin.NET.Plugin.DingTalk/Option/DingTalkOptions.cs

@@ -32,4 +32,9 @@ public sealed class DingTalkOptions : IConfigurableOptions
     /// 所属企业的CorpId
     /// 所属企业的CorpId
     /// </summary>
     /// </summary>
     public string CorpId { get; set; }
     public string CorpId { get; set; }
+
+    /// <summary>
+    /// 租户Id
+    /// </summary>
+    public long TenantId { get; set; }
 }
 }