using YLErp; using YLErp.DBModels.Consts; using YLErp.Helpers; using YLErp.Model.Enum; using YLErp.Modules; using YLErp.Modules.DataProviderModule; using YLErp.Providers; namespace BaseOUDAL { public class UserBLL { static Dictionary UserDic; static UserBLL() { UpdateUsers(); } public static void UpdateUsers() { using (ErpBaseContext db = new ErpBaseContext()) { UserDic = db.SystemUsers.AsNoTracking().Where(o => o.State != 1).ToDictionary(n => n.Id); } MemoryCacheProvider.Default.FlushAll(); } public static List GetUsersByPosition() { using (var db = new ErpBaseContext()) { return db.SystemUsers.Where(a => (a.AccountPost & (int)AccountPostEnum.交易员) > 0).ToList(); } } public static bool HasRightForVariety(int roleId) { if (roleId > 0) { var roleCredit = TradeRightProvider.GetRoleCredits(new[] { roleId }).FirstOrDefault(); return roleCredit != null && (roleCredit.IsAll == true || roleCredit.VarietyIdsInt.Any()); } return false; } public static SystemUser GetById(int id) { if (UserDic == null) { UpdateUsers(); } return UserDic.TryGetValue(id, out var user) ? user : null; } /// /// 根据用户ID查找所属业务组(默认返回空字符串) /// public static string GetUserGroup(string userId) { if (UserDic == null) { UpdateUsers(); } return int.TryParse(userId, out int uid) ? GetUserGroup(uid) : string.Empty; } /// /// 根据用户ID查找所属业务组(默认返回空字符串) /// public static string GetUserGroup(int id) { if (ConsUserGroup.HasGroup && id > 0) { if (UserDic == null) { UpdateUsers(); } return UserDic.TryGetValue(id, out var user) ? user?.UserGroup ?? string.Empty : string.Empty; } return string.Empty; } public static IEnumerable Where(Func predicate) { if (predicate is null) { throw new ArgumentNullException(nameof(predicate)); } if (UserDic == null) { UpdateUsers(); } return UserDic.Values.Where(predicate); } public static SystemUser FirstOrDefault(Func predicate) { if (predicate is null) { throw new ArgumentNullException(nameof(predicate)); } if (UserDic == null) { UpdateUsers(); } return UserDic.Values.FirstOrDefault(predicate); } public static string GetNameById(int? id) { return id == null ? string.Empty : GetById(id.Value)?.Name ?? string.Empty; } public static List GetSystemsByUserId() { using (var db = new ErpBaseContext()) { return db.SystemUsers.Where(a => a.State == 0).ToList(); } } public static void SetUserVariety(int UserId, string VarietyIds) { using (var db = new ErpBaseContext()) { var systemUser = db.SystemUsers.Where(a => a.State == 0 && a.Id == UserId).FirstOrDefault(); systemUser.VarietyIds = VarietyIds ?? string.Empty; db.SaveChanges(); } } public static List GetRolesByUserId(int userId) { string cacheKey = string.Format("GetRolesByUserId{0}", userId); var list = MemoryCacheProvider.Default.Get>(cacheKey); if (list != null) { return list; } using (var baseCon = new ErpBaseContext()) { var query = from usserRole in baseCon.RoleUsers join role in baseCon.Roles.AsNoTracking() on usserRole.RoleId equals role.Id where usserRole.UserId == userId select role; list = query.ToList(); MemoryCacheProvider.Default.Set(cacheKey, list, DateTime.Now.AddMinutes(2)); return list; } } /// /// 当前登录人是否是交易员 /// /// public static bool IsTradeOfCurrentLogin(int userId) { if ((UserBLL.GetAccountPostEnum(userId) & (int)AccountPostEnum.交易员) > 0) { return true; } else { return false; } } /// /// 1 客户经理,2 交易员 ,3 客户经理+交易员 /// /// /// public static int GetAccountPostEnum(int UserId) { using (var basedb = new ErpBaseContext()) { return basedb.SystemUsers.FirstOrDefault(a => a.Id == UserId && a.State == 0)?.AccountPost ?? 0; } } public static List GetNotChildrenSystemUsers(int Id) { var basedb = new ErpBaseContext(); var systemUserAll = basedb.SystemUsers.Where(a => a.State == 0).AsQueryable().ToList(); var chlidrens = GetChildrenSystemUsers(Id, true); if (chlidrens.Any()) { var rootUser = chlidrens.Where(a => a.Id == Id).FirstOrDefault(); if (chlidrens.Any(a => a.Id == rootUser.ParentId)) { var parentUser = chlidrens.Where(a => a.Id == rootUser.ParentId).FirstOrDefault(); chlidrens.Remove(parentUser); } systemUserAll.RemoveAll(a => chlidrens.Any(b => b.Id == a.Id)); } return systemUserAll; } public static List GetChildrenSystemUsers(int parentId, bool IsParent) { using (var basedb = new ErpBaseContext()) { var systemUserAll = basedb.SystemUsers.Where(a => a.State == 0).AsQueryable().ToList(); var rootUser = systemUserAll.Where(a => a.Id == parentId).FirstOrDefault(); if (rootUser == null) { throw new ServiceException("当前账号不存在"); } List systemUsers = new List(); systemUsers.Add(rootUser); if ((rootUser.ParentId ?? 0) != 0 && IsParent) { var parentUser = systemUserAll.Where(a => a.Id == rootUser.ParentId).FirstOrDefault(); if (parentUser != null) { systemUsers.Add(parentUser); } } FoundChildNode(systemUserAll, systemUsers, new List() { rootUser }); return systemUsers; } } public static void FoundChildNode(List all, List systemUsers, List items) { List systemUserChilds = all.Where(c => items.Any(a => a.Id == c.ParentId)).ToList(); if (systemUserChilds.Any()) { systemUsers.AddRange(systemUserChilds); FoundChildNode(all, systemUsers, systemUserChilds); } } public SearchListResult SearchSystemUserList(SystemUserReq req) { using (var db = new ErpBaseContext()) { var predicate = PredicateBuilder.True(); if (!string.IsNullOrWhiteSpace(req.Ids)) { predicate = predicate.And(u => req.IdList.Contains(u.Id)); } if (!string.IsNullOrWhiteSpace(req.DepartmentIds)) { predicate = predicate.And(u => db.DepartmentUsers.Any(n => n.UserId == u.Id && req.DepartmentIdList.Contains(n.DepartmentId))); } if (!string.IsNullOrWhiteSpace(req.RoleIds)) { predicate = predicate.And(u => db.RoleUsers.Any(n => n.UserId == u.Id && req.RoleIdList.Contains(n.RoleId))); } if (req.State.HasValue) { predicate = predicate.And(u => u.State == req.State.Value); } if (!string.IsNullOrWhiteSpace(req.UserGroup)) { predicate = predicate.And(u => u.UserGroup == req.UserGroup); } var query = from source in db.SystemUsers.Where(predicate) select new ViewUser { id = source.Id, LoginName = source.LoginName, Name = source.Name, Email = source.Email, Tel = source.Tel, QQ = source.QQ, Mobile = source.Mobile, BondIP = source.BondIP, DepartmentId = 0, RoleId = 0, State = source.State, UserGroup = source.UserGroup, AccountPost = source.AccountPost + "", OaAccount=source.OaAccount }; var result = query.OrderBy(u => u.id).ToSearchList(req); var resultList = new List(); Func departmentQuery = (userId) => { var departQuery = from departUser in db.DepartmentUsers join depart in db.Departments on departUser.DepartmentId equals depart.Id where departUser.UserId == userId select depart.Name; return string.Join(",", departQuery.Distinct()); }; Func roleQuery = (userId) => { var rQuery = from roleUser in db.RoleUsers join role in db.Roles on roleUser.RoleId equals role.Id where roleUser.UserId == userId select role.Name; return string.Join(",", rQuery.Distinct()); }; foreach (var r in result.rows) { r.Departments = departmentQuery(r.id); r.Roles = roleQuery(r.id); r.AccountPost = ToAccountPost(Convert.ToInt32(r.AccountPost)); } return result; } } public string ToAccountPost(int AccountPost) { if (AccountPost == 0) { return string.Empty; } switch (AccountPost) { case 1: return "对冲交易询价对象"; case 2: return "非对冲交易询价对象"; default: return "对冲交易询价对象,非对冲交易询价对象"; } } public static void AddDefaultUser() { using (var db = new ErpBaseContext()) { var dbRole = db.Roles.FirstOrDefault(m => m.Name == "权限管理员"); if (dbRole == null) { dbRole = new Role() { Name = "权限管理员", Remark = "初始角色", Position = "[]", OptDate = DateTime.Now }; db.Roles.Add(dbRole); } SystemUser dbUser = db.SystemUsers.FirstOrDefault(m => m.LoginName == "superA"); if (dbUser == null) { dbUser = new SystemUser { VarietyIds = string.Empty, LoginName = "superA" }; db.SystemUsers.Add(dbUser); } else { db.RoleUsers.RemoveRange(db.RoleUsers.Where(o => o.UserId == dbUser.Id)); } dbUser.State = 0; dbUser.Name = "初始用户"; dbUser.Password = DataHelper.EncryptPassword(dbUser.LoginName.ToLower(), "Abc12345!"); dbUser.RoleType = dbRole.Id.ToString(); db.SaveChanges(); RoleUser roleUser = new RoleUser(); roleUser.UserId = dbUser.Id; roleUser.RoleId = dbRole.Id; db.RoleUsers.Add(roleUser); db.SaveChanges(); } } /// /// 根据权限查询用户信息 /// 例如:var customerManagerFirst = UserBLL.GetSystemUserByFunction("担任客户经理") /// /// /// public static List GetSystemUserByFunction(string fName) { var users = new List(); using (var db = new ErpBaseContext()) { users = (from a in db.SystemUsers join b in db.RoleUsers on a.Id equals b.UserId join o in db.RoleFunctions on b.RoleId equals o.RoleId join p in db.Functions on o.FunctionId equals p.Id where p.Name == fName && a.State != 1 select a).Distinct().ToList(); return users; } } public static SearchListResult GetSystemUserVariety(SystemUserVarietyReq req) { List systemUserVarieties = new List(); using (var db = new ErpBaseContext()) { var query = db.SystemUsers.Where(a => a.State == 0 && !string.IsNullOrEmpty(a.VarietyIds)).AsQueryable(); if (req.UserId != 0) { query = query.Where(a => a.Id == req.UserId); } if (req.VarietyIds != null && req.VarietyIds.Any()) { query = query.Where(a => req.VarietyIds.Any(b => a.VarietyIds.Contains(b + ""))); } var SystemUsersList = query.OrderBy(a => a.Id).ToSearchList(req); foreach (var users in SystemUsersList.rows) { List varietyNames = new List(); if (users.VarietyIdList.Any()) { users.VarietyIdList.ForEach(a => { var variety = DataCacheProvider.GetVarietyDataSource().GetData(a); if (variety != null) { varietyNames.Add(variety.VarietyName); } }); } systemUserVarieties.Add(new SystemUserVariety { UserId = users.Id, UserName = users.Name, VarietyId = users.VarietyIds, VarietyName = varietyNames.Any() ? string.Join(",", varietyNames) : "无" }); } return new SearchListResult(SystemUsersList, systemUserVarieties); } } /// /// 为空代表所有品种均可使用 /// 为0代表没有品种权限 /// /// /// public static IEnumerable GetUserVarietyIds(int userId) { using (var db = new ErpBaseContext()) { var user = db.SystemUsers.Where(a => a.State == 0 && a.Id == userId).FirstOrDefault(); if (user is null) { throw new ServiceException("未找到当前交易员信息"); } if (user.VarietyIdList.Any()) { return user.VarietyIdList; } return DataCacheProvider.GetVarietyDataSource().AsQueryable().Select(x => x.id); } } /// /// 获取用户审批组id /// /// /// public static int GetApprovalProcessGroup(int userId) { int groupId = 0; using (var db = new ErpBaseContext()) { var query = db.approvalgroupmembers.FirstOrDefault(x => x.memberId == userId); if (query != null) { groupId = query.groupId; } } return groupId; } /// /// 获取审批组用户 /// /// /// public static List GetApprovalProcessGroupUser(IEnumerable groupId) { List userIds = null; using (var db = new ErpBaseContext()) { userIds = db.approvalgroupmembers.Where(x => groupId.Contains(x.groupId)).Select(x => x.memberId).ToList(); } return userIds; } } }