diff --git a/Tiobon.Core.IServices/Ghrh/IGhrh_ResumeServices.cs b/Tiobon.Core.IServices/Ghrh/IGhrh_ResumeServices.cs index 5af842eb..0451c292 100644 --- a/Tiobon.Core.IServices/Ghrh/IGhrh_ResumeServices.cs +++ b/Tiobon.Core.IServices/Ghrh/IGhrh_ResumeServices.cs @@ -92,4 +92,6 @@ public interface IGhrh_ResumeServices : IBaseServices> QueryHireList(QueryBody filter); Task> ExportHireExcel(QueryExport body); + + Task InterviewOrderOverTime(); } \ No newline at end of file diff --git a/Tiobon.Core.Services/Ghrh/Ghrh_ResumeServices.cs b/Tiobon.Core.Services/Ghrh/Ghrh_ResumeServices.cs index 95d81bd2..f575dc5b 100644 --- a/Tiobon.Core.Services/Ghrh/Ghrh_ResumeServices.cs +++ b/Tiobon.Core.Services/Ghrh/Ghrh_ResumeServices.cs @@ -2450,7 +2450,7 @@ A.DataType, A.ColumnType, A.IsRequired, A.DataSourceType, A.DataSource, A.DataSo #endregion #region 处理人力需求单 录用人数 - if (order.RequestId.IsNotEmptyOrNull() ) + if (order.RequestId.IsNotEmptyOrNull()) { var sql = $@"UPDATE Ghrh_HumanRequest SET OfferCount = ISNULL (OfferCount, 0) + 1 @@ -3161,19 +3161,58 @@ WHERE A.IsEnable = 1 AND C.IsEnable = 1 #region 回收站中的简历30天后自动删除 public async Task OverTimeDeleteResume() { - var dt = Db.GetDate().AddDays(-30); + int day = 30; - var list = await base.Query(x => x.Status == "Recycled" && x.RecycledTime <= dt); + var config = await Db.Queryable().Where(x => x.ConfigCode == "Recruit_Over_Time_Delete_Resume").FirstAsync(); + if (config != null) + day = config.ConfigValue.ObjToInt(); + + var dt = Db.GetDate().AddDays(-day); + + var list = await base.Query(x => x.Status == DIC_INTERVIEW_ORDER_STATUS.Recycled && x.RecycledTime <= dt); + var ids = list.Select(x => x.Id).ToList(); + if (ids.Any()) + await Db.Updateable() + .SetColumns(it => new Ghrh_Resume() + { + IsEnable = 0 + }, true) + .Where(it => ids.Contains(it.Id)) + .ExecuteCommandAsync(); + return ServiceResult.OprateSuccess(); + } + #endregion + + #region 面试超时逾期 + public async Task InterviewOrderOverTime() + { + int day = 3; + + var config = await Db.Queryable().Where(x => x.ConfigCode == "Recruit_Interview_Order_Over_Time").FirstAsync(); + if (config != null) + day = config.ConfigValue.ObjToInt(); + + var dt = Db.GetDate().AddDays(-day); + + var list = await Db.Queryable().Where(x => x.Status == DIC_INTERVIEW_ORDER_STATUS.HasRecommended && x.RecommendTime <= dt).ToListAsync(); var ids = list.Select(x => x.Id).ToList(); + var resumeIds = list.Select(x => x.ResumeId).ToList(); if (ids.Any()) + await Db.Updateable() + .SetColumns(it => new Ghrh_InterviewOrder() + { + Status = DIC_INTERVIEW_ORDER_STATUS.Expire + }, true) + .Where(it => ids.Contains(it.Id)) + .ExecuteCommandAsync(); + if (resumeIds.Any()) await Db.Updateable() .SetColumns(it => new Ghrh_Resume() { - IsEnable = 0, - UpdateBy = App.User.ID, - UpdateTime = DateTime.Now, - }) - .Where(it => ids.Contains(it.Id)).ExecuteCommandAsync(); + Status = DIC_INTERVIEW_ORDER_STATUS.Expire + }, true) + .Where(it => resumeIds.Contains(it.Id)) + .ExecuteCommandAsync(); return ServiceResult.OprateSuccess(); } #endregion @@ -5012,7 +5051,7 @@ WHERE A.IsEnable = 1 AND C.IsEnable = 1 var order = await _ghrh_InterviewOrderServices.QuerySingle(x => x.ResumeId == id); if (order.RequestId.IsNotEmptyOrNull()) { - sql = $@"UPDATE Ghrh_HumanRequest + sql = $@"UPDATE Ghrh_HumanRequest SET CheckInCount = ISNULL (CheckInCount, 0) + 1 WHERE Id = {order.RequestId}"; await Db.Ado.ExecuteCommandAsync(sql); diff --git a/Tiobon.Core.Tasks/QuartzNet/Jobs/Job_InterviewOrderOverTime_Quartz.cs b/Tiobon.Core.Tasks/QuartzNet/Jobs/Job_InterviewOrderOverTime_Quartz.cs new file mode 100644 index 00000000..39cc52e3 --- /dev/null +++ b/Tiobon.Core.Tasks/QuartzNet/Jobs/Job_InterviewOrderOverTime_Quartz.cs @@ -0,0 +1,24 @@ +/// +/// 这里要注意下,命名空间和程序集是一样的,不然反射不到 +/// +namespace Tiobon.Core.Tasks; + +public class Job_InterviewOrderOverTime_Quartz : JobBase, IJob +{ + private readonly IGhrh_ResumeServices _ghrh_ResumeServices; + + public Job_InterviewOrderOverTime_Quartz(IGhrh_ResumeServices ghrh_ResumeServices, ITasksQzServices tasksQzServices, ITasksLogServices tasksLogServices) + : base(tasksQzServices, tasksLogServices) + { + _ghrh_ResumeServices = ghrh_ResumeServices; + } + public async Task Execute(IJobExecutionContext context) + { + var executeLog = await ExecuteJob(context, async () => await Run(context)); + } + public async Task Run(IJobExecutionContext context) + { + Console.WriteLine($"Job_InterviewOrderOverTime_Quartz 执行 {DateTime.Now.ToShortTimeString()}"); + await _ghrh_ResumeServices.InterviewOrderOverTime(); + } +}