using DocumentServiceAPI.Application.Repository; using DocumentServiceAPI.Application.UserAndLogin.Services.Interfaces; using DocumentServiceAPI.Application.UserAndLogin.ViewMode; using DocumentServiceAPI.Model; using DocumentServiceAPI.Model.cyDocumentModel; using DocumentServiceAPI.Model.Permissions; using DocumentServiceAPI.Model.UserInfoModel; using DocumentServiceAPI.Services.IService; using DocumentServiceAPI.Utility; using Furion.Logging.Extensions; using MapsterMapper; using SqlSugar.Extensions; using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Text; using System.Threading.Tasks; namespace DocumentServiceAPI.Application.UserAndLogin.Services { /// /// 登录验证服务 /// public class UserService : IUserService, IScoped { /// /// TenantPermissions在Redis中的键值 /// public const string TenantPermissions_RedisKey = "TenantPermissionsKen:"; private ISqlSugarClient _db { get; set; } private EmployeeRepository _employeeRepository{ get; set; } private IMapper _mapper { get; set; } private IRedisCacheService _cacheService { get; set; } public UserService(ISqlSugarClient db, EmployeeRepository employeeRepository, IMapper mapper , IRedisCacheService cacheService) { _db = db; _employeeRepository = employeeRepository; _mapper = mapper; _cacheService = cacheService; } /// /// 员工详情 /// /// /// /// public async Task GetEmployeeInfo(int ID, int TenantID) { var ret = await _db.Queryable((ei, eiat, ti) => new JoinQueryInfos( JoinType.Right, ei.Id == eiat.EmployeeID, //左连接 左链接 左联 JoinType.Right, ti.Id == eiat.TenantID )).Where((ei, eiat, ti) => ei.Id == ID && TenantID == ti.Id) .Select(expression: (ei, eiat, ti) => new EmployeeTenantInfo { _employeeInfo = ei, _tenantInfo = ti }).SingleAsync(); return ret; } /// /// 获取Jwt相关信息 /// public JwtInfo GetJwtInfo() { JwtInfo jwtInfo = new JwtInfo(); jwtInfo.LogInSource = (LogInFrom)(App.User?.FindFirstValue("loginfrom")?.ObjToInt() ?? 0); jwtInfo.EID = App.User?.FindFirstValue("eid")?.ObjToInt(); jwtInfo.UID = App.User?.FindFirstValue("uid")?.ObjToInt(); jwtInfo.TEID = App.User?.FindFirstValue("teid")?.ObjToInt(); var guid = App.User?.FindFirstValue("jid"); jwtInfo.JID = string.IsNullOrEmpty(guid) ? null: new Guid(guid); return jwtInfo; } /// /// 获取单位列表 /// /// public async Task> GetUserUnitList(int tid ) { var list = await _db.Queryable() .Where((tu) => tu.TenantId == tid && tu.IsEn == true && tu.IsDeled != true) .Select((tu) => new UnitVM { UnitID = tu.UnitId, UnitName = tu.UnitName, Remark = tu.Remark, UnitLogo = tu.UnitLogo, }).WithCache(10) .ToListAsync(); return list; } /// /// 根据账号获取 Tender 列表 /// /// /// public async Task> GetUserTenderList(string ItCode) { var tentlist= await _db.Queryable((ti, et, ei) => new JoinQueryInfos ( JoinType.Right, ti.Id == et.TenantID, //左连接 左链接 左联 JoinType.Right, ei.EmployeeId == et.EmployeeID ) ) .Where((ti, et, ei) => ( ei.UserName == ItCode) && (ti.IsEn == true) && (ti.IsDel != true) && (ei.IsWork == null || ei.IsWork == 1)) .Select((ti, et, ei) => new TenderVM { EmployeeID = ei.EmployeeId, Description = ti.Description, ItCode = ItCode, Name = ti.Name, TenderId = ti.Id } ).WithCache( 10).ToListAsync(); //不再选择租户 //var ten = await _db.Queryable().Where(x => x.IsEn == true && x.IsDel != true && x.ItCode == ItCode) // .Select(x => new TenderVM // { // Description = x.Description, // ItCode = ItCode, // Name = x.Name, // TenderId = x.Id, // IsTender = true // } // ).WithCache(10).ToListAsync() ; //ten.AddRange(tentlist); return tentlist; } /// /// 检查密码是否登录 /// /// 租户ID /// 员工ID /// 密码 /// public async Task CheckPsw(int TenantID, int? employeeID, string PsW) { if (employeeID == null) { var psw = await _db.Queryable().Where(x => x.Id == TenantID).Select(x => x.PsW).SingleAsync(); if (PsW == psw) return true; } else { var psw = await _db.Queryable((ei, et, ti) => new JoinQueryInfos ( JoinType.Left, ei.EmployeeId == et.EmployeeID, //左连接 左链接 左联 JoinType.Left, ti.Id == et.TenantID ) ).Where((ei, et, ti) => ei.EmployeeId == employeeID && ti.Id == TenantID ) .Select((ei, et, ti) => ei.UserPassWord) .SingleAsync(); if (PsW == psw) return true; } return false; } /// /// 获取用户详情,包括员工信息,租户信息,单位信息 /// /// 租户ID /// 员工ID /// 单位ID /// public async Task GetUserInfo(int? TenantID,int? EmployeeID,int? UnitID) { TenderInfoVM Tenant = null; EmployeeInfoVM Employee = null; if (TenantID != null) Tenant = await _db.Queryable().Where(x => x.Id == TenantID) .Select(x => new TenderInfoVM { Description = x.Description, Id = x.Id, ItCode = x.ItCode, Name = x.Name, ReMark = x.ReMark, }).WithCache(20).FirstAsync(); if (EmployeeID != null) Employee = await _db.Queryable().Where(x => x.EmployeeId == EmployeeID) .Select(x => new EmployeeInfoVM { AdviseFlag = x.AdviseFlag, CardPositive = x.CardPositive, CardPositiveSize = x.CardPositiveSize, CardPositiveVersionNo = x.CardPositiveVersionNo, EmployeeId = x.EmployeeId, EmployeeName = x.EmployeeName, Job = x.Job, LastUpdateName = x.LastUpdateName, UserName = x.UserName, IsLogin = x.IsLogin, }).WithCache(20).FirstAsync(); UnitInfoVM Unit = null; if (UnitID != null) Unit = await _db.Queryable().Where(x => x.UnitId == UnitID) .Select(x => new UnitInfoVM { FirmQualificationLevel = x.FirmQualificationLevel, Fax = x.Fax, CorporaterTechnicalPost= x.CorporaterTechnicalPost, LastUpdateName= x.LastUpdateName, Address = x.Address, AdviseFlag = x.AdviseFlag, BankNum = x.BankNum, BusinessContent = x.BusinessContent, BusinessLicense = x.BusinessLicense, CardPositive= x.CardPositive, CardPositiveSize= x.CardPositiveSize, CardPositiveVersionNo= x.CardPositiveVersionNo, ContactPerson= x.ContactPerson, ContactPhone= x.ContactPhone, CorporatePhone= x.CorporatePhone, Corporater= x.Corporater, CorporaterPost= x.CorporaterPost, CreatTime= x.CreatTime, Mechanicer= x.Mechanicer, MiddleStaff= x.MiddleStaff, OpenBank= x.OpenBank, OrgStructure= x.OrgStructure, PrimaryStaff= x.PrimaryStaff, ProjectManager= x.ProjectManager, RegMoney= x.RegMoney, Remark= x.Remark, UnitId= x.UnitId, TechnicalLeader= x.TechnicalLeader, SeniorStaff= x.SeniorStaff, StaffCount= x.StaffCount, TechnicalPhone= x.TechnicalPhone, TechnicalPost= x.TechnicalPost, UnitLogo= x.UnitLogo, UnitLogoSize= x.UnitLogoSize, UnitLogoVersionNo= x.UnitLogoVersionNo, UnitName= x.UnitName, UnitType= x.UnitType, WebUrl= x.WebUrl, ZipCode= x.ZipCode, }).WithCache(20).FirstAsync(); if (TenantID != null) { //add by zyyao 2023-10-17 租户信息增加 var permissions = _db.Queryable().Where(x => x.IsDel == false && x.IsEn == true && x.TenantId == TenantID).ToList(); var permissions1 = permissions.Where(x => x.PermissionsType == TenantPermissionsType.Manage).FirstOrDefault(); if (permissions1 != null && Tenant!=null) { Tenant.UnitMaxCount = permissions1.UnitMaxCount; Tenant.EmployeeMaxCount = permissions1.EmployeeMaxCount; Tenant.WendangOverTimeCount = permissions1.OverTime.Subtract(DateTime.Now).Days+1; } var permissions2 = permissions.Where(x => x.PermissionsType == TenantPermissionsType.Document).FirstOrDefault(); if (permissions2 != null && Tenant != null) { Tenant.BiaoshuOverTimeCount = permissions2.OverTime.Subtract(DateTime.Now).Days + 1; } } return new RetUserInfo { EmployeeInfo = Employee, TenderInfo = Tenant, UnitInfo = Unit }; } /// /// 获取员工列表 /// /// /// /// public async Task> postEmployeeList( EmployeePageSearch page) { var a = GetJwtInfo(); if(a.EID!=null) throw Oops.Oh($"没有权限"); SqlSugar.PageModel pg = new SqlSugar.PageModel(); pg.PageSize = page.PageSize; pg.PageIndex = page.PageIndex; RefAsync total = 0; PageResult result = new PageResult(); result.Items = await _db.Queryable((et, ei) => new JoinQueryInfos(JoinType.Left, et.EmployeeID==ei.EmployeeId )).Where((ei,et)=>ei.TenantID==a.TEID) .Select((ei,et)=>new EmployeeInfoVM { EmployeeId = et.EmployeeId, AdviseFlag=et.AdviseFlag, CardPositive=et.CardPositive, CardPositiveSize=et.CardPositiveSize, CardPositiveVersionNo=et.CardPositiveVersionNo, EmployeeName=et.EmployeeName, IsWork=et.IsWork, Job=et.Job, LeaveTime=et.LeaveTime, Phone=et.Phone, UserId=et.UserId, UserName=et.UserName, }).MergeTable().OrderBy(x=>x.EmployeeId).ToPageListAsync(page.PageIndex,page.PageSize, total); result.TotalCount = pg.TotalCount; return result; } public async Task UpEmployee(EmployeeInfoVM vm) { var jwtinfo = GetJwtInfo(); if (jwtinfo.EID != null) throw Oops.Oh($"没有权限"); var info = await GetUserInfo(jwtinfo.TEID, null, null); Document_EmployeeInfo a = _mapper.Map(vm); a.LastUpdateName = info.EmployeeInfo.UserName; a.LastUpdateTime = DateTime.Now; return await _employeeRepository.UpdateAsync(a); } public async Task InEmployee(EmployeeInfoVM vm) { var jwtinfo = GetJwtInfo(); if (jwtinfo.EID != null) throw Oops.Oh($"没有权限"); Document_EmployeeInfo a = _mapper.Map(vm); var info = await GetUserInfo(jwtinfo.TEID, null, null); EmployeeAtTenant elt = new EmployeeAtTenant { CreatBy = info.TenderInfo.ItCode, CreatTime = DateTime.Now, TenantID = info.TenderInfo.Id, }; try { await _employeeRepository.AsTenant().BeginTranAsync(); var jwtId= await _employeeRepository.InsertReturnIdentityAsync(a); elt.EmployeeID = jwtId; await _db.Insertable(elt).ExecuteCommandAsync(); await _employeeRepository.AsTenant().CommitTranAsync(); } catch (Exception e) { await _employeeRepository.AsTenant().RollbackTranAsync(); //写日志 $" 插入新员工失败, 错误消息:{e.Message} \r\n 堆栈错误:{e.StackTrace}" .LogInformation(); throw Oops.Oh("新增失败"); } return await _employeeRepository.InsertAsync(a); } /// /// 租户是否已经超时过期 /// /// 租户ID /// true 代表没有超时有权限使用,false 代表没有权限使用了 public async Task TenderHasPermissions( int TenderID) { var Key = TenantPermissions_RedisKey + TenderID.ToString(); var tp= _cacheService.Get(TenantPermissions_RedisKey+ TenderID.ToString()); if(tp == null ) { tp= await _db.Queryable().Where(x=>x.TenantId == TenderID).FirstAsync(); if (tp != null) _cacheService.Add(Key, tp, 300); else return false; } if (tp.OverTime > DateTime.Now) return true; return false; } /// /// 租户是否已经超时过期 根据token中包含的TID 识别是否有权限 /// /// true 代表没有超时有权限使用,false 代表没有权限使用了 public async Task TenderHasPermissions() { var jwtinfo= GetJwtInfo(); if(jwtinfo != null&&jwtinfo.TEID!=null ) { var Key = TenantPermissions_RedisKey + jwtinfo.TEID.ToString(); var tp = _cacheService.Get(TenantPermissions_RedisKey + jwtinfo.TEID.ToString()); if (tp == null) { tp = await _db.Queryable().Where(x => x.TenantId == jwtinfo.TEID).FirstAsync(); if (tp == null) _cacheService.Add(Key, tp, 300); else return false; } if (tp.OverTime > DateTime.Now) return true; return false; } return false; } } }