using FlexJobApi.Core; using Furion.DatabaseAccessor; using Furion.DistributedIDGenerator; using Furion.FriendlyException; using Mapster; using MediatR; using Microsoft.AspNetCore.Components.Forms; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.UserServer.Application { /// /// 灵工查询处理器 /// public class EnterpriseEmployeeQueryHandler( IRepository rep, IRepository repContractTemplate, IRepository repEnterpriseEmployeeContract, IMediator mediator ) : IRequestHandler, IRequestHandler, IRequestHandler, IRequestHandler { private readonly IRepository rep = rep; private readonly IRepository repContractTemplate = repContractTemplate; private readonly IRepository repEnterpriseEmployeeContract = repEnterpriseEmployeeContract; private readonly IMediator mediator = mediator; /// /// 查询灵工分页列表数据 /// /// /// /// public async Task Handle(GetEnterpriseEmployeesQuery request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); var q = rep.AsQueryable().AsNoTracking() .OrderBy(it => it.CreatedTime) .Where(it => it.EnterpriseId == logier.EnterpriseId); if (request.Keywords.IsNotNull()) { q = q.Where(it => it.Name.Contains(request.Keywords) || it.ContactPhoneNumber.Contains(request.Keywords) || it.Identity.Contains(request.Keywords)); } if (request.CreatedTimeStart.HasValue && request.CreatedTimeEnd.HasValue) { q = q.Where(it => it.CreatedTime >= request.CreatedTimeStart.Value && it.CreatedTime <= request.CreatedTimeEnd.Value); } if (request.SignContractTimeStart.HasValue && request.SignContractTimeEnd.HasValue) { q = q.Where(it => it.UserSignContractTime >= request.SignContractTimeStart.Value && it.UserSignContractTime <= request.SignContractTimeEnd.Value || it.EnterpriseSignContractTime >= request.SignContractTimeStart.Value && it.EnterpriseSignContractTime <= request.SignContractTimeEnd.Value); } if (request.HireStatus.HasValue) { q = q.Where(it => it.TaskInfoUsers.Any(tu => tu.HireStatus == request.HireStatus)); } if (request.IsReal.HasValue) { q = q.Where(it => (it.UserId.HasValue && it.User.IsReal) == request.IsReal.Value); } if (request.UserSignContractStatus.HasValue) { if (logier.ClientType == EnumClientType.Wxmp) { switch (request.UserSignContractStatus.Value) { case EnumTaskUserSignContractStatus.Wait: q = q.Where(it => it.UserSignContractStatus == null || it.UserSignContractStatus == request.UserSignContractStatus); break; case EnumTaskUserSignContractStatus.Pass: q = q.Where(it => it.UserSignContractStatus == request.UserSignContractStatus && it.EnterpriseSignContractStatus == EnumTaskUserSignContractStatus.Pass); break; case EnumTaskUserSignContractStatus.Stop: q = q.Where(it => it.UserSignContractStatus == request.UserSignContractStatus); break; default: q = q.Where(it => it.UserSignContractStatus == request.UserSignContractStatus); break; } } else { q = q.Where(it => it.UserSignContractStatus == request.UserSignContractStatus); } } if (request.EnterpriseSignContractStatus.HasValue) { q = q.Where(it => it.EnterpriseSignContractStatus == request.EnterpriseSignContractStatus); } var s = q.Select(it => new GetEnterpriseEmployeesQueryResultItem { Id = it.Id, Avatar = it.User.Avatar, Name = it.Name, Identity = it.Identity, Gender = it.Gender, Age = it.Age, ContactPhoneNumber = it.ContactPhoneNumber, UserIsReal = it.User.IsReal == true, RealMethod = it.User.RealMethod, PersonalIdentityCode = it.User.PersonalIdentityCode, PersonalIdentityContent = it.User.PersonalIdentity.Content, EducationalBackgroundCode = it.User.EducationalBackgroundCode, EducationalBackgroundContent = it.User.EducationalBackground.Content, TaskCount = it.User.EnterpriseEmployees.SelectMany(ee => ee.TaskInfoUsers).Count(tu => tu.HireStatus == EnumTaskUserHireStatus.Pass), WorkSeniority = it.User.WorkSeniority, WorkExperience = it.User.WorkExperience, HireStatus = it.TaskInfoUsers.Any(tu => tu.HireStatus == EnumTaskUserHireStatus.Pass) ? EnumTaskUserHireStatus.Pass : it.TaskInfoUsers.Any(tu => tu.HireStatus == EnumTaskUserHireStatus.Refuse) ? EnumTaskUserHireStatus.Refuse : EnumTaskUserHireStatus.Wait, UserSignContractStatus = it.UserSignContractStatus, HireTime = it.TaskInfoUsers .OrderBy(tu => tu.HireTime) .Where(tu => tu.HireTime.HasValue) .Select(tu => tu.HireTime) .FirstOrDefault(), UserRealTime = it.User.RealTime, UserSignContractTime = it.UserSignContractTime, EnterpriseSignContractStatus = it.EnterpriseSignContractStatus, EnterpriseSignContractTime = it.EnterpriseSignContractTime, ContractUrl = it.ContractUrl, }); return await request.PageModel.GetPagedListAsync(s, cancellationToken); } /// /// 查询灵工详情 /// /// /// /// public async Task Handle(GetEnterpriseEmployeeQuery request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); var model = await rep.AsQueryable().AsNoTracking() .Where(it => it.Id == request.Id) .GetDetail(cancellationToken); if (request.TaskInfoId.HasValue) { model.ApplyTime = await rep.Change().AsQueryable().AsNoTracking() .Where(it => it.TaskInfoId == request.TaskInfoId && it.EnterpriseEmployeeId == request.Id) .Select(it => it.CreatedTime as DateTimeOffset?) .FirstOrDefaultAsync(cancellationToken); } else if (logier.Type == EnumUserType.Enterprise) { model.ApplyTime = await rep.Change().AsQueryable().AsNoTracking() .OrderBy(it => it.CreatedTime) .Where(it => it.TaskInfo.EnterpriseId == logier.EnterpriseId && it.EnterpriseEmployeeId == request.Id) .Select(it => it.CreatedTime as DateTimeOffset?) .FirstOrDefaultAsync(cancellationToken); } return model; } /// /// 查询个人用户签约列表 /// /// /// /// public async Task Handle(GetPersonalUserElectronSignsQuery request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); var q = rep.AsQueryable().AsNoTracking() .Where(it => it.UserId == logier.Id); if (request.UserSignContractStatus.HasValue) { if (request.UserSignContractStatus == EnumTaskUserSignContractStatus.Pass) { q = q.Where(it => it.UserSignContractStatus == EnumTaskUserSignContractStatus.Pass && it.EnterpriseSignContractStatus == EnumTaskUserSignContractStatus.Pass); } else { q = q.Where(it => it.UserSignContractStatus == request.UserSignContractStatus.Value); } } else { q = q.Where(it => it.UserSignContractStatus == EnumTaskUserSignContractStatus.Wait || it.UserSignContractStatus == EnumTaskUserSignContractStatus.Pass && it.EnterpriseSignContractStatus == EnumTaskUserSignContractStatus.Pass || it.UserSignContractStatus == EnumTaskUserSignContractStatus.Stop); } var s = q.Select(it => new GetPersonalUserElectronSignsQueryResultItem { Id = it.Id, EnterpriseName = it.Enterprise.EnterpriseName, UserSignContractStatus = it.UserSignContractStatus, }); return await request.PageModel.GetPagedListAsync(s, cancellationToken); } /// /// 查询个人用户签约详情 /// /// /// /// public async Task Handle(GetPersonalUserElectronSignQuery request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); if (request.Id.HasValue) { var model = await rep.AsQueryable().AsNoTracking() .Where(it => it.UserId == logier.Id && it.Id == request.Id) .GetDetail(); return model; } else if (request.Code.IsNotNull()) { var contractTemplate = await repContractTemplate.AsQueryable().AsNoTracking() .Where(it => it.Code == request.Code) .FirstOrDefaultAsync(); if (contractTemplate == null) throw Oops.Oh(EnumErrorCodeType.s404, "合同"); await mediator.Send(new CheckContractTemplateCommand { Id = contractTemplate.Id }, cancellationToken); var entity = await rep.AsQueryable() .Include(it => it.Enterprise) .Where(it => it.UserId == logier.Id && it.ContractTemplateId == contractTemplate.Id) .FirstOrDefaultAsync(); if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "灵工"); if (entity.UserSignContractStatus == null) { entity.ContractTemplateId = contractTemplate.Id; entity.UserSignContractStatus = EnumTaskUserSignContractStatus.Wait; entity.UserSignContractTime = null; entity.EnterpriseSignContractStatus = null; entity.EnterpriseSignContractTime = null; entity.ContractCode = $"{DateTime.Now:yyyyMMddHHmmss}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}"; entity.ContractUrl = null; var contract = new EnterpriseEmployeeContract { EnterpriseEmployeeId = entity.Id, ContractTemplateId = entity.ContractTemplateId, ContractCode = entity.ContractCode, UserSignContractStatus = entity.UserSignContractStatus, }; await repEnterpriseEmployeeContract.InsertAsync(contract); await rep.UpdateAsync(entity); } return new GetPersonalUserElectronSignQueryResult { Id = entity.Id, ContractCode = entity.ContractCode, ContractTemplateAccess = contractTemplate.Access, UserSignContractStatus = entity.UserSignContractStatus, Name = entity.Name, Identity = entity.Identity, ContactPhoneNumber = entity.ContactPhoneNumber, UserSignContractTime = entity.UserSignContractTime, EnterpriseEnterpriseName = entity.Enterprise.EnterpriseName, EnterpriseSignContractTime = entity.EnterpriseSignContractTime, ContractUrl = entity.ContractUrl, }; } else { throw Oops.Oh(EnumErrorCodeType.s400, "请填写灵工Id或合同模板编号"); } } } }