using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Yitter.IdGenerator; using Znyc.Recruitment.Admin.Commons; using Znyc.Recruitment.Admin.Commons.Entitys; using Znyc.Recruitment.Admin.Commons.Enums; using Znyc.Recruitment.Admin.Commons.Extensions; using Znyc.Recruitment.Admin.Commons.Helpers; using Znyc.Recruitment.Admin.Commons.Mapping; using Znyc.Recruitment.Admin.Commons.Pages; using Znyc.Recruitment.Admin.Commons.Services; using Znyc.Recruitment.Admin.Security.Dtos; using Znyc.Recruitment.Admin.Security.Entitys; using Znyc.Recruitment.Admin.Security.IRepositories; using Znyc.Recruitment.Admin.Security.IServices; namespace Znyc.Recruitment.Admin.Security.Services { /// /// 招聘服务 /// public class RecruitmentService : BaseService, IRecruitmentService { private readonly IAuditRepository _auditRepository; private readonly IDictionaryService _dictionaryService; private readonly IIndustryJobsService _industryJobsService; private readonly IRecruitmentRepository _recruitmentRepository; private readonly IRegionRepository _regionRepository; private readonly IUserRepository _userRepository; private readonly IWxUnifyUserRepository _wxUnifyUserRepository; private readonly ICallFeedbackRepository _callFeedbackRepository; public RecruitmentService( IRecruitmentRepository repository, IDictionaryService dictionaryService, IIndustryJobsService industryJobsService, IRegionRepository regionRepository, IAuditRepository auditRepository, IUserRepository userRepository, IWxUnifyUserRepository wxUnifyUserRepository, ICallFeedbackRepository callFeedbackRepository ) : base(repository) { _recruitmentRepository = repository; _dictionaryService = dictionaryService; _industryJobsService = industryJobsService; _regionRepository = regionRepository; _auditRepository = auditRepository; _userRepository = userRepository; _wxUnifyUserRepository = wxUnifyUserRepository; _callFeedbackRepository = callFeedbackRepository; } /// /// 异步新增数据 /// /// ʵ�� /// public async Task InsertAsync(RecruitmentEntity intput) { CommonResult result = new CommonResult(); intput.Id = YitIdHelper.NextId(); intput.Status = (int)ProductStatusEnum.Finding; intput.UserId = 1; intput.IsPublic = true; intput.AreaId = 0; intput.SerialNumber = StringHelper.GetSerialNumber(ProductTypeEnum.Recruitment, intput.IndustryId, intput.JobId); intput.ModifiedTime = DateTime.Now; intput.RefreshDate = DateTime.Now; result.Success = await repository.InsertAsync(intput) > 0 ? true : false; return result; } /// /// 异步修改数据 /// /// /// public async Task UpdateAsync(RecruitmentEntity tinfo) { CommonResult result = new CommonResult(); RecruitmentEntity info = await repository.GetAsync(tinfo.Id); if (!(info?.Id > 0)) { result.Success = false; result.ErrMsg = "招聘信息不存在"; return result; } info.Title = tinfo.Title; info.Content = tinfo.Content; info.Phone = tinfo.Phone; info.IndustryId = tinfo.IndustryId; info.JobId = tinfo.JobId; info.ProvinceId = tinfo.ProvinceId; info.CityId = tinfo.CityId; info.Status = tinfo.Status; info.IsTop = tinfo.IsTop; info.IsPublic = tinfo.IsPublic; info.TopExpireDate = tinfo.TopExpireDate; info.Welfare = tinfo.Welfare; info.Address = tinfo.Address; info.ModifiedTime = tinfo.ModifiedTime; info.ModifiedUserId = tinfo.ModifiedUserId; await repository.UpdateAsync(info, tinfo.Id).ConfigureAwait(false); result.Success = true; return result; } /// /// 根据条件查询数据库,并返回对象集合(用于分页数据显示) /// /// 查询的条件 /// 指定对象的集合 public async Task> FindWithPagerSearchAsync(SearchRecruitmentModel search) { bool order = search.Order == "asc" ? false : true; string where = GetDataPrivilege(false); if (!string.IsNullOrEmpty(search.Keywords)) { @where += $" and (Title like '%{search.Keywords}%' or Content like '%{search.Keywords}%' or Phone like '%{search.Keywords}%' " + $"or SerialNumber like '%{search.Keywords}%' or Address like '%{search.Keywords}%')"; } if (search.Status == (int)ProductStatusEnum.Pass) { @where += $" and (Status=1 or Status=2 )"; } if (search.Status >= 0 && search.Status != (long)ProductStatusEnum.Pass) { @where += $" and Status={search.Status}"; } if (!string.IsNullOrEmpty(search.StartTime)) { @where += $" and ModifiedTime >='{search.StartTime} 00:00:00'"; } if (!string.IsNullOrEmpty(search.EndTime)) { @where += $" and ModifiedTime <='{search.EndTime} 23:59:59'"; } if (search.industryId > 0) { @where += $" and IndustryId={search.industryId}"; } if (search.jobId > 0) { @where += $" and JobId={search.jobId}"; } List users = (await _userRepository.GetListWhereAsync(" `Status`=1")).MapTo(); if (!string.IsNullOrEmpty(search.UserName)) { List uIds = users.Where(x => x.UserName.Contains(search.UserName)).Select(x => x.Id).ToList(); @where += $" and UserId in ({string.Join(",", uIds.ToArray())})"; } //行业岗位 List industryJobs = await _industryJobsService.GetAllListAsync(); //福利待遇 List welfares = await _dictionaryService.GetListByPidAsync(CommonConst.Dictionary_Welfare); //云平台统一用户信息 List uninIds = users.Select(x => x.UnionId).ToList(); List wxUnifyUsers = (await _wxUnifyUserRepository.GetListWhereAsync($" IsDeleted=0 AND UnionId IN ('{string.Join("','", uninIds.ToArray())}')")) .MapTo(); PagerInfo pagerInfo = new PagerInfo { CurrenetPageIndex = search.CurrenetPageIndex, PageSize = search.PageSize }; List list = await repository.FindWithPagerAsync(where, pagerInfo, search.Sort, order); List listDto = list.MapTo(); foreach (RecruitmentOutputDto item in listDto) { item.IndustryName = industryJobs.Find(x => x.Id == item.IndustryId)?.Name; item.JobName = industryJobs.Find(x => x.Id == item.JobId)?.Name; string[] welfare = item.Welfare.Split(","); item.WelfareList = welfares.FindAll(x => welfare.Contains(x.Id.ToString())); UserOutputDto user = users.Find(x => x.Id == item.UserId); item.UserName = user?.UserName ?? CommonConst.Default_UserName; item.AvatarUrl = CommonConst.Default_Image_Prefix + (user?.AvatarUrl ?? CommonConst.Default_AvataUrl); item.Top = item.IsTop ? "已置顶" : "未置顶"; item.TopExpireDate = item.IsTop ? item.TopExpireDate : null; item.Public = item.IsPublic ? "已公开" : "未公开"; item.StatusName = EnumExtensions .ParseEnum(typeof(ProductStatusEnum), item.Status.ToString()).ToDescription(); if (item.Status == (int)ProductStatusEnum.Fail) { string key = $" ProductId={item.Id} AND ProductType=2 AND HandleStatus={item.Status} ORDER BY CreatedTime DESC LIMIT 1"; item.Note = (await _auditRepository.GetWhereAsync(key))?.Note ?? ""; } item.NickName = wxUnifyUsers.Find(x => x.UnionId == user.UnionId)?.NickName ?? CommonConst.Default_UserName; item.WxAvatarUrl = wxUnifyUsers.Find(x => x.UnionId == user.UnionId)?.AvatarUrl ?? (CommonConst.Default_Image_Prefix + CommonConst.Default_AvataUrl); //通话评价 item.CallFeedbacks = (await _callFeedbackRepository.GetListWhereAsync($" ProductId={item.Id} AND ProductType=2")).MapTo(); foreach (var callFeedback in item.CallFeedbacks) { var callUser = users.Find(x => x.Id == callFeedback.UserId); callFeedback.Phone = callUser.Phone; callFeedback.NickName = wxUnifyUsers.Find(x => x.UnionId == callUser.UnionId)?.NickName ?? CommonConst.Default_UserName; callFeedback.WxAvatarUrl = wxUnifyUsers.Find(x => x.UnionId == callUser.UnionId)?.AvatarUrl ?? (CommonConst.Default_Image_Prefix + CommonConst.Default_AvataUrl); callFeedback.Content = EnumExtensions .ParseEnum(typeof(CallFeedbackStatusEnum), callFeedback.Status.ToString()).ToDescription(); if (callFeedback.IsRead == false && item.IsReadForCallFeedback == false) { item.IsReadForCallFeedback = true; } } } PageResult pageResult = new PageResult { CurrentPage = pagerInfo.CurrenetPageIndex, Items = listDto, ItemsPerPage = pagerInfo.PageSize, TotalItems = pagerInfo.RecordCount }; return pageResult; } /// /// /// /// /// public async Task GetById(long id) { RecruitmentOutputDto recruitmentDto = await GetOutDtoAsync(id); //行业岗位 List industryJobs = await _industryJobsService.GetAllListAsync(); //福利待遇 List welfares = await _dictionaryService.GetListByPidAsync(CommonConst.Dictionary_Welfare); List users = (await _userRepository.GetListWhereAsync(" `Status`=1")).MapTo(); recruitmentDto.IndustryName = industryJobs.Find(x => x.Id == recruitmentDto.IndustryId)?.Name; recruitmentDto.JobName = industryJobs.Find(x => x.Id == recruitmentDto.JobId)?.Name; string[] welfare = recruitmentDto.Welfare.Split(","); recruitmentDto.WelfareList = welfares.FindAll(x => welfare.Contains(x.Id.ToString())); UserOutputDto user = users.Find(x => x.Id == recruitmentDto.UserId); recruitmentDto.UserName = user?.UserName ?? CommonConst.Default_UserName; recruitmentDto.AvatarUrl = CommonConst.Default_Image_Prefix + (user?.AvatarUrl ?? CommonConst.Default_AvataUrl); recruitmentDto.Top = recruitmentDto.IsTop ? "已置顶" : "未置顶"; recruitmentDto.TopExpireDate = recruitmentDto.IsTop ? recruitmentDto.TopExpireDate : null; recruitmentDto.Public = recruitmentDto.IsPublic ? "已公开" : "未公开"; recruitmentDto.StatusName = EnumExtensions .ParseEnum(typeof(ProductStatusEnum), recruitmentDto.Status.ToString()).ToDescription(); return recruitmentDto; } /// /// 下架招聘信息 /// /// /// /// public async Task RevocationAsync(long id, long userId) { CommonResult result = new CommonResult(); RecruitmentEntity info = await repository.GetAsync(id); if (!(info?.Id > 0)) { result.Success = false; result.ErrMsg = "招聘信息不存在"; return result; } info.Status = (int)ProductStatusEnum.Revocation; info.ModifiedUserId = userId; info.ModifiedTime = DateTime.Now; await repository.UpdateAsync(info, info.Id).ConfigureAwait(false); result.Success = true; return result; } } }