简历查看页面接口开发

master
xiaochanghai 6 months ago
parent 3c7651dd8a
commit 5e06b257d5
  1. 953
      Model/Tiobon.Web.pdm
  2. 4
      Tiobon.Core.Api/Controllers/Authorize/AuthorizeController.cs
  3. 35
      Tiobon.Core.Api/Tiobon.Core.Model.xml
  4. 13
      Tiobon.Core.Model/Base/Ghrh/Ghrh_InterviewLog.Dto.Base.cs
  5. 4
      Tiobon.Core.Model/Consts.cs
  6. 13
      Tiobon.Core.Model/Models/Ghrh/Ghrh_InterviewLog.cs
  7. 89
      Tiobon.Core.Services/Ghrh/Ghrh_ResumeServices.cs
  8. 35
      Tiobon.Core/Tiobon.Core.Model.xml

File diff suppressed because it is too large Load Diff

@ -283,7 +283,7 @@ public class AuthorizeController : BaseApiController
{ {
//如果是基于用户的授权策略,这里要添加用户;如果是基于角色的授权策略,这里要添加角色 //如果是基于用户的授权策略,这里要添加用户;如果是基于角色的授权策略,这里要添加角色
var claims = new List<Claim> { var claims = new List<Claim> {
new Claim(ClaimTypes.Name, user.FirstOrDefault().UserId.ToString()), new Claim(ClaimTypes.Name, user.FirstOrDefault().UserName.ToString()),
new Claim(JwtRegisteredClaimNames.Jti, user.FirstOrDefault().UserId.ToString()), new Claim(JwtRegisteredClaimNames.Jti, user.FirstOrDefault().UserId.ToString()),
new Claim("TenantId", "0"), new Claim("TenantId", "0"),
new Claim(JwtRegisteredClaimNames.Iat, DateTime.Now.DateToTimeStamp()), new Claim(JwtRegisteredClaimNames.Iat, DateTime.Now.DateToTimeStamp()),
@ -304,7 +304,7 @@ public class AuthorizeController : BaseApiController
_logger.LogWarning(E, E.Message); _logger.LogWarning(E, E.Message);
return Failed<string>(E.Message); return Failed<string>(E.Message);
} }
return Failed<string>("自动登录失败"); return Failed<string>("自动登录失败");
} }
#endregion #endregion

@ -7395,6 +7395,21 @@
面试记录ID 面试记录ID
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLogBase.ResumeId">
<summary>
简历ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLogBase.UserId">
<summary>
用户ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLogBase.UserName">
<summary>
用户名
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLogBase.Source"> <member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLogBase.Source">
<summary> <summary>
来源 来源
@ -20871,6 +20886,21 @@
面试记录ID 面试记录ID
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLog.ResumeId">
<summary>
简历ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLog.UserId">
<summary>
用户ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLog.UserName">
<summary>
用户名
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLog.Source"> <member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLog.Source">
<summary> <summary>
来源 来源
@ -28557,6 +28587,11 @@
待面试 待面试
</summary> </summary>
</member> </member>
<member name="F:Tiobon.Core.Model.Consts.DIC_INTERVIEW_ORDER_STATUS.SystemCancelInterview">
<summary>
面试取消(系统)
</summary>
</member>
<member name="F:Tiobon.Core.Model.Consts.DIC_INTERVIEW_ORDER_STATUS.HasInterview"> <member name="F:Tiobon.Core.Model.Consts.DIC_INTERVIEW_ORDER_STATUS.HasInterview">
<summary> <summary>
已面试 已面试

@ -6,7 +6,7 @@
* *
* Ver * Ver
* *
*V0.01 2024/12/13 14:03:44 SimonHsiao *V0.01 2024/12/13 14:18:56 SimonHsiao
* *
* Copyright(c) 2024 Tiobon Corporation. All Rights Reserved. * Copyright(c) 2024 Tiobon Corporation. All Rights Reserved.
* *
@ -38,6 +38,17 @@ public class Ghrh_InterviewLogBase
/// </summary> /// </summary>
public long? ResumeId { get; set; } public long? ResumeId { get; set; }
/// <summary>
/// 用户ID
/// </summary>
public long? UserId { get; set; }
/// <summary>
/// 用户名
/// </summary>
[Display(Name = "UserName"), Description("用户名"), MaxLength(64, ErrorMessage = "用户名 不能超过 64 个字符")]
public string UserName { get; set; }
/// <summary> /// <summary>
/// 来源 /// 来源
/// </summary> /// </summary>

