You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
Tiobon.Web.Core/Tiobon.Core.Services/Ghrh/Ghrh_ResumeServices.cs

1266 lines
54 KiB

using static Tiobon.Core.Model.Consts;
namespace Tiobon.Core.Services;
/// <summary>
/// 个人简历 (服务)
/// </summary>
public class Ghrh_ResumeServices : BaseServices<Ghrh_Resume, Ghrh_ResumeDto, InsertGhrh_ResumeInput, EditGhrh_ResumeInput>, IGhrh_ResumeServices
{
private readonly IBaseRepository<Ghrh_Resume> _dal;
private readonly IGhrh_ResumeEduBGServices _ghrh_ResumeEduBGServices;
private readonly IGhrh_ResumeWorkExpServices _ghrh_ResumeWorkExpServices;
private readonly IGhrh_ResumeTagServices _ghrh_ResumeTagServices;
/// <summary>
/// 家庭关系
/// </summary>
private readonly IGhrh_ResumeHomeServices _ghrh_ResumeHomeServices;
private readonly IGhrh_ResumeLicenceServices _ghrh_ResumeLicenceServices;
private readonly IGhrh_ResumeTrainingServices _ghrh_ResumeTrainingServices;
private readonly IGhrh_ResumeStatementServices _ghrh_ResumeStatementServices;
/// <summary>
/// 面试工单
/// </summary>
private readonly IGhrh_InterviewOrderServices _ghrh_InterviewOrderServices;
/// <summary>
/// 面试记录
/// </summary>
private readonly IGhrh_InterviewRecordServices _ghrh_InterviewRecordServices;
public Ghrh_ResumeServices(ICaching caching,
IBaseRepository<Ghrh_Resume> 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_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;
}
public override async Task<ServicePageResult<Ghrh_ResumeDto>> QueryFilterPage(QueryBody filter, string condition, bool? IsEnable = true)
{
var query = Db.Queryable<Ghrh_Resume>();
#region 处理查询条件
//Expression<Func<Ghrh_Resume, bool>> whereExpression = new Expression<Func<Ghrh_Resume, bool>>();
var whereExpression = Expressionable.Create<Ghrh_Resume>();
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<JsonParam>(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 "SalaryPeriod":
case "Education":
case "ApplyStatus":
case "Gender":
//if (jsonParam.columnValue.IsNotEmptyOrNull())
//{
// var ids1 = JsonHelper.JsonToObj<List<string>>(jsonParam.columnValue.ToString());
// if (!ids1.Any(x => x == "NoFliter"))
// whereExpression.And(x => ids1.Contains(x.Education));
//}
if (jsonParam.columnValue != null)
{
var ids1 = JsonHelper.JsonToObj<List<string>>(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<List<string>>(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<List<string>>(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<int> total = 0;
var entitys = await query
.WhereIF(condition.IsNotEmptyOrNull(), condition)
.Where(whereExpression.ToExpression())
.ToPageListAsync(filter.pageNum, filter.pageSize, total);
var result = new ServicePageResult<Ghrh_ResumeDto>(filter.pageNum, total, filter.pageSize, Mapper.Map(entitys).ToANew<List<Ghrh_ResumeDto>>());
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<Ghra_Title>().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<long>();
list.ForEach(x =>
{
if (x.Tags.IsNotEmptyOrNull())
tagIds.AddRange(JsonHelper.JsonToObj<List<long>>(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<List<long>>(x.Tags);
x.TagList = tags.Where(o => tagIds1.Contains(o.Id)).Select(o => o.TagName).ToList();
}
});
return result;
}
public override async Task<Ghrh_ResumeDto> QueryById(object objId)
{
var result = await base.QueryById(objId);
List<Ghrh_ResumeDto> 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<Ghra_Title>().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<long>();
list.ForEach(x =>
{
if (x.Tags.IsNotEmptyOrNull())
tagIds.AddRange(JsonHelper.JsonToObj<List<long>>(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<List<long>>(x.Tags);
x.TagList = tags.Where(o => tagIds1.Contains(o.Id)).Select(o => o.TagName).ToList();
}
});
return list[0];
}
#region 获取简历Tabs接口
public ServiceResult<List<ResumeViewTab>> 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<List<ResumeViewTab>>(str);
return ServiceResult<List<ResumeViewTab>>.OprateSuccess("查询成功!", tabs);
}
#endregion
#region 获取查询条件
public async Task<ServiceResult<List<ResumeCondition>>> 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<List<ResumeCondition>>(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<List<ResumeCondition>>.OprateSuccess("查询成功!", tabs);
}
#endregion
#region 处理是否推荐
public async Task<ServiceResult> SwitchIsRecommend(List<long> ids, bool isRecommend)
{
await Db.Updateable<Ghrh_Resume>()
.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<bool> UpdateStatus(List<long> ids, string status)
{
var result = await Db.Updateable<Ghrh_Resume>()
.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<bool> MarkTags(List<long> ids, List<long> tags)
{
var tag = JsonHelper.ObjToJson(tags);
var result = await Db.Updateable<Ghrh_Resume>()
.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<ServiceResult<dynamic>> 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<dynamic>.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<dynamic>.OprateSuccess("查询成功", obj);
}
#endregion
#region 查询简历公司新增
public async Task<ServiceResult<Dictionary<string, string>>> QueryCompanyInfo(string companySpecCode)
{
var url = await Db.Ado.GetStringAsync("SELECT LogoUrl FROM Ghrs_LoginPageSetting");
Dictionary<string, string> dict = new Dictionary<string, string>()
{
{ "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<Dictionary<string, string>>.OprateSuccess("查询成功", dict);
}
#endregion
#region 查询招聘表单信息接口
public async Task<ServiceResult<dynamic>> 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<ResumeFormColumn>(sql);
columns.ForEach(x =>
{
if (x.children1.IsNotEmptyOrNull())
x.children = JsonHelper.JsonToObj<List<ResumeFormColumnChildren>>(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<string, object>
{
{ "PhotoUrl", entity.PhotoUrl }
};
columnNames.ForEach(x =>
{
var value = entity.GetPropertyValue(x);
dicts.Add(x, value);
});
if (entity.PhotoUrl.IsNotEmptyOrNull())
{
dicts.Add("PhotoUrls", new List<ResumePhotoAttachment>()
{
new ResumePhotoAttachment() { RelativePath =entity.PhotoUrl }
});
}
else dicts.Add("PhotoUrls", new List<ResumePhotoAttachment>()
{
});
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<Dictionary<string, object>>();
familys.ForEach(family =>
{
var dicts = new Dictionary<string, object>();
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<Dictionary<string, object>>();
educations.ForEach(education =>
{
var dicts = new Dictionary<string, object>();
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<Dictionary<string, object>>();
workExps.ForEach(workExp =>
{
var dicts = new Dictionary<string, object>();
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<Dictionary<string, object>>();
Licences.ForEach(licence =>
{
var dicts = new Dictionary<string, object>();
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<Dictionary<string, object>>();
Trainings.ForEach(training =>
{
var dicts = new Dictionary<string, object>();
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<Ghrs_Attachment>().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 = @"<p>亲爱的小伙伴:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 感谢你对公司的认可。</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 填写公司岗位应聘表时,请确保信息准确无误。</p>
<p>&nbsp;</p>
<p>请依次填写个人信息(如姓名、联系方式等)、教育青景、工作经验(从最近到最远列出,包括公司名称、职位和主要职责)等。
强调与职位相关的经历和技能,保持内容简洁明了。</p>";
obj.Guide = Guide;
#endregion
#region 承诺
var promiseList = new List<string>
{
"本人诚实告知未思有各类传染性疾病,若经体检后发现有不符合本公司要求的项目,本人愿意放弃此次应征机会!",
"本人正式入职之前,已不与任何单位存在劳动关系,并承诺在工作中不使用曾经服务过的工作单位的技术和商业秘密,如有违背,由此引起的法律纠纷及经济责任由本人承担。"
};
obj.Promise = promiseList;
#endregion
dynamic StatementRemark = new ExpandoObject();
StatementRemark.Top = "员工本人声明(本人填写、提供的资料,是真实的、可靠的。如有虚假,则所签订的劳动合同将自动作废,由此产生的一切后果由本人负责。)";
StatementRemark.CenterPart1 = "根据本人实际情况,在下列";
StatementRemark.CenterPart2 = "中打“√”选择符合项目:";
obj.StatementRemark = StatementRemark;
return ServiceResult<dynamic>.OprateSuccess("查询成功", obj);
}
public async Task<List<ResumeFormColumn1>> 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<ResumeFormColumn1>(sql);
}
#endregion
#region 简历提交接口
public async Task<ServiceResult> 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<Ghre_Attachment>().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<InsertGhrh_ResumeStatementInput>();
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<Ghrs_Attachment>()
.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<Ghrs_Attachment>()
.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<ServiceResult<dynamic>> 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<ResumeFormColumn>("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<string, int> 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<int>();
var xAxisData = new List<string>();
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<dynamic>.OprateSuccess("查询成功", Data);
}
#endregion
#region 导出Excel
public async Task<ServiceResult<string>> 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<string>.OprateSuccess(name + ".xlsx", physicsPath1);
return result;
}
#endregion
#region 简历推荐
public async Task<ServiceResult> 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<Ghrh_InterviewOrder>()
.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
});
await _ghrh_InterviewRecordServices.Add(new InsertGhrh_InterviewRecordInput()
{
OrderId = orderId,
Round = 1,
ReceiverIds = JsonHelper.ObjToJson(recommend.InterviewStaffs),
});
return ServiceResult.OprateSuccess();
}
#endregion
#region 简历库已推荐提醒
public async Task<ServiceResult> 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 Db.Queryable<Ghrh_InterviewOrder>().FirstAsync(x => x.ResumeId == id);
if (order != null)
{
var record = await _ghrh_InterviewRecordServices.QuerySingle(x => x.Round == order.Round && x.OrderId == order.Id);
if (record.FirstViewTime.IsNotEmptyOrNull())
return ServiceResult.OprateFailed("面试官已查看简历,暂不可发送提醒!");
if (record.ReceiverIds.IsNotEmptyOrNull())
{
var staffs = JsonHelper.JsonToObj<List<ResumeRecommendFormStaff>>(record.ReceiverIds);
await SendMessage(staffs.Select(x => x.StaffId).ToList(), "简历提醒", "您有个简历推荐,请及时查看!");
}
}
return ServiceResult.OprateSuccess();
}
#endregion
}