2021-04-15 00:40:30 +08:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using Castle.Core.Internal;
|
|
|
|
|
using Infrastructure;
|
|
|
|
|
using Infrastructure.Extensions;
|
2021-10-18 00:42:29 +08:00
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
2021-04-15 00:40:30 +08:00
|
|
|
|
using OpenAuth.App.Interface;
|
|
|
|
|
using OpenAuth.App.Request;
|
|
|
|
|
using OpenAuth.App.Response;
|
|
|
|
|
using OpenAuth.Repository;
|
|
|
|
|
using OpenAuth.Repository.Domain;
|
|
|
|
|
using OpenAuth.Repository.Interface;
|
2025-07-29 21:55:38 +08:00
|
|
|
|
using SqlSugar;
|
2021-04-15 00:40:30 +08:00
|
|
|
|
namespace OpenAuth.App
|
|
|
|
|
{
|
2025-07-29 21:55:38 +08:00
|
|
|
|
public class UserManagerApp : SqlSugarBaseApp<SysUser>
|
2021-04-15 00:40:30 +08:00
|
|
|
|
{
|
|
|
|
|
private RevelanceManagerApp _revelanceApp;
|
|
|
|
|
private OrgManagerApp _orgManagerApp;
|
2025-07-29 21:55:38 +08:00
|
|
|
|
public UserManagerApp(ISqlSugarClient client,
|
|
|
|
|
RevelanceManagerApp app, IAuth auth, OrgManagerApp orgManagerApp) : base(client, auth)
|
2021-04-15 00:40:30 +08:00
|
|
|
|
{
|
|
|
|
|
_revelanceApp = app;
|
|
|
|
|
_orgManagerApp = orgManagerApp;
|
|
|
|
|
}
|
2025-02-19 12:44:42 +08:00
|
|
|
|
public SysUser GetByAccount(string account)
|
2021-04-15 00:40:30 +08:00
|
|
|
|
{
|
2025-07-29 21:55:38 +08:00
|
|
|
|
return SugarClient.Queryable<SysUser>().First(u => u.Account == account);
|
2021-04-15 00:40:30 +08:00
|
|
|
|
}
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 加载当前登录用户可访问的一个部门及子部门全部用户
|
|
|
|
|
/// 如果请求的request.OrgId为空,则可以获取到已被删除机构的用户(即:没有分配任何机构的用户)
|
|
|
|
|
/// </summary>
|
2025-06-11 21:14:41 +08:00
|
|
|
|
public async Task<PagedDynamicDataResp> Load(QueryUserListReq request)
|
2021-04-15 00:40:30 +08:00
|
|
|
|
{
|
|
|
|
|
var loginUser = _auth.GetCurrentUser();
|
2025-07-29 21:55:38 +08:00
|
|
|
|
var query = SugarClient.Queryable<SysUser>();
|
2021-04-15 00:40:30 +08:00
|
|
|
|
if (!string.IsNullOrEmpty(request.key))
|
|
|
|
|
{
|
2025-07-29 21:55:38 +08:00
|
|
|
|
query = SugarClient.Queryable<SysUser>().Where(u => u.Name.Contains(request.key) || u.Account.Contains(request.key));
|
2021-04-15 00:40:30 +08:00
|
|
|
|
}
|
2025-07-29 21:55:38 +08:00
|
|
|
|
var userOrgs = query
|
|
|
|
|
.LeftJoin<SysUser>((user, u) => user.ParentId == u.Id)
|
|
|
|
|
.LeftJoin<Relevance>((user, u, r) => user.Id == r.FirstId && r.RelKey == Define.USERORG)
|
|
|
|
|
.LeftJoin<SysOrg>((user, u, r, o) => r.SecondId == o.Id);
|
|
|
|
|
|
2021-04-15 00:40:30 +08:00
|
|
|
|
//如果请求的orgId不为空
|
|
|
|
|
if (!string.IsNullOrEmpty(request.orgId))
|
|
|
|
|
{
|
|
|
|
|
var org = loginUser.Orgs.SingleOrDefault(u => u.Id == request.orgId);
|
|
|
|
|
var cascadeId = org.CascadeId;
|
|
|
|
|
var orgIds = loginUser.Orgs.Where(u => u.CascadeId.Contains(cascadeId)).Select(u => u.Id).ToArray();
|
|
|
|
|
//只获取机构里面的用户
|
2025-07-29 21:55:38 +08:00
|
|
|
|
userOrgs = userOrgs.Where((user,u,r,o) => r.RelKey == Define.USERORG && orgIds.Contains(o.Id));
|
2021-04-15 00:40:30 +08:00
|
|
|
|
}
|
|
|
|
|
else //todo:如果请求的orgId为空,即为跟节点,这时可以额外获取到机构已经被删除的用户,从而进行机构分配。可以根据自己需求进行调整
|
|
|
|
|
{
|
|
|
|
|
var orgIds = loginUser.Orgs.Select(u => u.Id).ToArray();
|
|
|
|
|
//获取用户可以访问的机构的用户和没有任何机构关联的用户(机构被删除后,没有删除这里面的关联关系)
|
2025-07-29 21:55:38 +08:00
|
|
|
|
userOrgs = userOrgs.Where((user,u,r,o) => (r.RelKey == Define.USERORG && orgIds.Contains(o.Id)) || (o == null));
|
2021-04-15 00:40:30 +08:00
|
|
|
|
}
|
2025-07-29 21:55:38 +08:00
|
|
|
|
|
|
|
|
|
var userOrgs2 = userOrgs.Select((user, u, r, o) => new {
|
|
|
|
|
Account = user.Account,
|
|
|
|
|
Name = user.Name,
|
|
|
|
|
Id = user.Id,
|
|
|
|
|
Sex = user.Sex,
|
|
|
|
|
Status = user.Status,
|
|
|
|
|
BizCode = user.BizCode,
|
|
|
|
|
CreateId = user.CreateId,
|
|
|
|
|
CreateTime = user.CreateTime,
|
|
|
|
|
TypeId = user.TypeId,
|
|
|
|
|
TypeName = user.TypeName,
|
|
|
|
|
ParentId = user.ParentId,
|
|
|
|
|
ParentName = u.Name,
|
|
|
|
|
Key = r.RelKey,
|
|
|
|
|
OrgId = o.Id,
|
|
|
|
|
OrgName = o.Name
|
|
|
|
|
});
|
|
|
|
|
var userViews = (await userOrgs2.ToListAsync()).GroupBy(b => b.Account)
|
|
|
|
|
.Select(u => new UserView
|
|
|
|
|
{
|
|
|
|
|
Id = u.First().Id,
|
|
|
|
|
Account = u.Key,
|
|
|
|
|
Name = u.First().Name,
|
|
|
|
|
ParentName = u.First().ParentName,
|
|
|
|
|
Sex = u.First().Sex,
|
|
|
|
|
Status = u.First().Status,
|
|
|
|
|
ParentId = u.First().ParentId,
|
|
|
|
|
CreateTime = u.First().CreateTime,
|
|
|
|
|
CreateUser = u.First().CreateId,
|
|
|
|
|
OrganizationIds = string.Join(",", u.Select(x => x.OrgId))
|
|
|
|
|
,
|
|
|
|
|
Organizations = string.Join(",", u.Select(x => x.OrgName))
|
|
|
|
|
});
|
2025-06-11 21:14:41 +08:00
|
|
|
|
return new PagedDynamicDataResp
|
2021-04-15 00:40:30 +08:00
|
|
|
|
{
|
2025-07-29 21:55:38 +08:00
|
|
|
|
Count = userViews.Count(),
|
|
|
|
|
Data = userViews.OrderBy(u => u.Name)
|
2021-04-15 00:40:30 +08:00
|
|
|
|
.Skip((request.page - 1) * request.limit)
|
|
|
|
|
.Take(request.limit),
|
|
|
|
|
};
|
|
|
|
|
}
|
2021-07-05 21:44:35 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 获取所有的用户
|
|
|
|
|
/// 为了控制权限,通常只用于流程实例选择执行角色,其他地方请使用Load
|
|
|
|
|
/// </summary>
|
2025-06-11 21:14:41 +08:00
|
|
|
|
public async Task<PagedListDataResp<UserView>> LoadAll(QueryUserListReq request)
|
2021-07-05 21:44:35 +08:00
|
|
|
|
{
|
2025-07-29 21:55:38 +08:00
|
|
|
|
var query = SugarClient.Queryable<SysUser>();
|
|
|
|
|
if (!string.IsNullOrEmpty(request.key))
|
|
|
|
|
{
|
|
|
|
|
query = SugarClient.Queryable<SysUser>().Where(u => u.Name.Contains(request.key) || u.Account.Contains(request.key));
|
|
|
|
|
}
|
|
|
|
|
var userOrgs = query
|
|
|
|
|
.LeftJoin<SysUser>((user, u) => user.ParentId == u.Id)
|
|
|
|
|
.LeftJoin<Relevance>((user, u, r) => user.Id == r.FirstId && r.RelKey == Define.USERORG)
|
|
|
|
|
.LeftJoin<SysOrg>((user, u, r, o) => r.SecondId == o.Id);
|
2021-07-05 21:44:35 +08:00
|
|
|
|
//如果请求的orgId不为空
|
|
|
|
|
if (!string.IsNullOrEmpty(request.orgId))
|
|
|
|
|
{
|
2025-07-29 21:55:38 +08:00
|
|
|
|
userOrgs = userOrgs.Where((user,u,r,o) => r.RelKey == Define.USERORG && o.Id == request.orgId);
|
2021-07-05 21:44:35 +08:00
|
|
|
|
}
|
2025-07-29 21:55:38 +08:00
|
|
|
|
|
|
|
|
|
var userOrgs2 = userOrgs.Select((user, u, r, o) => new {
|
|
|
|
|
Account = user.Account,
|
|
|
|
|
Name = user.Name,
|
|
|
|
|
Id = user.Id,
|
|
|
|
|
Sex = user.Sex,
|
|
|
|
|
Status = user.Status,
|
|
|
|
|
BizCode = user.BizCode,
|
|
|
|
|
CreateId = user.CreateId,
|
|
|
|
|
CreateTime = user.CreateTime,
|
|
|
|
|
TypeId = user.TypeId,
|
|
|
|
|
TypeName = user.TypeName,
|
|
|
|
|
ParentId = user.ParentId,
|
|
|
|
|
ParentName = u.Name,
|
|
|
|
|
Key = r.RelKey,
|
|
|
|
|
OrgId = o.Id,
|
|
|
|
|
OrgName = o.Name
|
|
|
|
|
});
|
|
|
|
|
var userViews = (await userOrgs2.ToListAsync()).GroupBy(b => b.Account).Select(u => new UserView
|
2021-07-05 21:44:35 +08:00
|
|
|
|
{
|
|
|
|
|
Id = u.First().Id,
|
|
|
|
|
Account = u.Key,
|
|
|
|
|
Name = u.First().Name,
|
|
|
|
|
Sex = u.First().Sex,
|
|
|
|
|
Status = u.First().Status,
|
|
|
|
|
CreateTime = u.First().CreateTime,
|
|
|
|
|
CreateUser = u.First().CreateId,
|
2023-12-23 15:42:50 +08:00
|
|
|
|
ParentName = u.First().ParentName,
|
|
|
|
|
ParentId = u.First().ParentId,
|
2025-07-29 21:55:38 +08:00
|
|
|
|
OrganizationIds = string.Join(",", u.Select(x => x.OrgId))
|
|
|
|
|
,
|
|
|
|
|
Organizations = string.Join(",", u.Select(x => x.OrgName))
|
2021-07-05 21:44:35 +08:00
|
|
|
|
});
|
2025-06-11 21:14:41 +08:00
|
|
|
|
return new PagedListDataResp<UserView>()
|
2021-07-05 21:44:35 +08:00
|
|
|
|
{
|
2025-06-11 21:14:41 +08:00
|
|
|
|
Count = userViews.Count(),
|
|
|
|
|
Data = userViews.OrderBy(u => u.Name)
|
2021-07-05 21:44:35 +08:00
|
|
|
|
.Skip((request.page - 1) * request.limit)
|
|
|
|
|
.Take(request.limit).ToList()
|
|
|
|
|
};
|
|
|
|
|
}
|
2021-04-15 00:40:30 +08:00
|
|
|
|
public void AddOrUpdate(UpdateUserReq request)
|
|
|
|
|
{
|
2025-07-29 21:55:38 +08:00
|
|
|
|
request.ValidationEntity(u => new { u.Account, u.Name, u.OrganizationIds });
|
2021-04-15 00:40:30 +08:00
|
|
|
|
if (string.IsNullOrEmpty(request.OrganizationIds))
|
|
|
|
|
throw new Exception("请为用户分配机构");
|
2025-02-19 12:44:42 +08:00
|
|
|
|
SysUser requser = request;
|
2021-04-15 00:40:30 +08:00
|
|
|
|
requser.CreateId = _auth.GetCurrentUser().User.Id;
|
2025-07-29 21:55:38 +08:00
|
|
|
|
SugarClient.Ado.BeginTran();
|
|
|
|
|
if (string.IsNullOrEmpty(request.Id))
|
2021-04-15 00:40:30 +08:00
|
|
|
|
{
|
2025-07-29 21:55:38 +08:00
|
|
|
|
if (SugarClient.Queryable<SysUser>().Any(u => u.Account == request.Account))
|
2021-04-15 00:40:30 +08:00
|
|
|
|
{
|
2025-07-29 21:55:38 +08:00
|
|
|
|
throw new Exception("用户账号已存在");
|
2021-04-15 00:40:30 +08:00
|
|
|
|
}
|
2025-07-29 21:55:38 +08:00
|
|
|
|
if (string.IsNullOrEmpty(requser.Password))
|
2021-04-15 00:40:30 +08:00
|
|
|
|
{
|
2025-07-29 21:55:38 +08:00
|
|
|
|
requser.Password = requser.Account; //如果客户端没提供密码,默认密码同账号
|
|
|
|
|
}
|
|
|
|
|
requser.CreateTime = DateTime.Now;
|
|
|
|
|
Repository.Insert(requser);
|
|
|
|
|
request.Id = requser.Id; //要把保存后的ID存入view
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Repository.Update(u => new SysUser
|
|
|
|
|
{
|
|
|
|
|
Account = requser.Account,
|
|
|
|
|
BizCode = requser.BizCode,
|
|
|
|
|
Name = requser.Name,
|
|
|
|
|
Sex = requser.Sex,
|
|
|
|
|
Status = requser.Status,
|
|
|
|
|
ParentId = request.ParentId
|
|
|
|
|
},u => u.Id == request.Id);
|
|
|
|
|
if (!string.IsNullOrEmpty(requser.Password)) //密码为空的时候,不做修改
|
|
|
|
|
{
|
|
|
|
|
Repository.Update(u => new SysUser
|
2021-04-15 00:40:30 +08:00
|
|
|
|
{
|
2025-07-29 21:55:38 +08:00
|
|
|
|
Password = requser.Password
|
|
|
|
|
},u => u.Id == request.Id);
|
2021-04-15 00:40:30 +08:00
|
|
|
|
}
|
2025-07-29 21:55:38 +08:00
|
|
|
|
}
|
|
|
|
|
string[] orgIds = request.OrganizationIds.Split(',').ToArray();
|
|
|
|
|
_revelanceApp.DeleteBy(Define.USERORG, requser.Id);
|
|
|
|
|
_revelanceApp.Assign(Define.USERORG, orgIds.ToLookup(u => requser.Id));
|
|
|
|
|
|
|
|
|
|
SugarClient.Ado.CommitTran();
|
2021-04-15 00:40:30 +08:00
|
|
|
|
}
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 删除用户,包含用户与组织关系、用户与角色关系
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="ids"></param>
|
2025-07-29 21:55:38 +08:00
|
|
|
|
public new void Delete(string[] ids)
|
2021-04-15 00:40:30 +08:00
|
|
|
|
{
|
2025-07-29 21:55:38 +08:00
|
|
|
|
SugarClient.Ado.BeginTran();
|
|
|
|
|
SugarClient.Deleteable<Relevance>().Where(u => (u.RelKey == Define.USERROLE || u.RelKey == Define.USERORG)
|
|
|
|
|
&& ids.Contains(u.FirstId)).ExecuteCommand();
|
|
|
|
|
SugarClient.Deleteable<SysUser>().Where(u => ids.Contains(u.Id)).ExecuteCommand();
|
|
|
|
|
SugarClient.Ado.CommitTran();
|
2021-04-15 00:40:30 +08:00
|
|
|
|
}
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 修改密码
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="request"></param>
|
|
|
|
|
public void ChangePassword(ChangePasswordReq request)
|
|
|
|
|
{
|
2025-07-29 21:55:38 +08:00
|
|
|
|
Repository.Update(u => new SysUser
|
2021-04-15 00:40:30 +08:00
|
|
|
|
{
|
|
|
|
|
Password = request.Password
|
2025-07-29 21:55:38 +08:00
|
|
|
|
},u => u.Account == request.Account);
|
2021-04-15 00:40:30 +08:00
|
|
|
|
}
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 获取指定角色包含的用户列表
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="request"></param>
|
|
|
|
|
/// <returns></returns>
|
2025-06-11 21:14:41 +08:00
|
|
|
|
public async Task<PagedDynamicDataResp> LoadByRole(QueryUserListByRoleReq request)
|
2021-04-15 00:40:30 +08:00
|
|
|
|
{
|
2025-07-29 21:55:38 +08:00
|
|
|
|
var users = SugarClient.Queryable<Relevance>()
|
|
|
|
|
.Where(u => u.SecondId == request.roleId && u.RelKey == Define.USERROLE)
|
|
|
|
|
.LeftJoin<SysUser>((userRole, user) => userRole.FirstId == user.Id)
|
|
|
|
|
.Where((userRole, user) => user.Id != null)
|
|
|
|
|
.Select((userRole, user) => user);
|
2025-06-11 21:14:41 +08:00
|
|
|
|
return new PagedDynamicDataResp
|
2021-04-15 00:40:30 +08:00
|
|
|
|
{
|
2025-07-29 21:55:38 +08:00
|
|
|
|
Count = await users.CountAsync(),
|
|
|
|
|
Data = await users.Skip((request.page - 1) * request.limit).Take(request.limit).ToListAsync()
|
2021-04-15 00:40:30 +08:00
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 获取指定机构包含的用户列表
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="request"></param>
|
|
|
|
|
/// <returns></returns>
|
2025-06-11 21:14:41 +08:00
|
|
|
|
public async Task<PagedDynamicDataResp> LoadByOrg(QueryUserListByOrgReq request)
|
2021-04-15 00:40:30 +08:00
|
|
|
|
{
|
2025-07-29 21:55:38 +08:00
|
|
|
|
var users = SugarClient.Queryable<Relevance>()
|
|
|
|
|
.Where(u => u.SecondId == request.orgId && u.RelKey == Define.USERORG)
|
|
|
|
|
.LeftJoin<SysUser>((userOrg, user) => userOrg.FirstId == user.Id)
|
|
|
|
|
.Where((userOrg, user) => user.Id != null)
|
|
|
|
|
.Select((userOrg, user) => user);
|
2025-06-11 21:14:41 +08:00
|
|
|
|
return new PagedDynamicDataResp
|
2021-04-15 00:40:30 +08:00
|
|
|
|
{
|
2025-07-29 21:55:38 +08:00
|
|
|
|
Count = await users.CountAsync(),
|
|
|
|
|
Data = await users.Skip((request.page - 1) * request.limit).Take(request.limit).ToListAsync()
|
2021-04-15 00:40:30 +08:00
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 修改用户资料
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="request"></param>
|
|
|
|
|
public void ChangeProfile(ChangeProfileReq request)
|
|
|
|
|
{
|
|
|
|
|
if (request.Account == Define.SYSTEM_USERNAME)
|
|
|
|
|
{
|
|
|
|
|
throw new Exception("不能修改超级管理员信息");
|
|
|
|
|
}
|
2025-07-29 21:55:38 +08:00
|
|
|
|
Repository.Update(u => new SysUser
|
|
|
|
|
{
|
|
|
|
|
Name = request.Name,
|
|
|
|
|
Sex = request.Sex
|
|
|
|
|
},u => u.Account == request.Account);
|
2021-04-15 00:40:30 +08:00
|
|
|
|
}
|
2025-07-29 21:55:38 +08:00
|
|
|
|
|
2023-12-18 23:22:05 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 获取用户的直属上级ID
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="userid">用户ID</param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public string GetParent(string userid)
|
|
|
|
|
{
|
|
|
|
|
if (userid == Guid.Empty.ToString())
|
|
|
|
|
{
|
|
|
|
|
throw new Exception("超级管理员没有直属上级,请检查配置");
|
|
|
|
|
}
|
2025-07-29 21:55:38 +08:00
|
|
|
|
return SugarClient.Queryable<SysUser>().First(u => u.Id == userid).ParentId;
|
2023-12-18 23:22:05 +08:00
|
|
|
|
}
|
2024-10-10 12:14:08 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 获取流程实例通知的用户
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="instanceId"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public List<string> GetNoticeUsers(string instanceId)
|
|
|
|
|
{
|
|
|
|
|
var sql = $@"
|
|
|
|
|
select u.*
|
2025-02-26 07:24:19 +08:00
|
|
|
|
from sysuser u
|
2024-10-10 12:14:08 +08:00
|
|
|
|
join (select distinct SecondId as UserId
|
|
|
|
|
from Relevance
|
2025-04-11 11:13:56 +08:00
|
|
|
|
where RelKey = '{Define.INSTANCE_NOTICE_USER}'
|
2024-10-10 12:14:08 +08:00
|
|
|
|
and FirstId = '{instanceId}'
|
|
|
|
|
union
|
|
|
|
|
select distinct FirstId as UserId
|
|
|
|
|
from Relevance a
|
|
|
|
|
inner join (select SecondId as RoleId
|
|
|
|
|
from Relevance
|
2025-04-11 11:13:56 +08:00
|
|
|
|
where RelKey = '{Define.INSTANCE_NOTICE_ROLE}'
|
2024-10-10 12:14:08 +08:00
|
|
|
|
and FirstId = '{instanceId}') b on a.SecondId = b.RoleId
|
2025-04-11 11:13:56 +08:00
|
|
|
|
where RelKey = 'UserRole') userids on u.Id = userids.UserId";
|
2025-07-29 21:55:38 +08:00
|
|
|
|
var users = SugarClient.Ado.SqlQuery<SysUser>(sql);
|
|
|
|
|
return users.Select(u => u.Id).ToList();
|
2024-10-10 12:14:08 +08:00
|
|
|
|
}
|
2025-07-21 00:42:35 +08:00
|
|
|
|
|
|
|
|
|
public List<UserView> LoadByIds(string[] ids)
|
|
|
|
|
{
|
2025-07-29 21:55:38 +08:00
|
|
|
|
var users = SugarClient.Queryable<SysUser>().Where(u => ids.Contains(u.Id));
|
2025-07-21 00:42:35 +08:00
|
|
|
|
|
|
|
|
|
//获取用户及用户关联的机构
|
2025-07-29 21:55:38 +08:00
|
|
|
|
var userOrgs = users
|
|
|
|
|
.LeftJoin<Relevance>((user, r) => user.Id == r.FirstId && r.RelKey == Define.USERORG)
|
|
|
|
|
.LeftJoin<SysOrg>((user, r, o) => r.SecondId == o.Id)
|
|
|
|
|
.Select((user, r, o) => new
|
2025-07-21 00:42:35 +08:00
|
|
|
|
{
|
|
|
|
|
user.Id,
|
|
|
|
|
user.Account,
|
|
|
|
|
user.Name,
|
|
|
|
|
user.Sex,
|
|
|
|
|
user.Status,
|
|
|
|
|
user.CreateTime,
|
|
|
|
|
user.CreateId,
|
|
|
|
|
user.ParentId,
|
|
|
|
|
OrgId = o.Id,
|
|
|
|
|
OrgName = o.Name
|
2025-07-29 21:55:38 +08:00
|
|
|
|
});
|
2025-07-21 00:42:35 +08:00
|
|
|
|
|
2025-07-29 21:55:38 +08:00
|
|
|
|
var userOrgsList = userOrgs.ToList(); // 先执行ToList()
|
|
|
|
|
var userViews = userOrgsList.GroupBy(b => b.Account).Select(g => new UserView
|
2025-07-21 00:42:35 +08:00
|
|
|
|
{
|
2025-07-29 21:55:38 +08:00
|
|
|
|
Id = g.First().Id,
|
|
|
|
|
Account = g.Key,
|
|
|
|
|
Name = g.First().Name,
|
|
|
|
|
Sex = g.First().Sex,
|
|
|
|
|
Status = g.First().Status,
|
|
|
|
|
CreateTime = g.First().CreateTime,
|
|
|
|
|
CreateUser = g.First().CreateId,
|
|
|
|
|
ParentName = g.First().ParentId,
|
|
|
|
|
ParentId = g.First().ParentId,
|
|
|
|
|
OrganizationIds = string.Join(",", g.Select(x => x.OrgId)),
|
|
|
|
|
Organizations = string.Join(",", g.Select(x => x.OrgName))
|
2025-07-21 00:42:35 +08:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return userViews.ToList();
|
|
|
|
|
}
|
2021-04-15 00:40:30 +08:00
|
|
|
|
}
|
2015-11-16 23:18:51 +08:00
|
|
|
|
}
|