@ -356,6 +356,10 @@ public class Consts
/// </summary> /// </summary>
public const string WaitInterview = "WaitInterview"; public const string WaitInterview = "WaitInterview";
/// <summary> /// <summary>
/// 面试取消(系统)
/// </summary>
public const string SystemCancelInterview = "SystemCancelInterview";
/// <summary>
/// 已面试 /// 已面试
/// </summary> /// </summary>
public const string HasInterview = "HasInterview"; public const string HasInterview = "HasInterview";

@ -6,7 +6,7 @@
* *
* Ver * Ver
* *
*V0.01 2024/12/13 14:03:44 SimonHsiao *V0.01 2024/12/13 14:18:56 SimonHsiao
* *
* Copyright(c) 2024 Tiobon Corporation. All Rights Reserved. * Copyright(c) 2024 Tiobon Corporation. All Rights Reserved.
* *
@ -39,6 +39,17 @@ public class Ghrh_InterviewLog : BasePoco
/// </summary> /// </summary>
public long? ResumeId { get; set; } public long? ResumeId { get; set; }
/// <summary>
/// 用户ID
/// </summary>
public long? UserId { get; set; }
/// <summary>
/// 用户名
/// </summary>
[Display(Name = "UserName"), Description("用户名"), MaxLength(64, ErrorMessage = "用户名 不能超过 64 个字符")]
public string UserName { get; set; }
/// <summary> /// <summary>
/// 来源 /// 来源
/// </summary> /// </summary>

