| | |
| | | using FlexJobApi.Core; |
| | | using Aop.Api.Domain; |
| | | using FlexJobApi.Core; |
| | | using Furion.DatabaseAccessor; |
| | | using Furion.DataValidation; |
| | | using Furion.FriendlyException; |
| | | using Mapster; |
| | | using MediatR; |
| | | using Microsoft.EntityFrameworkCore; |
| | | using System; |
| | |
| | | using System.Linq; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | using TaskInfo = FlexJobApi.Core.TaskInfo; |
| | | |
| | | namespace FlexJobApi.FlexJobServer.Application |
| | | { |
| | | /// <summary> |
| | | /// 任务雇佣查询处理器 |
| | | /// 任务人员查询处理器 |
| | | /// </summary> |
| | | public class TaskUserQueryHandler( |
| | | IRepository<TaskInfoUser> rep) |
| | | : IRequestHandler<GetTaskUsersQuery, GetTaskUsersQueryResult> |
| | | IRepository<TaskInfoUser> rep, |
| | | IRepository<TaskInfo> repTaskInfo |
| | | ) : |
| | | IRequestHandler<GetTaskUsersQuery, GetTaskUsersQueryResult>, |
| | | IRequestHandler<GetArrangeTaskUsersQuery, GetArrangeTaskUsersQueryResult>, |
| | | IRequestHandler<GetTaskUserHireStatusQuery, GetTaskUserHireStatusQueryResult>, |
| | | IRequestHandler<GetSettlementTaskUsersQuery, GetSettlementTaskUsersQueryResult> |
| | | { |
| | | private readonly IRepository<TaskInfoUser> rep = rep; |
| | | private readonly IRepository<TaskInfo> repTaskInfo = repTaskInfo; |
| | | |
| | | /// <summary> |
| | | /// 查询应聘报名分页列表信息 |
| | | /// B端查询应聘报名分页列表信息 |
| | | /// </summary> |
| | | /// <param name="request"></param> |
| | | /// <param name="cancellationToken"></param> |
| | |
| | | var q = rep.AsQueryable().AsNoTracking() |
| | | .OrderBy(it => it.CreatedTime) |
| | | .Where(it => it.TaskInfo.EnterpriseId == logier.EnterpriseId && it.TaskInfoId == request.Id); |
| | | if (request.Keywords.IsNotNull()) |
| | | { |
| | | q = q.Where(it => |
| | | it.EnterpriseEmployee.User.Name.Contains(request.Keywords) |
| | | || it.EnterpriseEmployee.User.Identity.Contains(request.Keywords) |
| | | || it.EnterpriseEmployee.User.PhoneNumber.Contains(request.Keywords)); |
| | | } |
| | | if (request.HireStatus.HasValue) |
| | | { |
| | | q = q.Where(it => it.HireStatus == request.HireStatus); |
| | | } |
| | | var s = q |
| | | .Select(it => new GetTaskUsersQueryResultItem |
| | | { |
| | | Id = it.Id, |
| | | EnterpriseEmployeeId = it.EnterpriseEmployeeId, |
| | | Avatar = it.EnterpriseEmployee.User.Avatar, |
| | | Name = it.EnterpriseEmployee.User.Name, |
| | | Identity = it.EnterpriseEmployee.User.Identity, |
| | | ContactPhoneNumber = it.EnterpriseEmployee.User.ContactPhoneNumber, |
| | | Gender = it.EnterpriseEmployee.User.Gender, |
| | | Age = it.EnterpriseEmployee.User.Age, |
| | | IsReal = it.EnterpriseEmployee.User.IsReal, |
| | | RealMethod = it.EnterpriseEmployee.User.RealMethod, |
| | | PersonalIdentityCode = it.EnterpriseEmployee.User.PersonalIdentityCode, |
| | | PersonalIdentityContent = it.EnterpriseEmployee.User.PersonalIdentity.Content, |
| | | EducationalBackgroundCode = it.EnterpriseEmployee.User.EducationalBackgroundCode, |
| | | EducationalBackgroundContent = it.EnterpriseEmployee.User.EducationalBackground.Content, |
| | | TaskCount = it.EnterpriseEmployee.TaskInfoUsers.Count(tu => tu.HireStatus == EnumTaskUserHireStatus.Pass), |
| | | WorkSeniority = it.EnterpriseEmployee.User.WorkSeniority, |
| | | WorkExperience = it.EnterpriseEmployee.User.WorkExperience, |
| | | HireStatus = it.HireStatus |
| | | }); |
| | | return await request.PageModel.GetPagedListAsync<GetTaskUsersQueryResult, GetTaskUsersQueryResultItem>(s, cancellationToken); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// B端查询人员安排分页列表信息 |
| | | /// </summary> |
| | | /// <param name="request"></param> |
| | | /// <param name="cancellationToken"></param> |
| | | /// <returns></returns> |
| | | public async Task<GetArrangeTaskUsersQueryResult> Handle(GetArrangeTaskUsersQuery request, CancellationToken cancellationToken) |
| | | { |
| | | var logier = JwtUtils.GetCurrentLogier(); |
| | | var q = rep.AsQueryable().AsNoTracking() |
| | | .OrderBy(it => it.CreatedTime) |
| | | .Where(it => |
| | | it.TaskInfo.EnterpriseId == logier.EnterpriseId |
| | | && it.TaskInfoId == request.Id |
| | | && it.HireStatus == EnumTaskUserHireStatus.Pass |
| | | && it.EnterpriseEmployee.UserSignContractStatus == EnumTaskUserSignContractStatus.Pass |
| | | && it.EnterpriseEmployee.EnterpriseSignContractStatus == EnumTaskUserSignContractStatus.Pass); |
| | | if (request.ArrangeStatus.HasValue) |
| | | { |
| | | q = q.Where(it => it.ArrangeStatus == request.ArrangeStatus); |
| | | } |
| | | if (request.Keywords.IsNotNull()) |
| | | { |
| | | q = q.Where(it => |
| | | it.EnterpriseEmployee.User.Name.Contains(request.Keywords) |
| | | || it.EnterpriseEmployee.User.Identity.Contains(request.Keywords) |
| | | || it.EnterpriseEmployee.User.PhoneNumber.Contains(request.Keywords)); |
| | | } |
| | | var s = q |
| | | .Select(it => new GetArrangeTaskUsersQueryResultItem |
| | | { |
| | | Id = it.Id, |
| | | Avatar = it.EnterpriseEmployee.User.Avatar, |
| | |
| | | PersonalIdentityContent = it.EnterpriseEmployee.User.PersonalIdentity.Content, |
| | | EducationalBackgroundCode = it.EnterpriseEmployee.User.EducationalBackgroundCode, |
| | | EducationalBackgroundContent = it.EnterpriseEmployee.User.EducationalBackground.Content, |
| | | TaskCount = it.EnterpriseEmployee.User.TaskInfoUsers.Count(tu => tu.EnterpriseEmployee.HireStatus == EnumTaskUserHireStatus.Pass), |
| | | TaskCount = it.EnterpriseEmployee.TaskInfoUsers.Count(tu => tu.HireStatus == EnumTaskUserHireStatus.Pass), |
| | | WorkSeniority = it.EnterpriseEmployee.User.WorkSeniority, |
| | | WorkExperience = it.EnterpriseEmployee.User.WorkExperience, |
| | | HireStatus = it.EnterpriseEmployee.HireStatus |
| | | ArrangeStatus = it.ArrangeStatus |
| | | }); |
| | | return await request.PageModel.GetPagedListAsync<GetTaskUsersQueryResult, GetTaskUsersQueryResultItem>(s, cancellationToken); |
| | | return await request.PageModel.GetPagedListAsync<GetArrangeTaskUsersQueryResult, GetArrangeTaskUsersQueryResultItem>(s, cancellationToken); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 查询应聘报名人员录用状态 |
| | | /// </summary> |
| | | /// <param name="request"></param> |
| | | /// <param name="cancellationToken"></param> |
| | | /// <returns></returns> |
| | | public async Task<GetTaskUserHireStatusQueryResult> Handle(GetTaskUserHireStatusQuery request, CancellationToken cancellationToken) |
| | | { |
| | | var logier = JwtUtils.GetCurrentLogier(); |
| | | var q = rep.AsQueryable().AsNoTracking() |
| | | .Where(it => it.TaskInfoId == request.TaskInfoId); |
| | | if (logier.Type == EnumUserType.Personal) |
| | | { |
| | | q = q.Where(it => it.EnterpriseEmployee.UserId == request.UserId); |
| | | } |
| | | else if (request.UserId == null) |
| | | { |
| | | throw Oops.Oh(EnumErrorCodeType.s400, "请选择用户"); |
| | | } |
| | | else |
| | | { |
| | | q = q.Where(it => it.EnterpriseEmployee.UserId == request.UserId); |
| | | } |
| | | var model = await q |
| | | .Select(it => new GetTaskUserHireStatusQueryResult |
| | | { |
| | | HireStatus = it.HireStatus |
| | | }) |
| | | .FirstOrDefaultAsync(cancellationToken); |
| | | if (model == null) throw Oops.Oh(EnumErrorCodeType.s404, "报名信息"); |
| | | return model; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 查询结算名单分页列表数据 |
| | | /// </summary> |
| | | /// <param name="request"></param> |
| | | /// <param name="cancellationToken"></param> |
| | | /// <returns></returns> |
| | | public async Task<GetSettlementTaskUsersQueryResult> Handle(GetSettlementTaskUsersQuery request, CancellationToken cancellationToken) |
| | | { |
| | | var logier = JwtUtils.GetCurrentLogier(); |
| | | var list = new GetSettlementTaskUsersQueryResult(); |
| | | |
| | | list.Detail = await TaskInfoRepository.GetQueryable(repTaskInfo, true, logier) |
| | | .Where(it => it.Id == request.TaskInfoId) |
| | | .GetDetail<TaskInfo, GetSettlementTaskQueryResult>(); |
| | | |
| | | var q = rep.AsQueryable().AsNoTracking() |
| | | .Where(it => it.TaskInfoId == request.TaskInfoId); |
| | | list.Data = q |
| | | .Select(it => new GetSettlementTaskUsersQueryResultItem |
| | | { |
| | | Id = it.Id, |
| | | Name = it.EnterpriseEmployee.Name, |
| | | Identity = it.EnterpriseEmployee.Identity, |
| | | ContactPhoneNumber = it.EnterpriseEmployee.ContactPhoneNumber, |
| | | CheckReceiveStatus = it.CheckReceiveStatus, |
| | | Bank = it.Bank, |
| | | BankBranch = it.BankBranch, |
| | | ReceiveAccount = it.ReceiveAccount, |
| | | SettlementAmount = it.SettlementAmount, |
| | | ActualSettlementAmount = it.ActualSettlementAmount, |
| | | SettlementTime = it.SettlementTime, |
| | | SettlementStatus = it.SettlementStatus, |
| | | }) |
| | | .ToList(); |
| | | |
| | | var successList = new List<GetSettlementTaskUsersQueryResultExcelRow>(); |
| | | if (request.SettlementOrderUrl.IsNotNull()) |
| | | { |
| | | var models = await ExcelUtils.ImportExcelFromOSS<GetSettlementTaskUsersQueryResultExcelRow>(request.SettlementOrderUrl); |
| | | foreach (var model in models) |
| | | { |
| | | var errors = new List<string>(); |
| | | if (model.Name.IsNull()) |
| | | { |
| | | errors.Add("请填写姓名"); |
| | | } |
| | | if (model.Identity.IsNull()) |
| | | { |
| | | errors.Add("请填写身份证号"); |
| | | } |
| | | else if (!model.Identity.TryValidate(EnumValidationTypes.ValiIdentity).IsValid) |
| | | { |
| | | errors.Add("身份证号格式不正确"); |
| | | } |
| | | else if (successList.Any(it => it.Identity == model.Identity)) |
| | | { |
| | | errors.Add("身份证号重复"); |
| | | } |
| | | if (model.Bank.IsNull()) |
| | | { |
| | | errors.Add("请填写所属银行"); |
| | | } |
| | | if (model.ReceiveAccount.IsNull()) |
| | | { |
| | | errors.Add("请填写收款账号"); |
| | | } |
| | | if (model.SettlementAmount == null) |
| | | { |
| | | errors.Add("请填写结算金额"); |
| | | } |
| | | else if (model.SettlementAmount < 0) |
| | | { |
| | | errors.Add("结算金额不可为负数"); |
| | | } |
| | | if (model.ActualSettlementAmount == null) |
| | | { |
| | | errors.Add("请填写实发金额"); |
| | | } |
| | | else if (model.ActualSettlementAmount < 0) |
| | | { |
| | | errors.Add("实发金额不可为负数"); |
| | | } |
| | | else if (model.ActualSettlementAmount > 0 && model.ActualSettlementAmount < 1) |
| | | { |
| | | errors.Add("实发金额不可小于1元"); |
| | | } |
| | | |
| | | var item = list.Data.FirstOrDefault(it => it.Identity == model.Identity); |
| | | if (item == null) |
| | | { |
| | | errors.Add("灵工不存在"); |
| | | } |
| | | else if (item.CheckReceiveStatus != EnumTaskCheckReceiveStatus.Completed) |
| | | { |
| | | errors.Add("未完成验收"); |
| | | } |
| | | else if (item.Name != model.Name) |
| | | { |
| | | errors.Add("灵工姓名与实名信息不一致"); |
| | | } |
| | | else |
| | | { |
| | | item.SettlementAmount = model.SettlementAmount; |
| | | item.ActualSettlementAmount = model.ActualSettlementAmount; |
| | | item.ReceiveAccount = model.ReceiveAccount; |
| | | item.Bank = model.Bank; |
| | | item.BankBranch = model.BankBranch; |
| | | } |
| | | if (model.TaskName != list.Detail.Name) |
| | | { |
| | | errors.Add("任务名称不一致"); |
| | | } |
| | | |
| | | if (errors.IsNotNull()) |
| | | { |
| | | var error = model.Adapt<GetSettlementTaskUsersQueryResultError>(); |
| | | error.ErrorMessage = errors.SplitJoin(","); |
| | | list.Errors.Add(error); |
| | | } |
| | | else |
| | | { |
| | | successList.Add(model); |
| | | } |
| | | } |
| | | |
| | | if (list.Errors.IsNotNull()) |
| | | { |
| | | list.Data = new List<GetSettlementTaskUsersQueryResultItem>(); |
| | | } |
| | | else |
| | | { |
| | | list.Data = list.Data |
| | | .Where(it => successList.Any(s => s.Identity == it.Identity)) |
| | | .ToList(); |
| | | } |
| | | |
| | | list.Detail.SettlementOrderStatus = EnumTaskSettlementOrderStatus.Wait; |
| | | list.Detail.SettlementOrderName = request.SettlementOrderUrl.Substring(request.SettlementOrderUrl.LastIndexOf("/") + 1); |
| | | list.Detail.SettlementOrderTime = DateTime.Now; |
| | | list.Detail.SettlementStatus = EnumTaskSettlementStatus.Wait; |
| | | list.Detail.SettlementAmount = list.Data.Sum(it => it.SettlementAmount ?? 0); |
| | | list.Detail.ActualSettlementAmount = list.Data.Sum(it => it.ActualSettlementAmount ?? 0); |
| | | } |
| | | else |
| | | { |
| | | var task = await repTaskInfo.AsQueryable().AsNoTracking() |
| | | .Where(it => it.Id == request.TaskInfoId) |
| | | .FirstOrDefaultAsync(); |
| | | if (task == null) throw Oops.Oh(EnumErrorCodeType.s404, "任务"); |
| | | list.Data = list.Data |
| | | .Where(it => it.SettlementStatus == task.SettlementStatus) |
| | | .ToList(); |
| | | } |
| | | |
| | | return list; |
| | | } |
| | | } |
| | | } |