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();
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;
}
}
}