using Ewide.Core; using Furion; using Furion.DatabaseAccessor; using Furion.DependencyInjection; using RoadFlow.Utility; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace RoadFlow.Data { public class Organize:IOrganize, ITransient { private readonly IRepository _sysUserRep = App.GetService>(); // 用户表仓储 private readonly IRepository _sysOrgRep = App.GetService>(); private readonly IRepository _sysEmpRep = App.GetService>(); private readonly IRepository _sysEmpExtOrgPosRep = App.GetService>(); private readonly IUserManager _userManager = App.GetService(); /// /// 根据ID字符串得到所有人员ID /// /// u_人员,id,w_工作且,r_兼职 /// 逗号分开的ID public string GetAllUsersId(string idString) { var users = GetAllUsers(idString); StringBuilder stringBuilder = new StringBuilder(); foreach (var user in users) { stringBuilder.Append(user.Id); stringBuilder.Append(","); } return stringBuilder.ToString().TrimEnd(','); } /// /// 得到一个机构下所有人员 /// /// 机构ID /// 是否包含兼任人员 /// public List GetAllUsers(string id, bool hasPartTime = true) { if (!string.IsNullOrEmpty(id)&&id.StartsWith(IOrganize.PREFIX_USER)) return _sysUserRep.DetachedEntities.Where(x => x.Id == id.RemoveUserPrefix()).ToList(); var allChilds = GetAllChilds(id, true); List orgids = new List(); foreach (var child in allChilds) { orgids.Add(child.Id); } List userIds = new List(); var empList =_sysEmpRep.DetachedEntities.Where(x => orgids.Contains(x.OrgId)).ToList(); foreach (var emp in empList) userIds.Add(emp.Id); if (hasPartTime) { var empExtList = _sysEmpExtOrgPosRep.DetachedEntities.Where(x => orgids.Contains(x.SysOrgId)).ToList(); foreach (var emp in empExtList) userIds.Add(emp.SysEmpId); } return _sysUserRep.DetachedEntities.Where(x => userIds.Contains(x.Id)).ToList(); } /// /// 得到所有下级组织机构 /// /// /// 是否包含自己 /// public List GetAllChilds(string id, bool isMe = false) { List organizes = new List(); var org = Get(id); if (null == org) { return organizes; } if (isMe) { organizes.Add(org); } var all = _sysOrgRep.DetachedEntities.ToList();//GetAll(); AddChilds(org, organizes, all); return organizes; } private void AddChilds(SysOrg organize, List organizes, List all) { if (null == organize) { return; } var childs = all.FindAll(p => p.Pid == organize.Id).OrderBy(p => p.Sort).ToList(); foreach (var child in childs) { organizes.Add(child); AddChilds(child, organizes, all); } } /// /// 根据ID查询一个组织机构 /// /// /// public SysOrg Get(string id) { return _sysOrgRep.DetachedEntities.FirstOrDefault(x=>x.Id ==id); } /// /// 根据JSON字符串得到组织机构选择属性 /// /// 例:{"dept":"1","station":"0"} /// dept="1" station="0" public string GetOrganizeAttrString(string json) { Newtonsoft.Json.Linq.JObject jObject = null; try { jObject = Newtonsoft.Json.Linq.JObject.Parse(json); } catch { } if (null == jObject) { return string.Empty; } StringBuilder stringBuilder = new StringBuilder(); string unit = jObject.Value("unit"); string dept = jObject.Value("dept"); string station = jObject.Value("station"); string user = jObject.Value("user"); string more = jObject.Value("more"); string group = jObject.Value("group"); string role = jObject.Value("role"); string rootid = jObject.Value("rootid"); stringBuilder.Append(" unit=\"" + (unit.IsNullOrWhiteSpace() ? "0" : unit) + "\""); stringBuilder.Append(" dept=\"" + (dept.IsNullOrWhiteSpace() ? "0" : dept) + "\""); stringBuilder.Append(" station=\"" + (station.IsNullOrWhiteSpace() ? "0" : station) + "\""); stringBuilder.Append(" user=\"" + (user.IsNullOrWhiteSpace() ? "0" : user) + "\""); stringBuilder.Append(" more=\"" + (more.IsNullOrWhiteSpace() ? "0" : more) + "\""); stringBuilder.Append(" group=\"" + (group.IsNullOrWhiteSpace() ? "0" : group) + "\""); stringBuilder.Append(" role=\"" + (role.IsNullOrWhiteSpace() ? "0" : role) + "\""); stringBuilder.Append(" rootid=\"" + (rootid.IsNullOrWhiteSpace() ? "" : rootid) + "\""); return stringBuilder.ToString(); } /// /// 根据ID字符串得到名称 /// /// 逗号分开的人员ID,机构ID,工作组ID等 /// 多个名称之前的分隔字符 /// public string GetNames(string idString, string splitChar = "、") { if (idString.IsNullOrWhiteSpace()) { return ""; } StringBuilder stringBuilder = new StringBuilder(); foreach (string id in idString.Split(',')) { if (id.IsGuid(out Guid orgId)) { stringBuilder.Append(_sysOrgRep.DetachedEntities.FirstOrDefault(x => x.Id == id)?.Name); stringBuilder.Append(splitChar); } else if (id.StartsWith(IOrganize.PREFIX_USER)) { stringBuilder.Append(_sysUserRep.DetachedEntities.FirstOrDefault(x=>x.Id==id.RemoveUserPrefix())?.Name); stringBuilder.Append(splitChar); } else if (id.StartsWith(IOrganize.PREFIX_RELATION)) { stringBuilder.Append(_sysUserRep.DetachedEntities.FirstOrDefault(x => x.Id == id.RemoveUserRelationPrefix())?.Name); stringBuilder.Append(splitChar); } else if (id.StartsWith(IOrganize.PREFIX_WORKGROUP)) { /* 无workgroup stringBuilder.Append(workGroup.GetName(id.RemoveWorkGroupPrefix().ToGuid())); stringBuilder.Append(splitChar); */ } } return stringBuilder.ToString().TrimEnd(splitChar.ToCharArray()); } /// /// 得到一个人员的主要组织显示 /// /// 人员ID /// 是否显示根 /// public string GetOrganizeMainShowHtml(string id, bool isShowRoot = true) { var emp =_sysEmpRep.DetachedEntities.FirstOrDefault(x => x.Id == id); if (emp == null) return ""; var org = _sysOrgRep.DetachedEntities.FirstOrDefault(x=>x.Id==emp.OrgId); string[] pararr = org.Pids.TrimStart('[').TrimEnd(',',']').Split("],["); var parents = _sysOrgRep.DetachedEntities.Where(x => pararr.Contains(x.Id)); StringBuilder sb = new StringBuilder(); var tmp = org; while (tmp.Pid != "00000000 - 0000 - 0000 - 0000 - 000000000000") { sb.Insert(0, "\\" + tmp.Name); tmp = parents.FirstOrDefault(x => x.Id == tmp.Pid); } if(isShowRoot) sb.Insert(0, tmp.Name); return sb.ToString(); } /// /// 得到一个人员的主要组织显示 /// /// 人员ID /// 是否显示根 /// public Dictionary GetOrganizeMainShowHtml(IEnumerable ids, bool isShowRoot = true) { var emps =_sysEmpRep.DetachedEntities.ToList(); var orgs = _sysOrgRep.DetachedEntities.ToList(); Dictionary rtn = new Dictionary(); foreach (string id in ids) { var emp =emps.FirstOrDefault(x => x.Id == id); if (emp == null) rtn.Add(id, ""); else { string orgId = emp.OrgId; var org =orgs.FirstOrDefault(x => x.Id == orgId); if (org == null) { rtn.Add(id, ""); continue; } string[] pararr = org.Pids.TrimStart('[').TrimEnd(',', ']').Split("],["); var parents = orgs.Where(x => pararr.Contains(x.Id)); StringBuilder sb = new StringBuilder(); var tmp = org; while (tmp.Pid != "00000000 - 0000 - 0000 - 0000 - 000000000000") { sb.Insert(0, "\\" + tmp.Name); tmp = parents.FirstOrDefault(x => x.Id == tmp.Pid); } if(isShowRoot) sb.Insert(0, tmp.Name); rtn.Add(id, sb.ToString()); } } return rtn; } } }