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.
1266 lines
54 KiB
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> 感谢你对公司的认可。</p>
|
|
<p> </p>
|
|
<p> 填写公司岗位应聘表时,请确保信息准确无误。</p>
|
|
<p> </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
|
|
} |