using MySqlX.XDevAPI.Common; using Tiobon.Core.Common.DB.Dapper.Extensions; using static Tiobon.Core.Model.Consts; namespace Tiobon.Core.Services; /// /// 个人简历 (服务) /// public class Ghrh_ResumeServices : BaseServices, IGhrh_ResumeServices { private readonly IBaseRepository _dal; private readonly IGhrh_ResumeEduBGServices _ghrh_ResumeEduBGServices; private readonly IGhrh_ResumeWorkExpServices _ghrh_ResumeWorkExpServices; private readonly IGhrh_ResumeTagServices _ghrh_ResumeTagServices; /// /// 家庭关系 /// private readonly IGhrh_ResumeHomeServices _ghrh_ResumeHomeServices; private readonly IGhrh_ResumeLicenceServices _ghrh_ResumeLicenceServices; private readonly IGhrh_ResumeTrainingServices _ghrh_ResumeTrainingServices; private readonly IGhrh_ResumeStatementServices _ghrh_ResumeStatementServices; /// /// 面试工单 /// private readonly IGhrh_InterviewOrderServices _ghrh_InterviewOrderServices; /// /// 面试记录 /// private readonly IGhrh_InterviewRecordServices _ghrh_InterviewRecordServices; /// /// /// private readonly IGhrh_InterviewLogServices _ghrh_InterviewLogServices; public Ghrh_ResumeServices(ICaching caching, IBaseRepository dal, IGhrh_ResumeEduBGServices ghre_ResumeEduBGServices, IGhrh_ResumeTagServices ghre_ResumeTagServices, IGhrh_ResumeHomeServices ghre_ResumeHomeServices, IGhrh_ResumeLicenceServices ghre_ResumeLicenceServices, IGhrh_ResumeTrainingServices ghre_ResumeTrainingServices, IGhrh_ResumeStatementServices ghre_ResumeStatementServices, IGhrh_InterviewOrderServices ghre_InterviewOrderServices, IGhrh_InterviewRecordServices ghre_InterviewRecordServices, IGhrh_InterviewLogServices ghrh_InterviewLogServices, IGhrh_ResumeWorkExpServices ghre_ResumeWorkExpServices) { this._dal = dal; base.BaseDal = dal; base._caching = caching; _ghrh_ResumeEduBGServices = ghre_ResumeEduBGServices; _ghrh_ResumeTagServices = ghre_ResumeTagServices; _ghrh_ResumeHomeServices = ghre_ResumeHomeServices; _ghrh_ResumeLicenceServices = ghre_ResumeLicenceServices; _ghrh_ResumeTrainingServices = ghre_ResumeTrainingServices; _ghrh_ResumeStatementServices = ghre_ResumeStatementServices; _ghrh_InterviewOrderServices = ghre_InterviewOrderServices; _ghrh_InterviewRecordServices = ghre_InterviewRecordServices; _ghrh_ResumeWorkExpServices = ghre_ResumeWorkExpServices; _ghrh_InterviewLogServices = ghrh_InterviewLogServices; } 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.Status == DIC_INTERVIEW_ORDER_STATUS.WaitRecommended); break; case "HasRecommend": if (jsonParam.columnValue.ObjToInt() == 1) whereExpression.And(x => x.Status == DIC_INTERVIEW_ORDER_STATUS.HasRecommended); break; case "WaitAppointment": if (jsonParam.columnValue.ObjToInt() == 1) whereExpression.And(x => x.Status == DIC_INTERVIEW_ORDER_STATUS.WaitAppointment); break; case "WaitInterview": if (jsonParam.columnValue.ObjToInt() == 1) whereExpression.And(x => x.Status == DIC_INTERVIEW_ORDER_STATUS.WaitInterview); break; case "HasInterview": if (jsonParam.columnValue.ObjToInt() == 1) whereExpression.And(x => x.Status == DIC_INTERVIEW_ORDER_STATUS.HasInterview); break; case "WaitSendOffer": if (jsonParam.columnValue.ObjToInt() == 1) whereExpression.And(x => x.Status == DIC_INTERVIEW_ORDER_STATUS.WaitSendOffer); break; case "HasSendOffer": if (jsonParam.columnValue.ObjToInt() == 1) whereExpression.And(x => x.Status == DIC_INTERVIEW_ORDER_STATUS.HasSendOffer); break; case "HasOffer": if (jsonParam.columnValue.ObjToInt() == 1) whereExpression.And(x => x.Status == DIC_INTERVIEW_ORDER_STATUS.HasOffer); 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 _ghrh_ResumeEduBGServices.QueryDto(x => x.ResumeId != null && ids.Contains(x.ResumeId.Value)); var workExps = await _ghrh_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 _ghrh_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.CertificateTypeLabel = await GetParaLabel("D51", x.CertificateType); x.RegisteredTypeLabel = await GetParaLabel("A08", x.RegisteredType); 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; } public override async Task QueryById(object objId) { var result = await base.QueryById(objId); List list = [result]; 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 _ghrh_ResumeEduBGServices.QueryDto(x => x.ResumeId != null && ids.Contains(x.ResumeId.Value)); var workExps = await _ghrh_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 _ghrh_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 list[0]; } #region 获取简历Tabs接口 public ServiceResult> QueryViewTab() { string str = @"[ { ""MenuName"": ""F_ResumeMaintenance_All"", ""TabName"": ""简历库"", ""QueryUrl"": ""/api/Ghrh_Resume/QueryList/All"", ""Count"": 0, ""Items"": [ { ""ItemName"": ""待推荐"", ""Key"": ""WaitRecommend"", ""Count"": 0 }, { ""ItemName"": ""已推荐"", ""Key"": ""HasRecommend"", ""Count"": 0 } ] }, { ""MenuName"": ""F_ResumeMaintenance_Process"", ""TabName"": ""面试过程"", ""QueryUrl"": ""/api/Ghrh_Resume/QueryList/Process"", ""Count"": 0, ""Items"": [ { ""ItemName"": ""待预约"", ""Key"": ""WaitAppointment"", ""Count"": 0 }, { ""ItemName"": ""待面试"", ""Key"": ""WaitInterview"", ""Count"": 0 }, { ""ItemName"": ""已面试"", ""Key"": ""HasInterview"", ""Count"": 0 } ] }, { ""MenuName"": ""F_ResumeMaintenance_Hire"", ""TabName"": ""录用"", ""QueryUrl"": ""/api/Ghrh_Resume/QueryList/Hire"", ""Count"": 0, ""Items"": [ { ""ItemName"": ""待发offer"", ""Key"": ""WaitSendOffer"", ""Count"": 0 }, { ""ItemName"": ""已发offer"", ""Key"": ""HasSendOffer"", ""Count"": 0 }, { ""ItemName"": ""已录用"", ""Key"": ""HasOffer"", ""Count"": 0 } ] }, { ""MenuName"": ""F_ResumeMaintenance_Talent_Pool"", ""TabName"": ""人才库"", ""QueryUrl"": ""/api/Ghrh_Resume/QueryList/Talent_Pool"", ""Count"": 0 }, { ""MenuName"": ""F_ResumeMaintenance_Recycled"", ""TabName"": ""回收站"", ""QueryUrl"": ""/api/Ghrh_Resume/QueryList/Recycled"", ""Count"": 0 }, { ""MenuName"": ""F_ResumeMaintenance_Blacklist"", ""TabName"": ""黑名单"", ""QueryUrl"": ""/api/Ghrh_Resume/QueryList/Blacklist"", ""Count"": 0 } ]"; 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 #region 查询简历是否存在 public async Task> CheckIsExist(EditGhrh_ResumeInput input) { dynamic obj = new ExpandoObject(); obj.ApplicationStatus = "Hold"; long id = 0; var resume = await QuerySingle(x => x.Mobile == input.Mobile); if (resume == null) id = await base.Add(new InsertGhrh_ResumeInput() { Mobile = input.Mobile, StaffName = input.StaffName, ApplicationStatus = "Hold" }); else { if (resume.IdCardNo.IsNotEmptyOrNull() && input.IdCardNo.IsNullOrEmpty()) return ServiceResult.OprateFailed("请输入身份证号码后六位!"); if (resume.IdCardNo.IsNotEmptyOrNull() && input.IdCardNo.IsNotEmptyOrNull()) resume = await QuerySingle(x => x.Mobile == input.Mobile && x.IdCardNo.Contains(input.IdCardNo)); id = resume.Id; if (resume.StaffName != input.StaffName && resume.ApplicationStatus != "Submit") await base.Update(id, input, ["StaffName"]); obj.ApplicationStatus = resume.ApplicationStatus ?? "Hold"; } obj.Id = id; return ServiceResult.OprateSuccess("查询成功", obj); } #endregion #region 查询简历公司新增 public async Task>> QueryCompanyInfo(string companySpecCode) { var url = await Db.Ado.GetStringAsync("SELECT LogoUrl FROM Ghrs_LoginPageSetting"); Dictionary dict = new Dictionary() { { "CompanyName", AppSettings.app(new string[] { "Resume", "CompanyName" }) }, { "LoginDesc", AppSettings.app(new string[] { "Resume", "LoginDesc" }) }, { "LoginTitle", AppSettings.app(new string[] { "Resume", "LoginTitle" }) }, { "StaffName", "姓名" }, { "Mobile", "手机号" }, { "IdCardNo", "身份证后六位" }, { "AgainLoginText", "二次登录" }, { "LoginBtnText", "登录" }, { "LogoUrl", url }, { "StartInputText", "开始填写" }, { "HoldText", "暂存" }, { "NextText", "下一步" }, { "PreviousText", "上一步" }, { "QuestionText", "道题目" }, { "PleaseEnterText", "请输入" }, { "PleaseSelectText", "请选择" }, { "ApplicantPromiseText", "应聘者承诺" }, { "HasSubmitText", "已提交" }, { "SubmitText", "提交" }, { "InformationCompletionDegreeText", "信息填写完成度" }, { "AddText", "新增" }, { "DeleteText", "删除" }, { "TrueText", "是" }, { "FalseText", "否" } }; return ServiceResult>.OprateSuccess("查询成功", dict); } #endregion #region 查询招聘表单信息接口 public async Task> Query(long id, int langId) { dynamic obj = new ExpandoObject(); dynamic Guide = new ExpandoObject(); dynamic Data = new ExpandoObject(); var entity = await QueryById(id); #region Column string sql = @"DECLARE @ID BIGINT = 1 BEGIN DECLARE @MasterTemplateID INT = 0, @TemplateType INT -- 母版设定ID SELECT @TemplateType = TemplateType FROM Ghrh_ResumeTemplate WHERE ID = @ID SELECT @MasterTemplateID = ID FROM Ghrh_ResumeTemplate WHERE IsEnable = 1 AND TemplateType = 1 SELECT * FROM (SELECT a.ID, a.ID ResumeTemplateInfoGroupID, b.ID ResumeInfoGroupID, b.GroupName tabName, b.GroupType tabKey, b.TableName, b.TablePKIDName, -- 是否可挑选栏位 ISNULL (a.IsDisplay, 0) isDisplay, isnull (a.SortNo, b.SortNo) SortNo, CASE WHEN b.GroupType = 'Base' THEN 'list' WHEN b.GroupType = 'Attachment' THEN 'Attachment' WHEN b.GroupType = 'Statement' THEN 'Statement' ELSE 'block' END AS type, -- case when ISNULL(a.IsDisplay,0)=0 then '' CASE WHEN 1 = 2 THEN '' ELSE CASE WHEN b.GroupType = 'Base' -- 读取各模板设定 THEN isnull ( (SELECT pp.ColumnName field, pp.ResumeInfoColumnName label, pp.IsRequired required, pp.ColumnType elementType, CASE WHEN pp.DataSourceType = 'ParaDetailNo' THEN (SELECT 'TBParaDetail_' + ParaTypeNo + '_' + ParaMasterNo FROM Ghrs_ParaMaster WHERE ParaMasterId = pp.DataSource) WHEN pp.DataSourceType = 'CommonList' THEN (SELECT 'CommonList_' + ListCommonSqlNo FROM Ghrs_ListCommonSql WHERE ListCommonSqlId = pp.DataSource) ELSE NULL END dataSource, pp.DataType dataType, pp.MultipleSelect multipleSelect, kk.SortNo sortNo, pp.Placeholder placeholder, pp.Editable editable FROM Ghrh_ResumeTemplateInfoGroupColumn kk, Ghrh_ResumeInfoColumn pp WHERE kk.ResumeTemplateInfoGroupID = a.ID -- a.ResumeTemplateInfoGroupID AND kk.ResumeInfoColumnID = pp.ID AND kk.IsDisplay = 1 AND pp.IsEnable = 1 AND kk.IsEnable = 1 order by kk.SortNo FOR JSON PATH, INCLUDE_NULL_VALUES), '') WHEN b.GroupType = 'Photo' -- 读取各模板设定 THEN (SELECT PhotoType FROM Ghrh_ResumeTemplate WHERE ResumeTemplateID = @MasterTemplateID FOR JSON PATH, INCLUDE_NULL_VALUES) WHEN b.GroupType NOT IN ('Base', 'Photo') -- 读取母版的设定 THEN isnull ( (SELECT pp.ColumnName field, pp.ResumeInfoColumnName label, pp.IsRequired required, pp.ColumnType elementType, CASE WHEN pp.DataSourceType = 'ParaDetailNo' THEN (SELECT 'TBParaDetail_' + ParaTypeNo + '_' + ParaMasterNo FROM Ghrs_ParaMaster WHERE ParaMasterId = pp.DataSource) WHEN pp.DataSourceType = 'CommonList' THEN (SELECT 'CommonList_' + ListCommonSqlNo FROM Ghrs_ListCommonSql WHERE ListCommonSqlId = pp.DataSource) ELSE NULL END dataSource, pp.DataType dataType, pp.MultipleSelect multipleSelect, kk.SortNo sortNo, pp.Placeholder placeholder, pp.Editable editable FROM Ghrh_ResumeTemplateInfoGroupColumn kk, Ghrh_ResumeInfoColumn pp WHERE kk.ResumeTemplateID = @MasterTemplateID AND kk.ResumeInfoGroupId = b.Id -- b.ResumeInfoGroupId AND pp.Id = kk.ResumeInfoColumnId AND kk.IsDisplay = 1 AND pp.IsEnable = 1 AND kk.IsEnable = 1 order by kk.SortNo FOR JSON PATH, INCLUDE_NULL_VALUES), '') END END children1 FROM Ghrh_ResumeInfoGroup b LEFT JOIN Ghrh_ResumeTemplateInfoGroup a ON a.ResumeInfoGroupId = b.ID AND a.IsEnable = 1 AND a.ResumeTemplateID = @ID WHERE b.IsEnable = 1) a WHERE a.IsDisplay = 1 -- order by ISNULL(a.IsDisplay,0) desc,isnull(a.SortNo,b.SortNo) -- 显示的放上面, 不显示的放下面, 再按照序号排序 ORDER BY a.SortNo ASC END"; var columns = await Db.Ado.SqlQueryAsync(sql); columns.ForEach(x => { if (x.children1.IsNotEmptyOrNull()) x.children = JsonHelper.JsonToObj>(x.children1); x.children1 = null; }); if (columns.Any(x => x.tabKey == "Photo") && columns.Any(x => x.tabKey == "Base")) { columns.ForEach(x => { if (x.tabKey == "Base") { x.children.Insert(0, new ResumeFormColumnChildren() { field = "PhotoUrls", elementType = "FileUpload", label = "照片", editable = "1" }); } }); } obj.Columns = columns.Where(x => x.tabKey != "Photo").ToList(); #endregion #region Data var formColumns = await QueryResumeFormColumn(1); #region Base var columnNames = formColumns.Where(x => x.GroupType == "Base").Select(x => x.ColumnName).ToList(); columnNames = columnNames.Distinct().ToList(); var dicts = new Dictionary { { "PhotoUrl", entity.PhotoUrl } }; columnNames.ForEach(x => { var value = entity.GetPropertyValue(x); dicts.Add(x, value); }); if (entity.PhotoUrl.IsNotEmptyOrNull()) { dicts.Add("PhotoUrls", new List() { new ResumePhotoAttachment() { RelativePath =entity.PhotoUrl } }); } else dicts.Add("PhotoUrls", new List() { }); Data.Base = dicts; #endregion #region 家庭关系 columnNames = formColumns.Where(x => x.GroupType == "Family").Select(x => x.ColumnName).ToList(); columnNames = columnNames.Distinct().ToList(); var familys = await _ghrh_ResumeHomeServices.QueryDto(x => x.ResumeId != null && x.ResumeId == id); var familyDic = new List>(); familys.ForEach(family => { var dicts = new Dictionary(); columnNames.ForEach(x => { var value = family.GetPropertyValue(x); dicts.Add(x, value); }); if (columnNames.Any(x => x == "AttachmentIDs")) dicts["AttachmentIDs"] = family.AttachmentIDs; familyDic.Add(dicts); }); Data.Family = familyDic; #endregion #region 教育背景 columnNames = formColumns.Where(x => x.GroupType == "Education").Select(x => x.ColumnName).ToList(); columnNames = columnNames.Distinct().ToList(); var educations = await _ghrh_ResumeEduBGServices.QueryDto(x => x.ResumeId != null && x.ResumeId == id); var educationDic = new List>(); educations.ForEach(education => { var dicts = new Dictionary(); columnNames.ForEach(x => { var value = education.GetPropertyValue(x); dicts.Add(x, value); }); if (columnNames.Any(x => x == "AttachmentIDs")) dicts["AttachmentIDs"] = education.AttachmentIDs; educationDic.Add(dicts); }); Data.Education = educationDic; #endregion #region 工作经历 columnNames = formColumns.Where(x => x.GroupType == "WorkExp").Select(x => x.ColumnName).ToList(); columnNames = columnNames.Distinct().ToList(); var workExps = await _ghrh_ResumeWorkExpServices.QueryDto(x => x.ResumeId != null && x.ResumeId == id); var workExpDic = new List>(); workExps.ForEach(workExp => { var dicts = new Dictionary(); columnNames.ForEach(x => { var value = workExp.GetPropertyValue(x); dicts.Add(x, value); }); if (columnNames.Any(x => x == "AttachmentIDs")) dicts["AttachmentIDs"] = workExp.AttachmentIDs; workExpDic.Add(dicts); }); Data.WorkExp = workExpDic; #endregion #region 证件 columnNames = formColumns.Where(x => x.GroupType == "Licence").Select(x => x.ColumnName).ToList(); columnNames = columnNames.Distinct().ToList(); var Licences = await _ghrh_ResumeLicenceServices.QueryDto(x => x.ResumeId != null && x.ResumeId == id); var licenceDic = new List>(); Licences.ForEach(licence => { var dicts = new Dictionary(); columnNames.ForEach(x => { var value = licence.GetPropertyValue(x); dicts.Add(x, value); }); if (columnNames.Any(x => x == "AttachmentIDs")) dicts["AttachmentIDs"] = licence.AttachmentIDs; licenceDic.Add(dicts); }); Data.Licence = licenceDic; #endregion #region 简历培训记录 columnNames = formColumns.Where(x => x.GroupType == "Training").Select(x => x.ColumnName).ToList(); columnNames = columnNames.Distinct().ToList(); var Trainings = await _ghrh_ResumeTrainingServices.QueryDto(x => x.ResumeId != null && x.ResumeId == id); var trainingDic = new List>(); Trainings.ForEach(training => { var dicts = new Dictionary(); columnNames.ForEach(x => { var value = training.GetPropertyValue(x); dicts.Add(x, value); }); if (columnNames.Any(x => x == "AttachmentIDs")) dicts["AttachmentIDs"] = training.AttachmentIDs; trainingDic.Add(dicts); }); Data.Training = trainingDic; #endregion Data.Attachment = await Db.Queryable().Where(x => x.TableName == id.ObjToString()).ToListAsync(); var statements = await _ghrh_ResumeStatementServices.QueryDto(x => x.ResumeId != null && x.ResumeId == id);//证件 Data.Statement = statements.ToDictionary(person => person.StatementCode, person => person.TrueOrFalse); obj.Data = Data; #endregion #region Guide Guide.Title = "应聘信息登记表填写说明"; Guide.CompanyName = "乔邦 Tiobon"; Guide.GuideText = @"