@ -1620,9 +1620,23 @@ END";
entity.Status = DIC_INTERVIEW_ORDER_STATUS.HasRecommended; entity.Status = DIC_INTERVIEW_ORDER_STATUS.HasRecommended;
await Update(entity, ["Status"]); await Update(entity, ["Status"]);
#region 日志 #region 日志
var usser = await GetUser(); await LogRecord(orderId, $"向【{string.Join(",", interviewer.Select(o => o.StaffName))}】推荐了简历,推荐理由:{recommend.RecommendRemark ?? ""}", id, null, "Recommended", true);
await LogRecord(orderId, $"用户【{usser?.UserName ?? App.User.ID.ToString()}】向【{string.Join(",", interviewer.Select(o => o.StaffName))}】推荐了简历!", id, null, "Recommended"); #endregion
#region 处理附件
if (recommend.Attachments != null && recommend.Attachments.Any())
for (int i = 0; i < recommend.Attachments.Count; i++)
{
await Db.Updateable<Ghrs_Attachment>()
.SetColumns(it => new Ghrs_Attachment()
{
TableName = orderId.ObjToString(),
UpdateTime = DateTime.Now
})
.Where(it => it.RelativePath == recommend.Attachments[i].RelativePath)
.ExecuteCommandAsync();
}
#endregion #endregion
} }
@ -1657,10 +1671,8 @@ END";
if (records[i].FirstViewTime.IsNullOrEmpty()) if (records[i].FirstViewTime.IsNullOrEmpty())
await SendMessage([records[i].StaffId.Value], "简历提醒", "您有个简历推荐,请及时查看!", "/M_ESS_Recruit/F_ESS_Candidate"); await SendMessage([records[i].StaffId.Value], "简历提醒", "您有个简历推荐,请及时查看!", "/M_ESS_Recruit/F_ESS_Candidate");
} }
#region 日志 #region 日志
var usser = await GetUser(); await LogRecord(order.Id, $"向【{string.Join(",", interviewer.Select(o => o.StaffName))}】发送简历推荐提醒!", id, null, "RemindHasRecommend");
await LogRecord(order.Id, $"用户【{usser?.UserName ?? App.User.ID.ToString()}】向【{string.Join(",", interviewer.Select(o => o.StaffName))}】发送简历推荐提醒!", id, null, "RemindHasRecommend");
#endregion #endregion
} }
} }
@ -1721,6 +1733,8 @@ END";
time = DateTimeHelper.ConvertToMiniuteString(time1[0]) + "~" + DateTimeHelper.ConvertToOnlyHourMinuteString(time1[1]); time = DateTimeHelper.ConvertToMiniuteString(time1[0]) + "~" + DateTimeHelper.ConvertToOnlyHourMinuteString(time1[1]);
} }
form.Times[i] = time;
if (i == 0) if (i == 0)
records.ForEach(record => record.PlanInterviewTime1 = time); records.ForEach(record => record.PlanInterviewTime1 = time);
else if (i == 1) else if (i == 1)
@ -1738,9 +1752,9 @@ END";
await _ghrh_InterviewRecordServices.Update(records[0], ["PlanInterviewTime1", "PlanInterviewTime2", "PlanInterviewTime3", "Status"]); await _ghrh_InterviewRecordServices.Update(records[0], ["PlanInterviewTime1", "PlanInterviewTime2", "PlanInterviewTime3", "Status"]);
#region 日志 #region 日志
var usser = await GetUser(); await LogRecord(order.Id, $"预约面试,面试时间:{string.Join("", form.Times)},约面反馈:{order.AppointmentFeedback ?? ""}", id, null, "SubscribeInterview");
await LogRecord(order.Id, $"用户【{usser?.UserName ?? App.User.ID.ToString()}】预约面试,面试时间:{string.Join("", form.Times)}", id, null, "SubscribeInterview");
#endregion #endregion
await UpdateResumeStatus(entity, DIC_INTERVIEW_ORDER_STATUS.WaitAppointment); await UpdateResumeStatus(entity, DIC_INTERVIEW_ORDER_STATUS.WaitAppointment);
} }
@ -1790,7 +1804,7 @@ END";
await _ghrh_InterviewRecordServices.Update(records, ["InterviewTime", "InterviewBeginTime", "InterviewEndTime", "Status", "UpdateTime", "UpdateBy"]); await _ghrh_InterviewRecordServices.Update(records, ["InterviewTime", "InterviewBeginTime", "InterviewEndTime", "Status", "UpdateTime", "UpdateBy"]);
await _ghrh_InterviewOrderServices.Update(order, ["InterviewStepName", "UpdateTime", "UpdateBy"]); await _ghrh_InterviewOrderServices.Update(order, ["InterviewStepName", "UpdateTime", "UpdateBy"]);
await LogRecord(order.Id, $"安排面试,面试时间:{body.Time}"); await LogRecord(order.Id, $"安排面试,面试时间:{body.Time},面试地点:{body.InterviewAddress},面试备注:{body.Remark ?? ""}", id, records[0].Id, "ScheduleInterview", true);
entity.Status = DIC_INTERVIEW_ORDER_STATUS.WaitInterview; entity.Status = DIC_INTERVIEW_ORDER_STATUS.WaitInterview;
await Update(entity, ["Status", "UpdateTime", "UpdateBy"]); await Update(entity, ["Status", "UpdateTime", "UpdateBy"]);
@ -1798,9 +1812,22 @@ END";
for (int i = 0; i < records.Count; i++) for (int i = 0; i < records.Count; i++)
{ {
await SendMessage([records[i].StaffId.Value], "面试提醒", $"您有个简历待面试,面试时间:{body.Time},请及时查看!", "/M_ESS_Recruit/F_ESS_Interview"); await SendMessage([records[i].StaffId.Value], "面试提醒", $"您有个简历待面试,面试时间:{body.Time},请及时查看!", "/M_ESS_Recruit/F_ESS_Interview");
} }
#region 处理附件
if (body.Attachments != null && body.Attachments.Any())
for (int i = 0; i < body.Attachments.Count; i++)
{
await Db.Updateable<Ghrs_Attachment>()
.SetColumns(it => new Ghrs_Attachment()
{
TableName = records[0].Id.ObjToString(),
UpdateTime = DateTime.Now
})
.Where(it => it.RelativePath == body.Attachments[i].RelativePath)
.ExecuteCommandAsync();
}
#endregion
} }
return ServiceResult.OprateSuccess(); return ServiceResult.OprateSuccess();
@ -1995,8 +2022,18 @@ END";
await _ghrh_InterviewOrderServices.Update(order, ["Status", "Round"]); await _ghrh_InterviewOrderServices.Update(order, ["Status", "Round"]);
await Db.Updateable<Ghrh_InterviewRecord>()
.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++) for (int i = 0; i < input.InterviewStaffs.Count; i++)
{ {
await _ghrh_InterviewRecordServices.Add(new InsertGhrh_InterviewRecordInput() await _ghrh_InterviewRecordServices.Add(new InsertGhrh_InterviewRecordInput()
{ {
OrderId = order.Id, OrderId = order.Id,
@ -2009,8 +2046,12 @@ END";
Status = DIC_INTERVIEW_ORDER_STATUS.WaitInterview 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<Ghra_Staff>().Where(o => interviewIds.Contains(o.StaffID)).ToListAsync();
await LogRecord(order.Id, $"向【{string.Join(",", interviewer.Select(o => o.StaffName))}】发起一个新一轮面试,面试时间:{input.Time}", id, null, "ReScheduleInterview");
await LogRecord(order.Id, $"发起一个新的面试,面试时间:{input.Time}");
entity.Status = DIC_INTERVIEW_ORDER_STATUS.WaitInterview; entity.Status = DIC_INTERVIEW_ORDER_STATUS.WaitInterview;
await Update(entity, ["Status"]); await Update(entity, ["Status"]);
@ -2040,6 +2081,11 @@ END";
Status = DIC_INTERVIEW_ORDER_STATUS.HasRecommended, Status = DIC_INTERVIEW_ORDER_STATUS.HasRecommended,
StaffId = input.InterviewStaffs[i].StaffId, StaffId = input.InterviewStaffs[i].StaffId,
}); });
var interviewIds = input.InterviewStaffs.Where(o => o.StaffId != null)
.Select(o => o.StaffId.Value).ToList();
var interviewer = await Db.Queryable<Ghra_Staff>().Where(o => interviewIds.Contains(o.StaffID)).ToListAsync();
await LogRecord(order.Id, $"向【{string.Join(",", interviewer.Select(o => o.StaffName))}】发起一个新的面试,面试时间:{input.Time}", id, null, "ReRecommended");
if (input.InterviewStaffs.IsNotEmptyOrNull()) if (input.InterviewStaffs.IsNotEmptyOrNull())
await SendMessage(input.InterviewStaffs.Select(x => x.StaffId.Value).ToList(), "简历提醒", "您有个新的推荐简历,请及时查看!", "/M_ESS_Recruit/F_ESS_Candidate"); await SendMessage(input.InterviewStaffs.Select(x => x.StaffId.Value).ToList(), "简历提醒", "您有个新的推荐简历,请及时查看!", "/M_ESS_Recruit/F_ESS_Candidate");
@ -3031,7 +3077,7 @@ WHERE A.IsEnable = 1 AND C.IsEnable = 1 AND C.Status = A.Status";
obj.Add(new JProperty("Score" + (i + 1), assessDetail.AssessContent.ObjToInt())); obj.Add(new JProperty("Score" + (i + 1), assessDetail.AssessContent.ObjToInt()));
else else
obj.Add(new JProperty("Score" + (i + 1), null)); obj.Add(new JProperty("Score" + (i + 1), null));
if (record.StaffId == staffId) if (record.StaffId == staffId && record.Round == order.Round)
obj.Add(new JProperty("CanEdit" + (i + 1), true)); obj.Add(new JProperty("CanEdit" + (i + 1), true));
else else
obj.Add(new JProperty("CanEdit" + (i + 1), false)); obj.Add(new JProperty("CanEdit" + (i + 1), false));
@ -3041,8 +3087,6 @@ WHERE A.IsEnable = 1 AND C.IsEnable = 1 AND C.Status = A.Status";
result.Body = body; result.Body = body;
#endregion #endregion
#region Header #region Header
var printHeader = new JArray(); var printHeader = new JArray();
@ -3172,10 +3216,10 @@ WHERE A.IsEnable = 1 AND C.IsEnable = 1 AND C.Status = A.Status";
if (assessDetail != null) if (assessDetail != null)
obj.Add(new JProperty("Score" + (i + 1), assessDetail.AssessContent.ObjToInt())); obj.Add(new JProperty("Score" + (i + 1), assessDetail.AssessContent.ObjToInt() == 1 ? "通过" : "不通过"));
else else
obj.Add(new JProperty("Score" + (i + 1), null)); obj.Add(new JProperty("Score" + (i + 1), null));
if (record.StaffId == staffId) if (record.StaffId == staffId && record.Round == order.Round)
obj.Add(new JProperty("CanEdit" + (i + 1), true)); obj.Add(new JProperty("CanEdit" + (i + 1), true));
else else
obj.Add(new JProperty("CanEdit" + (i + 1), false)); obj.Add(new JProperty("CanEdit" + (i + 1), false));
@ -3288,11 +3332,10 @@ WHERE A.IsEnable = 1 AND C.IsEnable = 1 AND C.Status = A.Status";
await UpdateResumeStatus(entity, Status); await UpdateResumeStatus(entity, Status);
await LogRecord(order.Id, $"提交了面试评估,轮数:{order.Round},是否通过:{(isPass == true ? "" : "")},内容:{evaluateContent}!"); await LogRecord(order.Id, $"提交了面试评估,轮数:{order.Round},是否通过:{(isPass == true ? "" : "")},内容:{evaluateContent}!", id, null, "AssessInterview");
await LogRecord(order.Id, $"提交了面试评估,轮数:{order.Round},是否通过:{(isPass == true ? "" : "")},内容:{evaluateContent}!");
} }
else else
await LogRecord(order.Id, $"暂存了面试评估,轮数:{order.Round},是否通过:{(isPass == true ? "" : "")},内容:{evaluateContent}!"); await LogRecord(order.Id, $"暂存了面试评估,轮数:{order.Round},是否通过:{(isPass == true ? "" : "")},内容:{evaluateContent}!", id, null, "AssessInterview");
return ServiceResult.OprateSuccess(); return ServiceResult.OprateSuccess();
} }
@ -3474,16 +3517,18 @@ WHERE A.IsEnable = 1 AND C.IsEnable = 1 AND C.Status = A.Status";
/// <param name="orderId">面试单ID</param> /// <param name="orderId">面试单ID</param>
/// <param name="content">内容</param> /// <param name="content">内容</param>
/// <returns></returns> /// <returns></returns>
public async Task LogRecord(long orderId, string content, long? resumeId = null, long? recordId = null, string source = null) public async Task LogRecord(long orderId, string content, long? resumeId = null, long? recordId = null, string source = null, bool? hasAttachment = null)
{ {
var usser = await GetUser();
await _ghrh_InterviewLogServices.Add(new InsertGhrh_InterviewLogInput() await _ghrh_InterviewLogServices.Add(new InsertGhrh_InterviewLogInput()
{ {
InterviewOrderId = orderId, InterviewOrderId = orderId,
InterviewRecordId = recordId, InterviewRecordId = recordId,
ResumeId = resumeId, ResumeId = resumeId,
Source = source, Source = source,
RemarkSz = $"用户【{usser?.UserName ?? App.User.ID.ToString()}】" + content UserId = App.User.ID,
UserName = App.User.Name,
RemarkSz = content,
ReverseI1 = hasAttachment == true ? 1 : 0// 是否有附件
}); });
} }
public async Task UpdateResumeStatus(Ghrh_Resume entity, string Status) public async Task UpdateResumeStatus(Ghrh_Resume entity, string Status)

