S8MasterDataAdapter.cs 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using Admin.NET.Plugin.AiDOP.Entity.S0.Manufacturing;
  2. using Admin.NET.Plugin.AiDOP.Entity.S0.Warehouse;
  3. namespace Admin.NET.Plugin.AiDOP.Service.S8;
  4. public class S8MasterDataAdapter : ITransient
  5. {
  6. private readonly SqlSugarRepository<AdoS0DepartmentMaster> _deptRep;
  7. private readonly SqlSugarRepository<AdoS0EmployeeMaster> _empRep;
  8. private readonly SqlSugarRepository<AdoS0LineMaster> _lineRep;
  9. private readonly SqlSugarRepository<SysUser> _sysUserRep;
  10. public S8MasterDataAdapter(
  11. SqlSugarRepository<AdoS0DepartmentMaster> deptRep,
  12. SqlSugarRepository<AdoS0EmployeeMaster> empRep,
  13. SqlSugarRepository<AdoS0LineMaster> lineRep,
  14. SqlSugarRepository<SysUser> sysUserRep)
  15. {
  16. _deptRep = deptRep;
  17. _empRep = empRep;
  18. _lineRep = lineRep;
  19. _sysUserRep = sysUserRep;
  20. }
  21. public async Task<object> GetDepartmentsAsync(long? factoryRefId) =>
  22. await _deptRep.AsQueryable()
  23. .WhereIF(factoryRefId.HasValue, x => x.FactoryRefId == factoryRefId!.Value)
  24. .Take(500)
  25. .Select(x => new { id = x.Id, code = x.Department, name = x.Descr ?? x.Department })
  26. .ToListAsync();
  27. public async Task<object> GetEmployeesAsync(long? factoryRefId)
  28. {
  29. // S8 选员工下拉:EmployeeMaster.tenant_id 与 SysUser.TenantId 历史错位(业务租户 ≠ 系统租户),
  30. // 走全局 multi-tenant filter 会全过滤为空。本接口仅作 S8 处理人/检验人下拉,必须强约束 factoryRefId
  31. // 边界 + IsActive,避免越界;不依赖 token tenant 做隔离。
  32. if (!factoryRefId.HasValue || factoryRefId.Value <= 0)
  33. return new List<object>();
  34. var emps = await _empRep.AsQueryable().ClearFilter()
  35. .Where(x => x.FactoryRefId == factoryRefId!.Value && x.IsActive)
  36. .Take(500)
  37. .Select(x => new { x.Id, x.Name, x.Employee, x.SysUserId })
  38. .ToListAsync();
  39. var sysUserIds = emps.Where(e => e.SysUserId.HasValue && e.SysUserId.Value > 0)
  40. .Select(e => e.SysUserId!.Value).Distinct().ToList();
  41. Dictionary<long, (string? RealName, string? Account)> userMap = new();
  42. if (sysUserIds.Count > 0)
  43. {
  44. var users = await _sysUserRep.AsQueryable().ClearFilter()
  45. .Where(u => sysUserIds.Contains(u.Id))
  46. .Select(u => new { u.Id, u.RealName, u.Account })
  47. .ToListAsync();
  48. userMap = users.ToDictionary(u => u.Id, u => ((string?)u.RealName, (string?)u.Account));
  49. }
  50. return emps.Select(e =>
  51. {
  52. var bound = e.SysUserId.HasValue && e.SysUserId.Value > 0 && userMap.ContainsKey(e.SysUserId.Value);
  53. string? sysUserName = null;
  54. if (bound)
  55. {
  56. var (realName, account) = userMap[e.SysUserId!.Value];
  57. sysUserName = !string.IsNullOrWhiteSpace(realName) ? realName : account;
  58. }
  59. return new
  60. {
  61. id = e.Id,
  62. name = e.Name ?? e.Employee,
  63. empCode = e.Employee,
  64. sysUserId = e.SysUserId,
  65. sysUserName,
  66. bindStatus = bound ? "BOUND" : "UNBOUND"
  67. };
  68. }).ToList();
  69. }
  70. public async Task<object> GetLinesAsync(long? factoryRefId) =>
  71. await _lineRep.AsQueryable()
  72. .WhereIF(factoryRefId.HasValue, x => x.FactoryRefId == factoryRefId!.Value)
  73. .Take(500)
  74. .Select(x => new { id = x.Id, code = x.Line, name = x.Describe ?? x.Line })
  75. .ToListAsync();
  76. }