亲爱的小伙伴:

        感谢你对公司的认可。

 

        填写公司岗位应聘表时,请确保信息准确无误。

 

请依次填写个人信息(如姓名、联系方式等)、教育青景、工作经验(从最近到最远列出,包括公司名称、职位和主要职责)等。 强调与职位相关的经历和技能,保持内容简洁明了。

"; obj.Guide = Guide; #endregion #region 承诺 var promiseList = new List { "本人诚实告知未思有各类传染性疾病,若经体检后发现有不符合本公司要求的项目,本人愿意放弃此次应征机会!", "本人正式入职之前,已不与任何单位存在劳动关系,并承诺在工作中不使用曾经服务过的工作单位的技术和商业秘密,如有违背,由此引起的法律纠纷及经济责任由本人承担。" }; obj.Promise = promiseList; #endregion dynamic StatementRemark = new ExpandoObject(); StatementRemark.Top = "员工本人声明(本人填写、提供的资料,是真实的、可靠的。如有虚假,则所签订的劳动合同将自动作废,由此产生的一切后果由本人负责。)"; StatementRemark.CenterPart1 = "根据本人实际情况,在下列"; StatementRemark.CenterPart2 = "中打“√”选择符合项目:"; obj.StatementRemark = StatementRemark; return ServiceResult.OprateSuccess("查询成功", obj); } public async Task> QueryResumeFormColumn(long resumeTemplateID) { var sql = @$"DECLARE @ResumeTemplateID BIGINT = {resumeTemplateID} SELECT A.ColumnName, A.ResumeInfoColumnName ColumnNameDesc, D.GroupType FROM Ghrh_ResumeInfoColumn A LEFT JOIN Ghrh_ResumeTemplateInfoGroupColumn B ON B.ResumeInfoColumnID = A.ID AND B.IsDisplay = 1 AND B.IsEnable = 1 AND A.IsEnable = 1 JOIN Ghrh_ResumeTemplateInfoGroup C ON B.ResumeTemplateInfoGroupID = C.Id JOIN Ghrh_ResumeInfoGroup D ON C.ResumeInfoGroupId = D.ID AND D.IsEnable = 1 WHERE C.ResumeTemplateID = @ResumeTemplateID -- AND D.GroupType = 'Base' ORDER BY D.GroupType, b.SortNo"; return await Db.Ado.SqlQueryAsync(sql); } #endregion #region 简历提交接口 public async Task Submit(long id, string status, ResumeFormColumnSubmit resume) { resume.Base.ApplicationStatus = status; resume.Base.ApplicationTime = DateTime.Now; if (status == "Submit") resume.Base.Status = DIC_INTERVIEW_ORDER_STATUS.WaitRecommended; if (resume.Base.PhotoUrls != null && resume.Base.PhotoUrls.Any()) resume.Base.PhotoUrl = resume.Base.PhotoUrls[0].RelativePath; await base.Update(id, resume.Base); await _ghrh_ResumeHomeServices.Delete(x => x.ResumeId != null && x.ResumeId == id);//家庭关系 await _ghrh_ResumeEduBGServices.Delete(x => x.ResumeId != null && x.ResumeId == id);//教育背景 await _ghrh_ResumeWorkExpServices.Delete(x => x.ResumeId != null && x.ResumeId == id);//工作经历 await _ghrh_ResumeLicenceServices.Delete(x => x.ResumeId != null && x.ResumeId == id);//简历培训记录 await _ghrh_ResumeTrainingServices.Delete(x => x.ResumeId != null && x.ResumeId == id);//证件 await _ghrh_ResumeStatementServices.Delete(x => x.ResumeId != null && x.ResumeId == id);//证件 //await Db.Queryable().Where(x => x.TableName == id.ObjToString()).ToListAsync(); if (resume.Family != null && resume.Family.Any()) { resume.Family.ForEach(x => x.ResumeId = id); await _ghrh_ResumeHomeServices.Add(resume.Family); } if (resume.Education != null && resume.Education.Any()) { resume.Education.ForEach(x => x.ResumeId = id); await _ghrh_ResumeEduBGServices.Add(resume.Education); } if (resume.WorkExp != null && resume.WorkExp.Any()) { resume.WorkExp.ForEach(x => x.ResumeId = id); await _ghrh_ResumeWorkExpServices.Add(resume.WorkExp); } if (resume.Licence != null && resume.Licence.Any()) { resume.Licence.ForEach(x => x.ResumeId = id); await _ghrh_ResumeLicenceServices.Add(resume.Licence); } if (resume.Training != null && resume.Training.Any()) { resume.Training.ForEach(x => x.ResumeId = id); await _ghrh_ResumeTrainingServices.Add(resume.Training); } if (resume.Statement != null && resume.Statement.Any()) { var inserts = new List(); foreach (var item in resume.Statement) { inserts.Add(new InsertGhrh_ResumeStatementInput() { ResumeId = id, StatementCode = item.Key, TrueOrFalse = item.Value }); } await _ghrh_ResumeStatementServices.Add(inserts); } await Db.Updateable() .SetColumns(it => new Ghrs_Attachment() { TableName = null }) .Where(it => it.TableName == id.ToString()) .ExecuteCommandAsync(); if (resume.Attachment != null && resume.Attachment.Any()) { for (int i = 0; i < resume.Attachment.Count; i++) { await Db.Updateable() .SetColumns(it => new Ghrs_Attachment() { TableName = id.ToString(), RemarkSz = resume.Attachment[i].RemarkSz }) .Where(it => it.RelativePath == resume.Attachment[i].RelativePath) .ExecuteCommandAsync(); } } return ServiceResult.OprateSuccess(); } #endregion #region 查询招聘表单信息提交结果接口 public async Task> QueryResult(long id, int langId) { dynamic Data = new ExpandoObject(); var entity = await QueryById(id); if (entity is null) throw new Exception("无效的ID!"); decimal completionDegree = 0; var groups = await Db.Ado.SqlQueryAsync("select GroupName tabName, GroupType type from Ghrh_ResumeInfoGroup where IsEnable=1 and GroupType !='Photo' and GroupType !='Attachment'"); int count = groups.Count; #region 基础数据 var notNUllCount = 0; var formColumns = await QueryResumeFormColumn(1); var columnNames = formColumns.Where(x => x.GroupType == "Base").Select(x => x.ColumnName).ToList(); columnNames = columnNames.Distinct().ToList(); columnNames.ForEach(x => { var value = entity.GetPropertyValue(x); if (value != null) notNUllCount++; }); var basePercent = (decimal)notNUllCount / columnNames.Count * 100; completionDegree += basePercent; #endregion #region 家庭关系 decimal familyPercent = 0; var familys = await _ghrh_ResumeHomeServices.QueryDto(x => x.ResumeId != null && x.ResumeId == id); if (familys.Any()) { notNUllCount = 0; columnNames = formColumns.Where(x => x.GroupType == "Family").Select(x => x.ColumnName).ToList(); columnNames = columnNames.Distinct().ToList(); columnNames.ForEach(x => { var value = entity.GetPropertyValue(x); if (value != null) notNUllCount++; }); familyPercent = (decimal)notNUllCount / (columnNames.Count * familys.Count) * 100; completionDegree += familyPercent; } #endregion #region 教育背景 decimal educationPercent = 0; var educations = await _ghrh_ResumeEduBGServices.QueryDto(x => x.ResumeId != null && x.ResumeId == id); if (educations.Any()) { notNUllCount = 0; columnNames = formColumns.Where(x => x.GroupType == "Education").Select(x => x.ColumnName).ToList(); columnNames = columnNames.Distinct().ToList(); columnNames.ForEach(x => { var value = entity.GetPropertyValue(x); if (value != null) notNUllCount++; }); educationPercent = (decimal)notNUllCount / (columnNames.Count * educations.Count) * 100; completionDegree += educationPercent; } #endregion #region 工作经历 decimal workExpPercent = 0; var workExps = await _ghrh_ResumeWorkExpServices.QueryDto(x => x.ResumeId != null && x.ResumeId == id); if (workExps.Any()) { notNUllCount = 0; columnNames = formColumns.Where(x => x.GroupType == "WorkExp").Select(x => x.ColumnName).ToList(); columnNames = columnNames.Distinct().ToList(); columnNames.ForEach(x => { var value = entity.GetPropertyValue(x); if (value != null) notNUllCount++; }); workExpPercent = (decimal)notNUllCount / (columnNames.Count * workExps.Count) * 100; completionDegree += workExpPercent; } #endregion #region 证件 decimal licencePercent = 0; var licences = await _ghrh_ResumeLicenceServices.QueryDto(x => x.ResumeId != null && x.ResumeId == id); if (licences.Any()) { notNUllCount = 0; columnNames = formColumns.Where(x => x.GroupType == "Licence").Select(x => x.ColumnName).ToList(); columnNames = columnNames.Distinct().ToList(); columnNames.ForEach(x => { var value = entity.GetPropertyValue(x); if (value != null) notNUllCount++; }); licencePercent = (decimal)notNUllCount / (columnNames.Count * licences.Count) * 100; completionDegree += licencePercent; } #endregion #region 培训 decimal trainingPercent = 0; var trainings = await _ghrh_ResumeTrainingServices.QueryDto(x => x.ResumeId != null && x.ResumeId == id); if (trainings.Any()) { notNUllCount = 0; columnNames = formColumns.Where(x => x.GroupType == "Training").Select(x => x.ColumnName).ToList(); columnNames = columnNames.Distinct().ToList(); columnNames.ForEach(x => { var value = entity.GetPropertyValue(x); if (value != null) notNUllCount++; }); trainingPercent = (decimal)notNUllCount / (columnNames.Count * trainings.Count) * 100; completionDegree += trainingPercent; } #endregion #region 声明 decimal statementPercent = 0; var statements = await _ghrh_ResumeStatementServices.QueryDto(x => x.ResumeId != null && x.ResumeId == id);//证件 if (statements.Any()) { notNUllCount = statements.Count; statementPercent = (decimal)notNUllCount / columnNames.Count * 100; completionDegree += statementPercent; } #endregion completionDegree = completionDegree / count; Dictionary dics = new() { { "Base", Convert.ToInt32(StringHelper.TrimDecimalString(StringHelper.TrimDecimalString(basePercent, 0))) }, { "Family", Convert.ToInt32(StringHelper.TrimDecimalString(StringHelper.TrimDecimalString(familyPercent, 0))) }, { "Education", Convert.ToInt32(StringHelper.TrimDecimalString(StringHelper.TrimDecimalString(educationPercent, 0))) }, { "WorkExp", Convert.ToInt32(StringHelper.TrimDecimalString(StringHelper.TrimDecimalString(workExpPercent, 0))) }, { "Licence", Convert.ToInt32(StringHelper.TrimDecimalString(StringHelper.TrimDecimalString(licencePercent, 0))) }, { "Training", Convert.ToInt32(StringHelper.TrimDecimalString(StringHelper.TrimDecimalString(trainingPercent, 0))) }, { "Statement", Convert.ToInt32(StringHelper.TrimDecimalString(StringHelper.TrimDecimalString(statementPercent, 0))) } }; var seriesData = new List(); var xAxisData = new List(); groups.ForEach(x => { if (dics.ContainsKey(x.type)) { seriesData.Add(dics[x.type]); xAxisData.Add(x.tabName); } }); Data.CompletionDegree = StringHelper.TrimDecimalString(StringHelper.TrimDecimalString(completionDegree, 2)); Data.SeriesData = seriesData; Data.XAxisData = xAxisData; Data.StaffName = entity.StaffName; Data.PhotoUrl = entity.PhotoUrl; return ServiceResult.OprateSuccess("查询成功", Data); } #endregion #region 导出Excel public async Task> Export(QueryBody filter, string condition, bool? IsEnable = true) { filter.pageNum = 1; filter.pageSize = 100000; var data = await QueryFilterPage(filter, condition, IsEnable); var formColumns = await QueryResumeFormColumn(1); formColumns.ForEach(x => { if (x.GroupType == "Base") { if (x.ColumnName == "TitleId") x.ColumnName = "TitleName"; else if (x.ColumnName == "Gender") x.ColumnName = "GenderLabel"; else if (x.ColumnName == "Education") x.ColumnName = "EducationLabel"; else if (x.ColumnName == "Nation") x.ColumnName = "NationLabel"; else if (x.ColumnName == "MaritalStatus") x.ColumnName = "MaritalStatusLabel"; else if (x.ColumnName == "PoliticStatus") x.ColumnName = "PoliticStatusLabel"; else if (x.ColumnName == "UrgentRelation") x.ColumnName = "UrgentRelationLabel"; else if (x.ColumnName == "CertificateType") x.ColumnName = "CertificateTypeLabel"; else if (x.ColumnName == "RegisteredType") x.ColumnName = "RegisteredTypeLabel"; } }); var menuName = string.Empty; string sql = "select QueryProcedure, EditProcedure, IUDProcedure, MenuName from Ghrs_Menu where MenuNo='{0}'"; sql = string.Format(sql, filter.menuName); var dt = await Db.Ado.GetDataTableAsync(sql); if (dt.Rows.Count > 0) { menuName = dt.Rows[0]["MenuName"].ToString(); } var dic = formColumns.Where(x => x.GroupType == "Base").ToDictionary(item => item.ColumnNameDesc, item => item.ColumnName); var name = menuName + "_" + DateTimeHelper.ConvertToSecondString1(DateTime.Now); var physicsPath1 = await ReportHelper.SendFile(data.result.DT_TableDataT1.AsQueryable(), name, null, dic, null, null, menuName); var result = ServiceResult.OprateSuccess(name + ".xlsx", physicsPath1); return result; } #endregion #region 简历推荐 public async Task Recommend(long id, ResumeRecommendForm recommend) { if (await AnyAsync(x => x.Status == DIC_INTERVIEW_ORDER_STATUS.HasRecommended || x.Status == DIC_INTERVIEW_ORDER_STATUS.HasRecommended || x.Status == DIC_INTERVIEW_ORDER_STATUS.WaitAppointment || x.Status == DIC_INTERVIEW_ORDER_STATUS.WaitInterview || x.Status == DIC_INTERVIEW_ORDER_STATUS.HasInterview)) return ServiceResult.OprateFailed("简历正推荐中,不可重复推荐!"); await Db.Updateable() .SetColumns(it => it.IsEnable == 0) .Where(it => it.ResumeId == id) .ExecuteCommandAsync(); var orderId = await _ghrh_InterviewOrderServices.Add(new InsertGhrh_InterviewOrderInput() { ResumeId = id, RequestId = recommend.RequestId, RecommendTime = DateTime.Now, RecommendId = App.User.ID, Round = 1, OrderNo = await GenerateContinuousSequence("Ghrh_InterviewOrder", "OrderNo", "V"), Status = DIC_INTERVIEW_ORDER_STATUS.HasRecommended }); for (int i = 0; i < recommend.InterviewStaffs.Count; i++) await _ghrh_InterviewRecordServices.Add(new InsertGhrh_InterviewRecordInput() { OrderId = orderId, Round = 1, Status = DIC_INTERVIEW_ORDER_STATUS.HasRecommended, StaffId = recommend.InterviewStaffs[i].StaffId, }); return ServiceResult.OprateSuccess(); } #endregion #region 已推荐提醒 public async Task RemindHasRecommend(long id) { var entity = await base.QueryById(id); if (entity == null) return ServiceResult.OprateFailed("无效的简历ID!"); if (entity.Status != DIC_INTERVIEW_ORDER_STATUS.HasRecommended) return ServiceResult.OprateFailed("非【已推荐】状态下简历不可发送提醒!"); var order = await _ghrh_InterviewOrderServices.QuerySingle(x => x.ResumeId == id); if (order != null) { var records = await _ghrh_InterviewRecordServices.Query(x => x.Round == order.Round && x.OrderId == order.Id); //if (record.FirstViewTime.IsNotEmptyOrNull()) // return ServiceResult.OprateFailed("面试官已查看简历,暂不可发送提醒!"); for (int i = 0; i < records.Count; i++) { if (records[i].FirstViewTime.IsNotEmptyOrNull()) await SendMessage([records[i].StaffId.Value], "简历提醒", "您有个简历推荐,请及时查看!"); } var usser = await GetUser(); await _ghrh_InterviewLogServices.Add(new InsertGhrh_InterviewLogInput() { OrderId = order.Id, RemarkSz = $"用户【{usser?.UserName ?? App.User.ID.ToString()}】发送简历推荐提醒!" }); } return ServiceResult.OprateSuccess(); } #endregion #region 面试官约面 public async Task SubscribeInterview(long id, List times) { var entity = await base.QueryById(id); if (entity == null) return ServiceResult.OprateFailed("无效的简历ID!"); if (entity.Status != DIC_INTERVIEW_ORDER_STATUS.HasRecommended) return ServiceResult.OprateFailed("【已推荐】状态下才能约面!"); times.ForEach(x => { if (x.IndexOf("~") < 0) throw new Exception($"传入时间【{x}】无效,请检查格式!"); var array = x.Split('~'); try { Convert.ToDateTime(array[0]); Convert.ToDateTime(array[1]); } catch (Exception) { throw new Exception($"传入时间【{x}】无效,请检查格式!"); } }); var order = await _ghrh_InterviewOrderServices.QuerySingle(x => x.ResumeId == id); if (order != null) { var records = await _ghrh_InterviewRecordServices.Query(x => x.Round == order.Round && x.OrderId == order.Id); for (int i = 0; i < times.Count; i++) { if (i == 0) records.ForEach(record => record.PlanInterviewTime1 = times[i]); else if (i == 1) records.ForEach(record => record.PlanInterviewTime2 = times[i]); else if (i == 2) records.ForEach(record => record.PlanInterviewTime3 = times[i]); } records.ForEach(record => record.Status = DIC_INTERVIEW_ORDER_STATUS.WaitAppointment); await _ghrh_InterviewRecordServices.Update(records[0], ["PlanInterviewTime1", "PlanInterviewTime2", "PlanInterviewTime3", "Status"]); var usser = await GetUser(); await _ghrh_InterviewLogServices.Add(new InsertGhrh_InterviewLogInput() { OrderId = order.Id, RemarkSz = $"用户【{usser?.UserName ?? App.User.ID.ToString()}】预约面试,面试时间:{string.Join("、", times)}!" }); entity.Status = DIC_INTERVIEW_ORDER_STATUS.WaitAppointment; await Update(entity, ["Status"]); } return ServiceResult.OprateSuccess(); } #endregion #region 安排面试 public async Task ScheduleInterview(long id, string time) { var entity = await base.QueryById(id); if (entity == null) return ServiceResult.OprateFailed("无效的简历ID!"); if (entity.Status != DIC_INTERVIEW_ORDER_STATUS.WaitAppointment) return ServiceResult.OprateFailed("【待预约】状态下才能安排面试!"); if (time.IndexOf("~") < 0) throw new Exception($"传入时间【{time}】无效,请检查格式!"); var array = time.Split('~'); try { Convert.ToDateTime(array[0]); Convert.ToDateTime(array[1]); } catch (Exception) { throw new Exception($"传入时间【{time}】无效,请检查格式!"); } var order = await _ghrh_InterviewOrderServices.QuerySingle(x => x.ResumeId == id); if (order != null) { var records = await _ghrh_InterviewRecordServices.Query(x => x.Round == order.Round && x.OrderId == order.Id); records.ForEach(record => { record.InterviewTime = time; record.InterviewBeginTime = Convert.ToDateTime(array[0]); record.InterviewEndTime = Convert.ToDateTime(array[1]); record.Status = DIC_INTERVIEW_ORDER_STATUS.WaitInterview; }); await _ghrh_InterviewRecordServices.Update(records, ["InterviewTime", "InterviewBeginTime", "InterviewEndTime", "Status"]); var usser = await GetUser(); await _ghrh_InterviewLogServices.Add(new InsertGhrh_InterviewLogInput() { OrderId = order.Id, RemarkSz = $"用户【{usser?.UserName ?? App.User.ID.ToString()}】安排面试,面试时间:{time}!" }); entity.Status = DIC_INTERVIEW_ORDER_STATUS.WaitInterview; await Update(entity, ["Status"]); } return ServiceResult.OprateSuccess(); } #endregion #region 变更面试时间 public async Task ModifyInterviewTime(long id, string time) { var entity = await base.QueryById(id); if (entity == null) return ServiceResult.OprateFailed("无效的简历ID!"); if (entity.Status != DIC_INTERVIEW_ORDER_STATUS.WaitInterview) return ServiceResult.OprateFailed("【待面试】状态下才能变更面试时间!"); if (time.IndexOf("~") < 0) throw new Exception($"传入时间【{time}】无效,请检查格式!"); var array = time.Split('~'); try { Convert.ToDateTime(array[0]); Convert.ToDateTime(array[1]); } catch (Exception) { throw new Exception($"传入时间【{time}】无效,请检查格式!"); } var order = await _ghrh_InterviewOrderServices.QuerySingle(x => x.ResumeId == id); if (order != null) { var records = await _ghrh_InterviewRecordServices.Query(x => x.Round == order.Round && x.OrderId == order.Id); records.ForEach(record => { record.InterviewTime = time; record.InterviewBeginTime = Convert.ToDateTime(array[0]); record.InterviewEndTime = Convert.ToDateTime(array[1]); record.Status = DIC_INTERVIEW_ORDER_STATUS.WaitInterview; }); await _ghrh_InterviewRecordServices.Update(records, ["InterviewTime", "InterviewBeginTime", "InterviewEndTime", "Status"]); //if (record.ReceiverIds.IsNotEmptyOrNull()) //{ // var staffs = JsonHelper.JsonToObj>(record.ReceiverIds); // await SendMessage(staffs.Select(x => x.StaffId).ToList(), "简历提醒", "您有个简历【待面试】,请及时查看面试时间!"); //} var usser = await GetUser(); await _ghrh_InterviewLogServices.Add(new InsertGhrh_InterviewLogInput() { OrderId = order.Id, RemarkSz = $"用户【{usser?.UserName ?? App.User.ID.ToString()}】变更面试时间,面试时间:{time}!" }); entity.Status = DIC_INTERVIEW_ORDER_STATUS.WaitInterview; await Update(entity, ["Status"]); } return ServiceResult.OprateSuccess(); } #endregion #region 待面试提醒 public async Task RemindWaitInterview(long id) { var entity = await base.QueryById(id); if (entity == null) return ServiceResult.OprateFailed("无效的简历ID!"); if (entity.Status != DIC_INTERVIEW_ORDER_STATUS.WaitInterview) return ServiceResult.OprateFailed("非【待面试】状态下简历不可发送提醒!"); var order = await _ghrh_InterviewOrderServices.QuerySingle(x => x.ResumeId == id); if (order != null) { var records = await _ghrh_InterviewRecordServices.Query(x => x.Round == order.Round && x.OrderId == order.Id); for (int i = 0; i < records.Count; i++) { if (records[i].FirstViewTime.IsNotEmptyOrNull()) await SendMessage([records[i].StaffId.Value], "简历提醒", "您有个简历【待面试】,请及时查看面试时间!"); } var usser = await GetUser(); await _ghrh_InterviewLogServices.Add(new InsertGhrh_InterviewLogInput() { OrderId = order.Id, RemarkSz = $"用户【{usser?.UserName ?? App.User.ID.ToString()}】发送待面试提醒!" }); } return ServiceResult.OprateSuccess(); } #endregion #region 重新安排面试 public async Task RescheduleInterview(long id, ResumeRescheduleInterviewForm input, string type) { var entity = await base.QueryById(id); if (entity == null) return ServiceResult.OprateFailed("无效的简历ID!"); var order = await _ghrh_InterviewOrderServices.QuerySingle(x => x.ResumeId == id); if (type == "Reschedule") { //if (entity.Status != DIC_INTERVIEW_ORDER_STATUS.WaitInterview) // return ServiceResult.OprateFailed("【待】状态下才能安排面试!"); if (input.Time.IndexOf("~") < 0) throw new Exception($"传入时间【{input.Time}】无效,请检查格式!"); var array = input.Time.Split('~'); try { Convert.ToDateTime(array[0]); Convert.ToDateTime(array[1]); } catch (Exception) { throw new Exception($"传入时间【{input.Time}】无效,请检查格式!"); } if (order != null) { order.Round++; order.Status = DIC_INTERVIEW_ORDER_STATUS.WaitInterview; await _ghrh_InterviewOrderServices.Update(order, ["Status", "Round"]); for (int i = 0; i < input.InterviewStaffs.Count; i++) { await _ghrh_InterviewRecordServices.Add(new InsertGhrh_InterviewRecordInput() { OrderId = order.Id, Round = order.Round, StaffId = input.InterviewStaffs[i].StaffId, InterviewTime = input.Time, PlanInterviewTime1 = input.Time, InterviewBeginTime = Convert.ToDateTime(array[0]), InterviewEndTime = Convert.ToDateTime(array[1]), Status = DIC_INTERVIEW_ORDER_STATUS.WaitInterview }); } var usser = await GetUser(); await _ghrh_InterviewLogServices.Add(new InsertGhrh_InterviewLogInput() { OrderId = order.Id, RemarkSz = $"用户【{usser?.UserName ?? App.User.ID.ToString()}】发起一个新的面试,面试时间:{input.Time}!" }); entity.Status = DIC_INTERVIEW_ORDER_STATUS.WaitInterview; await Update(entity, ["Status"]); if (input.InterviewStaffs.IsNotEmptyOrNull()) await SendMessage(input.InterviewStaffs.Select(x => x.StaffId).ToList(), "简历提醒", "您有个新的邀约面试,请及时查看!"); } } else { if (order != null) { order.Round++; order.Status = DIC_INTERVIEW_ORDER_STATUS.HasRecommended; await _ghrh_InterviewOrderServices.Update(order, ["Status", "Round"]); entity.Status = DIC_INTERVIEW_ORDER_STATUS.HasRecommended; await Update(entity, ["Status"]); for (int i = 0; i < input.InterviewStaffs.Count; i++) await _ghrh_InterviewRecordServices.Add(new InsertGhrh_InterviewRecordInput() { OrderId = order.Id, Round = order.Round, Status = DIC_INTERVIEW_ORDER_STATUS.HasRecommended, StaffId = input.InterviewStaffs[i].StaffId, }); if (input.InterviewStaffs.IsNotEmptyOrNull()) await SendMessage(input.InterviewStaffs.Select(x => x.StaffId).ToList(), "简历提醒", "您有个新的推荐简历,请及时查看!"); } } return ServiceResult.OprateSuccess(); } #endregion #region 面试评估 public async Task AssessInterview(long id, ResumeAssessInterviewForm input) { var entity = await base.QueryById(id); if (entity == null) return ServiceResult.OprateFailed("无效的简历ID!"); var order = await _ghrh_InterviewOrderServices.QuerySingle(x => x.ResumeId == id); order.Status = DIC_INTERVIEW_ORDER_STATUS.HasInterview; order.IsPass = input.IsPass; order.InterviewResult = input.Content; await _ghrh_InterviewOrderServices.Update(order, ["Status", "IsPass", "InterviewResult"]); var record = await _ghrh_InterviewRecordServices.QuerySingle(x => x.Round == order.Round && x.OrderId == order.Id && x.StaffId == GetStaffId()); record.InterviewResult = input.Content; record.IsPass = input.IsPass; record.AssessTime = DateTime.Now; record.Status = DIC_INTERVIEW_ORDER_STATUS.HasInterview; await _ghrh_InterviewRecordServices.Update(record, ["AssessTime", "Status", "IsPass", "InterviewResult"]); var usser = await GetUser(); await _ghrh_InterviewLogServices.Add(new InsertGhrh_InterviewLogInput() { OrderId = order.Id, RemarkSz = $"用户【{usser?.UserName ?? App.User.ID.ToString()}】填写了面试评估,轮数:{order.Round},是否通过:{(input.IsPass == true ? "通过" : "不通过")},内容:{input.Content}!" }); return ServiceResult.OprateSuccess(); } #endregion #region 变更面试官 public async Task ModifyInterviewer(long id, List InterviewStaffs) { var entity = await base.QueryById(id); if (entity == null) return ServiceResult.OprateFailed("无效的简历ID!"); var order = await _ghrh_InterviewOrderServices.QuerySingle(x => x.ResumeId == id); var record = await _ghrh_InterviewRecordServices.QuerySingle(x => x.Round == order.Round && x.OrderId == order.Id); var insertRecord = Mapper.Map(record).ToANew(); await _ghrh_InterviewRecordServices.Delete(x => x.Round == order.Round && x.OrderId == order.Id); for (int i = 0; i < InterviewStaffs.Count; i++) { insertRecord.StaffId = InterviewStaffs[i].StaffId; await _ghrh_InterviewRecordServices.Add(insertRecord); } var usser = await GetUser(); await _ghrh_InterviewLogServices.Add(new InsertGhrh_InterviewLogInput() { OrderId = order.Id, RemarkSz = $"用户【{usser?.UserName ?? App.User.ID.ToString()}】变更面试官!" }); return ServiceResult.OprateSuccess(); } #endregion #region 发offer public async Task SendOffer(long id) { var entity = await base.QueryById(id); if (entity == null) return ServiceResult.OprateFailed("无效的简历ID!"); entity.Status = DIC_INTERVIEW_ORDER_STATUS.HasSendOffer; await Update(entity, ["Status"]); var order = await _ghrh_InterviewOrderServices.QuerySingle(x => x.ResumeId == id); order.Status = DIC_INTERVIEW_ORDER_STATUS.HasSendOffer; await _ghrh_InterviewOrderServices.Update(order, ["Status"]); var records = await _ghrh_InterviewRecordServices.Query(x => x.Round == order.Round && x.OrderId == order.Id); records.ForEach(record => record.Status = DIC_INTERVIEW_ORDER_STATUS.HasSendOffer); await _ghrh_InterviewRecordServices.Update(records, ["Status"]); var usser = await GetUser(); await _ghrh_InterviewLogServices.Add(new InsertGhrh_InterviewLogInput() { OrderId = order.Id, RemarkSz = $"用户【{usser?.UserName ?? App.User.ID.ToString()}】变更状态为:已发offer!" }); return ServiceResult.OprateSuccess(); } #endregion #region 已发offer提醒 public async Task RemindHasOffer(long id) { var entity = await base.QueryById(id); if (entity == null) return ServiceResult.OprateFailed("无效的简历ID!"); if (entity.Status != DIC_INTERVIEW_ORDER_STATUS.HasSendOffer) return ServiceResult.OprateFailed("非【已发offer】状态下简历不可发送提醒!"); var order = await _ghrh_InterviewOrderServices.QuerySingle(x => x.ResumeId == id); if (order != null) { //var record = await _ghrh_InterviewRecordServices.QuerySingle(x => x.Round == order.Round && x.OrderId == order.Id); //if (record.ReceiverIds.IsNotEmptyOrNull()) //{ // var staffs = JsonHelper.JsonToObj>(record.ReceiverIds); // await SendMessage(staffs.Select(x => x.StaffId).ToList(), "简历提醒", "您有个简历【待面试】,请及时查看面试时间!"); //} var usser = await GetUser(); await _ghrh_InterviewLogServices.Add(new InsertGhrh_InterviewLogInput() { OrderId = order.Id, RemarkSz = $"用户【{usser?.UserName ?? App.User.ID.ToString()}】发送待已发offer提醒!" }); } return ServiceResult.OprateSuccess(); } #endregion #region 变更是否报道 public async Task ModifyIsOffer(long id, bool isOffer) { var entity = await base.QueryById(id); if (entity == null) return ServiceResult.OprateFailed("无效的简历ID!"); //if (entity.Status != DIC_INTERVIEW_ORDER_STATUS.HasSendOffer) // return ServiceResult.OprateFailed("非【已发offer】状态下简历不可发送提醒!"); var order = await _ghrh_InterviewOrderServices.QuerySingle(x => x.ResumeId == id); if (order != null) { var records = await _ghrh_InterviewRecordServices.Query(x => x.Round == order.Round && x.OrderId == order.Id); if (isOffer) { entity.Status = DIC_INTERVIEW_ORDER_STATUS.HasOffer; order.Status = DIC_INTERVIEW_ORDER_STATUS.HasOffer; records.ForEach(record => record.Status = DIC_INTERVIEW_ORDER_STATUS.HasOffer); } await Update(entity, ["Status"]); await _ghrh_InterviewOrderServices.Update(order, ["Status"]); await _ghrh_InterviewRecordServices.Update(records, ["Status"]); var usser = await GetUser(); await _ghrh_InterviewLogServices.Add(new InsertGhrh_InterviewLogInput() { OrderId = order.Id, RemarkSz = $"用户【{usser?.UserName ?? App.User.ID.ToString()}】变更是否报道!" }); } return ServiceResult.OprateSuccess(); } #endregion }