@ -7395,6 +7395,21 @@
面试记录ID 面试记录ID
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLogBase.ResumeId">
<summary>
简历ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLogBase.UserId">
<summary>
用户ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLogBase.UserName">
<summary>
用户名
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLogBase.Source"> <member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLogBase.Source">
<summary> <summary>
来源 来源
@ -20871,6 +20886,21 @@
面试记录ID 面试记录ID
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLog.ResumeId">
<summary>
简历ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLog.UserId">
<summary>
用户ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLog.UserName">
<summary>
用户名
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLog.Source"> <member name="P:Tiobon.Core.Model.Models.Ghrh_InterviewLog.Source">
<summary> <summary>
来源 来源
@ -28557,6 +28587,11 @@
待面试 待面试
</summary> </summary>
</member> </member>
<member name="F:Tiobon.Core.Model.Consts.DIC_INTERVIEW_ORDER_STATUS.SystemCancelInterview">
<summary>
面试取消(系统)
</summary>
</member>
<member name="F:Tiobon.Core.Model.Consts.DIC_INTERVIEW_ORDER_STATUS.HasInterview"> <member name="F:Tiobon.Core.Model.Consts.DIC_INTERVIEW_ORDER_STATUS.HasInterview">
<summary> <summary>
已面试 已面试

Loading…
Cancel
Save