diff --git a/Tiobon.Core.Api/Controllers/Ghrh/Ghrh_ResumeController.cs b/Tiobon.Core.Api/Controllers/Ghrh/Ghrh_ResumeController.cs index 7d30779c..4900b4f2 100644 --- a/Tiobon.Core.Api/Controllers/Ghrh/Ghrh_ResumeController.cs +++ b/Tiobon.Core.Api/Controllers/Ghrh/Ghrh_ResumeController.cs @@ -280,9 +280,9 @@ public class Ghrh_ResumeController : BaseController RemindWaitInterview([FromBody] List ids) => await _service.RemindWaitInterview(ids); #endregion - #region 重新安排面试-直接发起 + #region 重新安排面试-直接发起新的 /// - /// 重新安排面试-直接发起 + /// 重新安排面试-直接发起新的 /// /// 简历Id /// input diff --git a/Tiobon.Core.Api/Tiobon.Core.Model.xml b/Tiobon.Core.Api/Tiobon.Core.Model.xml index 671dc563..3e3fa962 100644 --- a/Tiobon.Core.Api/Tiobon.Core.Model.xml +++ b/Tiobon.Core.Api/Tiobon.Core.Model.xml @@ -7880,26 +7880,6 @@ 取消原因 - - - 面试环节 - - - - - 筛选反馈 - - - - - 约面反馈 - - - - - 录用反馈 - - 状态 @@ -7975,6 +7955,36 @@ 预留字段12 + + + 约面反馈 + + + + + 筛选反馈 + + + + + 录用反馈 + + + + + 面试环节 + + + + + 主面试人 + + + + + 邮箱 + + 录用审批单 (Dto.Base) @@ -21511,26 +21521,6 @@ 取消原因 - - - 面试环节 - - - - - 约面反馈 - - - - - 筛选反馈 - - - - - 录用反馈 - - 状态 @@ -21606,6 +21596,36 @@ 预留字段12 + + + 约面反馈 + + + + + 筛选反馈 + + + + + 录用反馈 + + + + + 面试环节 + + + + + 主面试人 + + + + + 邮箱 + + 录用审批单 (Model) diff --git a/Tiobon.Core.Api/Tiobon.Core.xml b/Tiobon.Core.Api/Tiobon.Core.xml index 752f0fba..8ddb88ed 100644 --- a/Tiobon.Core.Api/Tiobon.Core.xml +++ b/Tiobon.Core.Api/Tiobon.Core.xml @@ -1491,7 +1491,7 @@ - 重新安排面试-直接发起 + 重新安排面试-直接发起新的 简历Id input diff --git a/Tiobon.Core.Model/Base/Ghrh/Ghrh_InterviewRecord.Dto.Base.cs b/Tiobon.Core.Model/Base/Ghrh/Ghrh_InterviewRecord.Dto.Base.cs index 4473099a..c74b460f 100644 --- a/Tiobon.Core.Model/Base/Ghrh/Ghrh_InterviewRecord.Dto.Base.cs +++ b/Tiobon.Core.Model/Base/Ghrh/Ghrh_InterviewRecord.Dto.Base.cs @@ -6,7 +6,7 @@ * * Ver 变更日期 负责人 变更内容 * ─────────────────────────────────── -*V0.01 2024/11/26 14:47:26 SimonHsiao 初版 +*V0.01 2024/12/20 13:58:20 SimonHsiao 初版 * * Copyright(c) 2024 Tiobon Corporation. All Rights Reserved. *┌──────────────────────────────────┐ @@ -122,30 +122,6 @@ public class Ghrh_InterviewRecordBase [Display(Name = "CancelReason"), Description("取消原因"), MaxLength(256, ErrorMessage = "取消原因 不能超过 256 个字符")] public string CancelReason { get; set; } - /// - /// 面试环节 - /// - [Display(Name = "InterviewStepName"), Description("面试环节"), MaxLength(32, ErrorMessage = "面试环节 不能超过 32 个字符")] - public string InterviewStepName { get; set; } - - /// - /// 筛选反馈 - /// - [Display(Name = "FilterFeedback"), Description("筛选反馈"), MaxLength(256, ErrorMessage = "筛选反馈 不能超过 256 个字符")] - public string FilterFeedback { get; set; } - - /// - /// 约面反馈 - /// - [Display(Name = "AppointmentFeedback"), Description("约面反馈"), MaxLength(256, ErrorMessage = "约面反馈 不能超过 256 个字符")] - public string AppointmentFeedback { get; set; } - - /// - /// 录用反馈 - /// - [Display(Name = "OfferFeedback"), Description("录用反馈"), MaxLength(256, ErrorMessage = "录用反馈 不能超过 256 个字符")] - public string OfferFeedback { get; set; } - /// /// 状态 /// @@ -232,4 +208,39 @@ public class Ghrh_InterviewRecordBase /// 预留字段12 /// public int? ReverseI2 { get; set; } + + /// + /// 约面反馈 + /// + [Display(Name = "AppointmentFeedback"), Description("约面反馈"), MaxLength(256, ErrorMessage = "约面反馈 不能超过 256 个字符")] + public string AppointmentFeedback { get; set; } + + /// + /// 筛选反馈 + /// + [Display(Name = "FilterFeedback"), Description("筛选反馈"), MaxLength(256, ErrorMessage = "筛选反馈 不能超过 256 个字符")] + public string FilterFeedback { get; set; } + + /// + /// 录用反馈 + /// + [Display(Name = "OfferFeedback"), Description("录用反馈"), MaxLength(256, ErrorMessage = "录用反馈 不能超过 256 个字符")] + public string OfferFeedback { get; set; } + + /// + /// 面试环节 + /// + [Display(Name = "InterviewStepName"), Description("面试环节"), MaxLength(32, ErrorMessage = "面试环节 不能超过 32 个字符")] + public string InterviewStepName { get; set; } + + /// + /// 主面试人 + /// + public bool? IsPrimary { get; set; } + + /// + /// 邮箱 + /// + [Display(Name = "Email"), Description("邮箱"), MaxLength(128, ErrorMessage = "邮箱 不能超过 128 个字符")] + public string Email { get; set; } } diff --git a/Tiobon.Core.Model/Models/Ghrh/Ghrh_InterviewRecord.cs b/Tiobon.Core.Model/Models/Ghrh/Ghrh_InterviewRecord.cs index df49b2da..926ac8c4 100644 --- a/Tiobon.Core.Model/Models/Ghrh/Ghrh_InterviewRecord.cs +++ b/Tiobon.Core.Model/Models/Ghrh/Ghrh_InterviewRecord.cs @@ -6,7 +6,7 @@ * * Ver 变更日期 负责人 变更内容 * ─────────────────────────────────── -*V0.01 2024/11/26 14:47:26 SimonHsiao 初版 +*V0.01 2024/12/20 13:58:20 SimonHsiao 初版 * * Copyright(c) 2024 Tiobon Corporation. All Rights Reserved. *┌──────────────────────────────────┐ @@ -123,30 +123,6 @@ public class Ghrh_InterviewRecord : BasePoco [Display(Name = "CancelReason"), Description("取消原因"), MaxLength(256, ErrorMessage = "取消原因 不能超过 256 个字符")] public string CancelReason { get; set; } - /// - /// 面试环节 - /// - [Display(Name = "InterviewStepName"), Description("面试环节"), MaxLength(32, ErrorMessage = "面试环节 不能超过 32 个字符")] - public string InterviewStepName { get; set; } - - /// - /// 约面反馈 - /// - [Display(Name = "AppointmentFeedback"), Description("约面反馈"), MaxLength(256, ErrorMessage = "约面反馈 不能超过 256 个字符")] - public string AppointmentFeedback { get; set; } - - /// - /// 筛选反馈 - /// - [Display(Name = "FilterFeedback"), Description("筛选反馈"), MaxLength(256, ErrorMessage = "筛选反馈 不能超过 256 个字符")] - public string FilterFeedback { get; set; } - - /// - /// 录用反馈 - /// - [Display(Name = "OfferFeedback"), Description("录用反馈"), MaxLength(256, ErrorMessage = "录用反馈 不能超过 256 个字符")] - public string OfferFeedback { get; set; } - /// /// 状态 /// @@ -233,4 +209,39 @@ public class Ghrh_InterviewRecord : BasePoco /// 预留字段12 /// public int? ReverseI2 { get; set; } + + /// + /// 约面反馈 + /// + [Display(Name = "AppointmentFeedback"), Description("约面反馈"), MaxLength(256, ErrorMessage = "约面反馈 不能超过 256 个字符")] + public string AppointmentFeedback { get; set; } + + /// + /// 筛选反馈 + /// + [Display(Name = "FilterFeedback"), Description("筛选反馈"), MaxLength(256, ErrorMessage = "筛选反馈 不能超过 256 个字符")] + public string FilterFeedback { get; set; } + + /// + /// 录用反馈 + /// + [Display(Name = "OfferFeedback"), Description("录用反馈"), MaxLength(256, ErrorMessage = "录用反馈 不能超过 256 个字符")] + public string OfferFeedback { get; set; } + + /// + /// 面试环节 + /// + [Display(Name = "InterviewStepName"), Description("面试环节"), MaxLength(32, ErrorMessage = "面试环节 不能超过 32 个字符")] + public string InterviewStepName { get; set; } + + /// + /// 主面试人 + /// + public bool? IsPrimary { get; set; } + + /// + /// 邮箱 + /// + [Display(Name = "Email"), Description("邮箱"), MaxLength(128, ErrorMessage = "邮箱 不能超过 128 个字符")] + public string Email { get; set; } } diff --git a/Tiobon.Core.Services/BASE/BaseServices.cs b/Tiobon.Core.Services/BASE/BaseServices.cs index 92c96c91..f1d7ddcb 100644 --- a/Tiobon.Core.Services/BASE/BaseServices.cs +++ b/Tiobon.Core.Services/BASE/BaseServices.cs @@ -2057,7 +2057,7 @@ ORDER BY SortNo ASC"; 'Re'+(select Top 1 ParameterValue from Ghrs_Parameter where ParameterNo='GHRURL')+'/appOauth.html?jumpPage='+'F_APP_message/msgGroupList' url, 'GHR' picurl, '' htmlStr, - {string.Join(',', staffIds.Select(x => x))} toStaffIDs + '{string.Join(',', staffIds.Select(x => x))}' toStaffIDs for json path) -- select @Json exec [dbo].[PS_CreateWorkwxMsg] @Json,'Resume'"; diff --git a/Tiobon.Core.Services/Ghrh/Ghrh_ResumeServices.cs b/Tiobon.Core.Services/Ghrh/Ghrh_ResumeServices.cs index 5f167633..b9db9d48 100644 --- a/Tiobon.Core.Services/Ghrh/Ghrh_ResumeServices.cs +++ b/Tiobon.Core.Services/Ghrh/Ghrh_ResumeServices.cs @@ -1596,7 +1596,10 @@ END"; recommend.InterviewStaffs = recommend.InterviewStaffs.Where(x => x.StaffId != null).ToList(); if (!recommend.InterviewStaffs.Any()) - return ServiceResult.OprateFailed("请先选择面试者!"); + return ServiceResult.OprateFailed("至少选择一名面试者!"); + + recommend.InterviewStaffs = recommend.InterviewStaffs.Where(x => x.StaffId != null).Distinct().ToList(); + if (recommend.RequestId.IsNotEmptyOrNull()) { @@ -1660,15 +1663,17 @@ END"; Round = 1, Status = DIC_INTERVIEW_ORDER_STATUS.HasRecommended, StaffId = recommend.InterviewStaffs[i].StaffId, + Email = recommend.InterviewStaffs[i].Email, + IsPrimary = i == 0 ? true : false, }); - await SendMessage(recommend.InterviewStaffs.Where(x => x.StaffId != null).Select(x => x.StaffId.Value).ToList(), "简历提醒", "您有个简历推荐,请及时查看!", "/M_ESS_Recruit/F_ESS_Candidate"); + await SendMessage(recommend.InterviewStaffs.Select(x => x.StaffId.Value).ToList(), "简历提醒", "您有个简历推荐,请及时查看!", "/M_ESS_Recruit/F_ESS_Candidate"); var entity = await base.QueryById(id); entity.Status = DIC_INTERVIEW_ORDER_STATUS.HasRecommended; await Update(entity, ["Status"]); #region 日志 - await LogRecord(orderId, $"向【{string.Join(",", interviewer.Select(o => o.StaffName))}】推荐了简历,推荐理由:{recommend.RecommendRemark ?? "无"}", id, null, "Recommended", true); + await LogRecord(orderId, $"向【{string.Join("、", interviewer.Select(o => o.StaffName))}】推荐了简历,推荐理由:{recommend.RecommendRemark ?? "无"}", id, null, "Recommended", true); #endregion #region 处理附件 @@ -2054,11 +2059,16 @@ END"; #region 重新安排面试 public async Task RescheduleInterview(long id, ResumeRescheduleInterviewForm input, string type) { + if (input.InterviewStaffs is null) + return ServiceResult.OprateFailed("面试不能为空!"); + input.InterviewStaffs = input.InterviewStaffs.Where(x => x.StaffId != null).Distinct().ToList(); + + if (!input.InterviewStaffs.Any()) + return ServiceResult.OprateFailed("至少选择一名面试者!"); 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) @@ -2076,54 +2086,66 @@ END"; { throw new Exception($"传入时间【{input.Time}】无效,请检查格式!"); } - if (order != null) - { - order.Round++; - order.Status = DIC_INTERVIEW_ORDER_STATUS.WaitInterview; - await _ghrh_InterviewOrderServices.Update(order, ["Status", "Round"]); + await Db.Updateable() + .SetColumns(it => it.IsEnable == 0) + .Where(it => it.ResumeId == id) + .ExecuteCommandAsync(); - await Db.Updateable() - .SetColumns(it => new Ghrh_InterviewRecord() - { - Status = DIC_INTERVIEW_ORDER_STATUS.SystemCancelInterview, - UpdateTime = DateTime.Now - }) - .Where(it => it.Status == DIC_INTERVIEW_ORDER_STATUS.WaitInterview && it.OrderId == order.Id) - .ExecuteCommandAsync(); + var interviewIds = input.InterviewStaffs.Select(o => o.StaffId.Value).ToList(); + var interviewer = await Db.Queryable().Where(o => interviewIds.Contains(o.StaffID)).ToListAsync(); - for (int i = 0; i < input.InterviewStaffs.Count; i++) + var orderId = await _ghrh_InterviewOrderServices.Add(new InsertGhrh_InterviewOrderInput() + { + ResumeId = id, + RecommendTime = DateTime.Now, + RecommendId = App.User.ID, + Round = 1, + OrderNo = await GenerateContinuousSequence("Ghrh_InterviewOrder", "OrderNo", "V"), + Status = DIC_INTERVIEW_ORDER_STATUS.WaitInterview, + RecommendRemark = null, + InterviewIds = JsonHelper.ObjToJson(interviewIds), + Interviewer = string.Join(",", interviewer.Select(o => o.StaffName)) + }); + + //await Db.Updateable() + // .SetColumns(it => new Ghrh_InterviewRecord() + // { + // Status = DIC_INTERVIEW_ORDER_STATUS.SystemCancelInterview, + // UpdateTime = DateTime.Now + // }) + // .Where(it => it.Status == DIC_INTERVIEW_ORDER_STATUS.WaitInterview && it.OrderId == order.Id) + // .ExecuteCommandAsync(); + + for (int i = 0; i < input.InterviewStaffs.Count; i++) + { + await _ghrh_InterviewRecordServices.Add(new InsertGhrh_InterviewRecordInput() { + OrderId = orderId, + Round = 1, + StaffId = input.InterviewStaffs[i].StaffId, + Email = input.InterviewStaffs[i].Email, + InterviewTime = input.Time, + PlanInterviewTime1 = input.Time, + InterviewBeginTime = Convert.ToDateTime(array[0]), + InterviewEndTime = Convert.ToDateTime(array[1]), + Status = DIC_INTERVIEW_ORDER_STATUS.WaitInterview, + IsPrimary = i == 0 ? true : false + }); + } - 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 interviewIds = input.InterviewStaffs.Where(o => o.StaffId != null) - .Select(o => o.StaffId.Value).ToList(); - - var interviewer = await Db.Queryable().Where(o => interviewIds.Contains(o.StaffID)).ToListAsync(); - await LogRecord(order.Id, $"向【{string.Join(",", interviewer.Select(o => o.StaffName))}】发起一个新一轮面试,面试时间:{input.Time}", id, null, "ReScheduleInterview"); - - entity.Status = DIC_INTERVIEW_ORDER_STATUS.WaitInterview; - await Update(entity, ["Status"]); - - if (input.InterviewStaffs.IsNotEmptyOrNull()) - await SendMessage(input.InterviewStaffs.Select(x => x.StaffId.Value).ToList(), "简历提醒", "您有个新的邀约面试,请及时查看!", "/M_ESS_Recruit/F_ESS_Interview"); + await LogRecord(orderId, $"向【{string.Join("、", interviewer.Select(o => o.StaffName))}】发起一个新的面试,面试时间:{input.Time}", id, null, "ReScheduleInterview"); - } + entity.Status = DIC_INTERVIEW_ORDER_STATUS.WaitInterview; + await Update(entity, ["Status", "UpdateTime", "UpdateBy"]); + if (input.InterviewStaffs.IsNotEmptyOrNull()) + await SendMessage(input.InterviewStaffs.Select(x => x.StaffId.Value).ToList(), "简历提醒", "您有个新的邀约面试,请及时查看!", "/M_ESS_Recruit/F_ESS_Interview"); } else { + var order = await _ghrh_InterviewOrderServices.QuerySingle(x => x.ResumeId == id); + if (order != null) { order.Round++; @@ -2132,7 +2154,7 @@ END"; entity.Status = DIC_INTERVIEW_ORDER_STATUS.HasRecommended; - await Update(entity, ["Status"]); + await Update(entity, ["Status", "UpdateTime", "UpdateBy"]); for (int i = 0; i < input.InterviewStaffs.Count; i++) await _ghrh_InterviewRecordServices.Add(new InsertGhrh_InterviewRecordInput() @@ -2140,13 +2162,14 @@ END"; OrderId = order.Id, Round = order.Round, Status = DIC_INTERVIEW_ORDER_STATUS.HasRecommended, + Email = input.InterviewStaffs[i].Email, StaffId = input.InterviewStaffs[i].StaffId, + IsPrimary = i == 0 ? true : false }); - var interviewIds = input.InterviewStaffs.Where(o => o.StaffId != null) - .Select(o => o.StaffId.Value).ToList(); + var interviewIds = input.InterviewStaffs.Select(o => o.StaffId.Value).ToList(); var interviewer = await Db.Queryable().Where(o => interviewIds.Contains(o.StaffID)).ToListAsync(); - await LogRecord(order.Id, $"向【{string.Join(",", interviewer.Select(o => o.StaffName))}】发起一个新的面试,面试时间:{input.Time}", id, null, "ReRecommended"); + await LogRecord(order.Id, $"向【{string.Join("、", interviewer.Select(o => o.StaffName))}】发起一个新一轮面试,面试时间:{input.Time}", id, null, "ReRecommended"); if (input.InterviewStaffs.IsNotEmptyOrNull()) await SendMessage(input.InterviewStaffs.Select(x => x.StaffId.Value).ToList(), "简历提醒", "您有个新的推荐简历,请及时查看!", "/M_ESS_Recruit/F_ESS_Candidate"); @@ -3817,7 +3840,7 @@ WHERE A.IsEnable = 1 AND C.IsEnable = 1 AND C.Status = A.Status"; { var records = await _ghrh_InterviewRecordServices.Query(x => x.Round == order.Round && x.OrderId == order.Id); records.ForEach(record => record.Status = Status); - await _ghrh_InterviewRecordServices.Update(records, ["Status", "UpdateTime", "CreateBy"]); + await _ghrh_InterviewRecordServices.Update(records, ["Status", "UpdateTime", "UpdateBy"]); } /// /// 同步数据进入认识资料 diff --git a/Tiobon.Core/Tiobon.Core.Model.xml b/Tiobon.Core/Tiobon.Core.Model.xml index 671dc563..3e3fa962 100644 --- a/Tiobon.Core/Tiobon.Core.Model.xml +++ b/Tiobon.Core/Tiobon.Core.Model.xml @@ -7880,26 +7880,6 @@ 取消原因 - - - 面试环节 - - - - - 筛选反馈 - - - - - 约面反馈 - - - - - 录用反馈 - - 状态 @@ -7975,6 +7955,36 @@ 预留字段12 + + + 约面反馈 + + + + + 筛选反馈 + + + + + 录用反馈 + + + + + 面试环节 + + + + + 主面试人 + + + + + 邮箱 + + 录用审批单 (Dto.Base) @@ -21511,26 +21521,6 @@ 取消原因 - - - 面试环节 - - - - - 约面反馈 - - - - - 筛选反馈 - - - - - 录用反馈 - - 状态 @@ -21606,6 +21596,36 @@ 预留字段12 + + + 约面反馈 + + + + + 筛选反馈 + + + + + 录用反馈 + + + + + 面试环节 + + + + + 主面试人 + + + + + 邮箱 + + 录用审批单 (Model)