Ver Fonte

feat(s8): expose employee user binding status

master-data/employees now returns sysUserId, sysUserName and bindStatus
("BOUND"/"UNBOUND") so the assignee/verifier picker can surface unbound
employees before the user submits and the auth check trips.

sysUserName falls back from RealName to Account; original id/name/empCode
fields are preserved so existing front-end dropdowns keep working.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
YY968XX há 1 mês atrás
pai
commit
e3bc53de6c

+ 42 - 4
server/Plugins/Admin.NET.Plugin.AiDOP/Service/S8/S8MasterDataAdapter.cs

@@ -8,15 +8,18 @@ public class S8MasterDataAdapter : ITransient
     private readonly SqlSugarRepository<AdoS0DepartmentMaster> _deptRep;
     private readonly SqlSugarRepository<AdoS0EmployeeMaster> _empRep;
     private readonly SqlSugarRepository<AdoS0LineMaster> _lineRep;
+    private readonly SqlSugarRepository<SysUser> _sysUserRep;
 
     public S8MasterDataAdapter(
         SqlSugarRepository<AdoS0DepartmentMaster> deptRep,
         SqlSugarRepository<AdoS0EmployeeMaster> empRep,
-        SqlSugarRepository<AdoS0LineMaster> lineRep)
+        SqlSugarRepository<AdoS0LineMaster> lineRep,
+        SqlSugarRepository<SysUser> sysUserRep)
     {
         _deptRep = deptRep;
         _empRep = empRep;
         _lineRep = lineRep;
+        _sysUserRep = sysUserRep;
     }
 
     public async Task<object> GetDepartmentsAsync(long? factoryRefId) =>
@@ -26,13 +29,48 @@ public class S8MasterDataAdapter : ITransient
             .Select(x => new { id = x.Id, code = x.Department, name = x.Descr ?? x.Department })
             .ToListAsync();
 
-    public async Task<object> GetEmployeesAsync(long? factoryRefId) =>
-        await _empRep.AsQueryable()
+    public async Task<object> GetEmployeesAsync(long? factoryRefId)
+    {
+        var emps = await _empRep.AsQueryable()
             .WhereIF(factoryRefId.HasValue, x => x.FactoryRefId == factoryRefId!.Value)
             .Take(500)
-            .Select(x => new { id = x.Id, name = x.Name ?? x.Employee, empCode = x.Employee })
+            .Select(x => new { x.Id, x.Name, x.Employee, x.SysUserId })
             .ToListAsync();
 
+        var sysUserIds = emps.Where(e => e.SysUserId.HasValue && e.SysUserId.Value > 0)
+            .Select(e => e.SysUserId!.Value).Distinct().ToList();
+
+        Dictionary<long, (string? RealName, string? Account)> userMap = new();
+        if (sysUserIds.Count > 0)
+        {
+            var users = await _sysUserRep.AsQueryable().ClearFilter()
+                .Where(u => sysUserIds.Contains(u.Id))
+                .Select(u => new { u.Id, u.RealName, u.Account })
+                .ToListAsync();
+            userMap = users.ToDictionary(u => u.Id, u => ((string?)u.RealName, (string?)u.Account));
+        }
+
+        return emps.Select(e =>
+        {
+            var bound = e.SysUserId.HasValue && e.SysUserId.Value > 0 && userMap.ContainsKey(e.SysUserId.Value);
+            string? sysUserName = null;
+            if (bound)
+            {
+                var (realName, account) = userMap[e.SysUserId!.Value];
+                sysUserName = !string.IsNullOrWhiteSpace(realName) ? realName : account;
+            }
+            return new
+            {
+                id = e.Id,
+                name = e.Name ?? e.Employee,
+                empCode = e.Employee,
+                sysUserId = e.SysUserId,
+                sysUserName,
+                bindStatus = bound ? "BOUND" : "UNBOUND"
+            };
+        }).ToList();
+    }
+
     public async Task<object> GetLinesAsync(long? factoryRefId) =>
         await _lineRep.AsQueryable()
             .WhereIF(factoryRefId.HasValue, x => x.FactoryRefId == factoryRefId!.Value)