using AgileObjects.AgileMapper; using Newtonsoft.Json.Linq; using SqlSugar; using System.Linq.Expressions; using Tiobon.Core.Common; using Tiobon.Core.Common.Caches; using Tiobon.Core.Common.Extensions; using Tiobon.Core.Common.Helper; using Tiobon.Core.IRepository.Base; using Tiobon.Core.IServices; using Tiobon.Core.Model; using Tiobon.Core.Model.Models; using Tiobon.Core.Model.ViewModels.Extend; using Tiobon.Core.Services.BASE; namespace Tiobon.Core.Services; /// /// 个人简历 (服务) /// public class Ghrh_ResumeServices : BaseServices, IGhrh_ResumeServices { private readonly IBaseRepository _dal; private readonly IGhrh_ResumeEduBGServices _ghre_ResumeEduBGServices; private readonly IGhrh_ResumeWorkExpServices _ghre_ResumeWorkExpServices; private readonly IGhrh_ResumeTagServices _ghre_ResumeTagServices; public Ghrh_ResumeServices(ICaching caching, IBaseRepository dal, IGhrh_ResumeEduBGServices ghre_ResumeEduBGServices, IGhrh_ResumeTagServices ghre_ResumeTagServices, IGhrh_ResumeWorkExpServices ghre_ResumeWorkExpServices) { this._dal = dal; base.BaseDal = dal; base._caching = caching; _ghre_ResumeEduBGServices = ghre_ResumeEduBGServices; _ghre_ResumeTagServices = ghre_ResumeTagServices; _ghre_ResumeWorkExpServices = ghre_ResumeWorkExpServices; } public override async Task> QueryFilterPage(QueryBody filter, string condition, bool? IsEnable = true) { var query = Db.Queryable(); #region 处理查询条件 //Expression> whereExpression = new Expression>(); var whereExpression = Expressionable.Create(); foreach (JProperty jProperty in filter.jsonParam.Properties()) { var name = jProperty.Name; var value = jProperty.Value.ToString(); if (name == "page" || name == "pageSize") continue; if (value.IsNotEmptyOrNull()) { var jsonParam = JsonHelper.JsonToObj(value); switch (name) { case "WaitRecommend": if (jsonParam.columnValue.ObjToInt() == 1) whereExpression.And(x => x.IsRecommend != true); break; case "HasRecommend": if (jsonParam.columnValue.ObjToInt() == 1) whereExpression.And(x => x.IsRecommend == true); break; case "SalaryPeriod": case "Education": case "ApplyStatus": case "Gender": //if (jsonParam.columnValue.IsNotEmptyOrNull()) //{ // var ids1 = JsonHelper.JsonToObj>(jsonParam.columnValue.ToString()); // if (!ids1.Any(x => x == "NoFliter")) // whereExpression.And(x => ids1.Contains(x.Education)); //} if (jsonParam.columnValue != null) { var ids1 = JsonHelper.JsonToObj>(jsonParam.columnValue.ToString()); if (!ids1.Any(x => x == "NoFliter")) condition += $" AND {name} IN ({string.Join(",", ids1.Select(id => "'" + id + "'"))})"; } break; case "WorkYears": case "Age": if (jsonParam.columnValue.IsNotEmptyOrNull()) { var ids1 = JsonHelper.JsonToObj>(jsonParam.columnValue.ToString()); if (!ids1.Any(x => x == "NoFliter")) { var i = 0; condition += " AND ("; ids1.ForEach(x => { var arr = x.Split(['-']); if (i == 0) condition += $"({name} >= {arr[0]} AND {name} <={arr[1]})"; else condition += $" OR ({name} >= {arr[0]} AND {name} <={arr[1]})"; i++; }); condition += ")"; } } break; case "Tags": if (jsonParam.columnValue.IsNotEmptyOrNull()) { var ids1 = JsonHelper.JsonToObj>(jsonParam.columnValue.ToString()); if (!ids1.Any(x => x == "NoFliter")) { var i = 0; condition += " AND ("; ids1.ForEach(x => { var arr = x.Split(['-']); if (i == 0) condition += $"({name} like '%{x}%')"; else condition += $" OR ({name} like '%{x}%')"; i++; }); condition += ")"; } } break; case "Keywords": if (jsonParam.columnValue.IsNotEmptyOrNull()) whereExpression.And(x => (x.StaffName.Contains(jsonParam.columnValue.ToString()) || x.StaffEname.Contains(jsonParam.columnValue.ToString()) || x.Tags.Contains(jsonParam.columnValue.ToString()) || x.RemarkSz.Contains(jsonParam.columnValue.ToString()) || x.School.Contains(jsonParam.columnValue.ToString()))); break; default: break; } } } #endregion RefAsync total = 0; var entitys = await query .WhereIF(condition.IsNotEmptyOrNull(), condition) .Where(whereExpression.ToExpression()) .ToPageListAsync(filter.pageNum, filter.pageSize, total); var result = new ServicePageResult(filter.pageNum, total, filter.pageSize, Mapper.Map(entitys).ToANew>()); var list = result.result.DT_TableDataT1; var ids = list.Select(x => x.Id).ToList(); var titleIds = list.Where(x => x.TitleId != null).Select(x => x.TitleId.Value).Distinct().ToList(); var titles = await Db.Queryable().Where(x => x.TitleID != null && titleIds.Contains(x.TitleID.Value)).ToListAsync(); var eduBGs = await _ghre_ResumeEduBGServices.QueryDto(x => x.ResumeId != null && ids.Contains(x.ResumeId.Value)); var workExps = await _ghre_ResumeWorkExpServices.QueryDto(x => x.ResumeId != null && ids.Contains(x.ResumeId.Value)); eduBGs.ForEach(async x => { x.DegreeLevelLabel = await GetParaLabel("EducationalBGLevel", x.DegreeLevel); x.BeginDate1 = DateTimeHelper.ConvertToDayString(x.BeginDate); x.EndDate1 = DateTimeHelper.ConvertToDayString(x.EndDate); }); workExps.ForEach(x => { x.BeginDate1 = DateTimeHelper.ConvertToDayString(x.BeginDate); x.EndDate1 = DateTimeHelper.ConvertToDayString(x.EndDate); }); var tagIds = new List(); list.ForEach(x => { if (x.Tags.IsNotEmptyOrNull()) tagIds.AddRange(JsonHelper.JsonToObj>(x.Tags)); }); tagIds = tagIds.Distinct().ToList(); var tags = await _ghre_ResumeTagServices.QueryDto(x => tagIds.Contains(x.Id)); list.ForEach(async x => { if (x.TitleId != null) x.TitleName = titles.Where(o => o.TitleID == x.TitleId).FirstOrDefault()?.TitleName; x.GenderLabel = await GetParaLabel("Gender", x.Gender); x.EducationLabel = await GetParaLabel("EducationalBGLevel", x.Education); x.NationLabel = await GetParaLabel("A02", x.Nation); x.MaritalStatusLabel = await GetParaLabel("A03", x.MaritalStatus); x.PoliticStatusLabel = await GetParaLabel("A04", x.PoliticStatus); x.UrgentRelationLabel = await GetParaLabel("SocialRelationType", x.UrgentRelation); x.EduBG = eduBGs.Where(o => x.Id == o.ResumeId).ToList(); x.WorkExp = workExps.Where(o => x.Id == o.ResumeId).ToList(); if (x.Tags.IsNotEmptyOrNull()) { var tagIds1 = JsonHelper.JsonToObj>(x.Tags); x.TagList = tags.Where(o => tagIds1.Contains(o.Id)).Select(o => o.TagName).ToList(); } }); return result; } #region 获取简历Tabs接口 public ServiceResult> QueryViewTab() { string str = "[\r\n\t{\r\n\t\t\"MenuName\": \"F_ResumeMaintenance_All\",\r\n\t\t\"TabName\": \"简历库\",\r\n\t\t\"QueryUrl\": \"/api/Ghrh_Resume/QueryList/All\",\r\n\t\t\"Count\": 0,\r\n\t\t\"Items\": [\r\n\t\t\t{\r\n\t\t\t\t\"ItemName\": \"待推荐\",\r\n\t\t\t\t\"Key\": \"WaitRecommend\",\r\n\t\t\t\t\"Count\": 0\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"ItemName\": \"已推荐\",\r\n\t\t\t\t\"Key\": \"HasRecommend\",\r\n\t\t\t\t\"Count\": 0\r\n\t\t\t}\r\n\t\t]\r\n\t},\r\n\t{\r\n\t\t\"MenuName\": \"F_ResumeMaintenance_Process\",\r\n\t\t\"TabName\": \"面试过程\",\r\n\t\t\"QueryUrl\": \"/api/Ghrh_Resume/QueryList/Process\",\r\n\t\t\"Count\": 0\r\n\t},\r\n\t{\r\n\t\t\"MenuName\": \"F_ResumeMaintenance_Hire\",\r\n\t\t\"TabName\": \"录用\",\r\n\t\t\"QueryUrl\": \"/api/Ghrh_Resume/QueryList/Hire\",\r\n\t\t\"Count\": 0\r\n\t},\r\n\t{\r\n\t\t\"MenuName\": \"F_ResumeMaintenance_Talent_Pool\",\r\n\t\t\"TabName\": \"人才库\",\r\n\t\t\"QueryUrl\": \"/api/Ghrh_Resume/QueryList/Talent_Pool\",\r\n\t\t\"Count\": 0\r\n\t},\r\n\t{\r\n\t\t\"MenuName\": \"F_ResumeMaintenance_Recycled\",\r\n\t\t\"TabName\": \"回收站\",\r\n\t\t\"QueryUrl\": \"/api/Ghrh_Resume/QueryList/Recycled\",\r\n\t\t\"Count\": 0\r\n\t},\r\n\t{\r\n\t\t\"MenuName\": \"F_ResumeMaintenance_Blacklist\",\r\n\t\t\"TabName\": \"黑名单\",\r\n\t\t\"QueryUrl\": \"/api/Ghrh_Resume/QueryList/Blacklist\",\r\n\t\t\"Count\": 0\r\n\t}\r\n]"; var tabs = JsonHelper.JsonToObj>(str); return ServiceResult>.OprateSuccess("查询成功!", tabs); } #endregion #region 获取查询条件 public async Task>> QueryConditions() { string str = "[\r\n\t{\r\n\t\t\"Key\": \"Education\",\r\n\t\t\"Name\": \"学历要求\",\r\n\t\t\"ParaMasterNo\": \"EducationalBGLevel\"\r\n\t},\r\n\t{\r\n\t\t\"Key\": \"WorkYears\",\r\n\t\t\"Name\": \"经验要求\",\r\n\t\t\"ParaMasterNo\": \"ResumeWorkYears\"\r\n\t},\r\n\t{\r\n\t\t\"Key\": \"Age\",\r\n\t\t\"Name\": \"年龄要求\",\r\n\t\t\"ParaMasterNo\": \"AgePeriodSetup\"\r\n\t},\r\n\t{\r\n\t\t\"Key\": \"Gender\",\r\n\t\t\"Name\": \"性 别\",\r\n\t\t\"ParaMasterNo\": \"Gender\"\r\n\t},\r\n\t{\r\n\t\t\"Key\": \"SalaryPeriod\",\r\n\t\t\"Name\": \"薪资区间\",\r\n\t\t\"ParaMasterNo\": \"SalaryPeriodSetup\"\r\n\t},\r\n\t{\r\n\t\t\"Key\": \"ApplyStatus\",\r\n\t\t\"Name\": \"求职状态\",\r\n\t\t\"ParaMasterNo\": \"ResumeApplyStatus\"\r\n\t},\r\n\t{\r\n\t\t\"Key\": \"Tags\",\r\n\t\t\"Name\": \"标签\",\r\n\t\t\"ParaMasterNo\": \"ResumeTag\"\r\n\t}\r\n]"; var tabs = JsonHelper.JsonToObj>(str); tabs.ForEach(async x => { var items = await GetParaList(x.ParaMasterNo); if (x.Key == "Tags") items.Insert(0, new Ghrs_ParaDetail() { ParaDetailNo = "NoFliter", ParaDetailName = "未打标签" }); else items.Insert(0, new Ghrs_ParaDetail() { ParaDetailNo = "NoFliter", ParaDetailName = "不限" }); x.Items = items.ToDictionary(item => item.ParaDetailNo, item => item.ParaDetailName); }); return ServiceResult>.OprateSuccess("查询成功!", tabs); } #endregion #region 处理是否推荐 public async Task SwitchIsRecommend(List ids, bool isRecommend) { await Db.Updateable() .SetColumns(it => new Ghrh_Resume() { IsRecommend = isRecommend, UpdateBy = App.User.ID, UpdateTime = DateTime.Now, }) .Where(it => ids.Contains(it.Id)).ExecuteCommandAsync(); return ServiceResult.OprateSuccess(); } #endregion #region 修改状态 public async Task UpdateStatus(List ids, string status) { var result = await Db.Updateable() .SetColumns(it => new Ghrh_Resume() { Status = status, UpdateBy = App.User.ID, UpdateTime = DateTime.Now, }) .Where(it => ids.Contains(it.Id)).ExecuteCommandAsync(); return result > 0 ? true : false; } #endregion #region 添加标签 public async Task MarkTags(List ids, List tags) { var tag = JsonHelper.ObjToJson(tags); var result = await Db.Updateable() .SetColumns(it => new Ghrh_Resume() { Tags = tag, UpdateBy = App.User.ID, UpdateTime = DateTime.Now, }) .Where(it => ids.Contains(it.Id)) .ExecuteCommandAsync(); return result > 0 ? true : false; } #endregion }