using static Tiobon.Core.Model.Consts; namespace Tiobon.Core.Services; public partial class ReportServices : BaseServices, IReportServices { IHttpContextAccessor _httpContextAccessor; private readonly IGhra_StaffServices _staffServices; public ReportServices(IHttpContextAccessor httpContextAccessor, ICaching caching = null, IGhra_StaffServices staffServices = null) { _httpContextAccessor = httpContextAccessor; _caching = caching; _staffServices = staffServices; } #region 获取新入职人员列表 /// /// 获取新入职人员列表 /// /// /// /// /// public async Task> QueryNewStaffAsync(QueryBody filter, string condition, bool? IsEnable = true) { int month = 3; var config = await Db.Queryable().Where(x => x.ConfigCode == "New_Staff_Month").FirstAsync(); if (config != null) { try { month = Convert.ToInt32(config.ConfigValue); } catch (Exception) { } } var dateTime = DateTime.Now.AddMonths(-month); if (filter.orderBy.IsNotEmptyOrNull()) filter.orderBy = "Indate DESC"; condition = $"Indate >= '{DateTimeHelper.ConvertToDayString(dateTime)}' AND Indate <= '{DateTimeHelper.ConvertToDayString(DateTime.Now)}' AND OutDate IS NULL"; var result = await _staffServices.QueryFilterPage(filter, condition, IsEnable); return result; } #endregion #region 面试官-简历筛选通过率 /// /// 面试官-简历筛选通过率:筛选通过人数 / 待筛选人数 × 100% /// /// /// public async Task> QueryESSResumeScreenPassRate(int langId = 1) { dynamic data = new ExpandoObject(); var series = new JArray(); var XAxis = new List(); var date = DateTime.Now.AddMonths(-11); var data1 = new List(); var data2 = new List(); var data3 = new List(); var startDate = DateTime.Now.AddMonths(-11); var endDate = DateTime.Now.AddMonths(1); startDate = new DateTime(startDate.Year, startDate.Month, 1); endDate = new DateTime(endDate.Year, endDate.Month, 1); var orderIds = await Db.Queryable() .Where(x => x.StaffId == App.User.StaffId && x.CreateTime >= startDate && x.CreateTime < endDate) .Select(x => x.OrderId) .Distinct() .ToListAsync(); var orders = await Db.Queryable().Where(x => orderIds.Contains(x.Id)).ToListAsync(); for (int i = 1; i <= 12; i++) { var date1 = DateTimeHelper.ConvertToMonthString(date); XAxis.Add(date1); var group = orders .Where(x => x.RecommendTime != null && x.RecommendTime.Value.Date.Month == date.Month && x.RecommendTime.Value.Date.Year == date.Year) .ToList(); var count = group.Count; var count1 = group.Where(x => x.Status == DIC_INTERVIEW_ORDER_STATUS.Fail).Count(); var count2 = count - count1; data1.Add(count); data2.Add(count2); decimal count3 = 0; if (count2 > 0 && count > 0) count3 = ((decimal)count2 / count) * 100; data3.Add(StringHelper.TrimDecimal(count3, 2)); date = date.AddMonths(1); } var item = new JObject { new JProperty("color", "rgba(43, 165, 177, 1)"), new JProperty("data", data1), new JProperty("name", await QueryLangValue("F_ResumeMaintenance_0231", "待筛选人数")), }; series.Add(item); item = new JObject { new JProperty("color", "rgba(255, 152, 18, 1)"), new JProperty("data", data2), new JProperty("name", await QueryLangValue("F_ResumeMaintenance_0230", "筛选通过人数")), }; series.Add(item); item = new JObject { new JProperty("color", "rgba(255, 147, 0, 1)"), new JProperty("data", data3), new JProperty("name", await QueryLangValue("F_ResumeMaintenance_0232", "简历筛选通过率")), }; series.Add(item); data.XAxis = XAxis; data.series = series; return ServiceResult.OprateSuccess("获取成功", data); } #endregion #region 面试官/HR推荐 - 面试通过率 /// /// 面试官/HR推荐 - 面试通过率:面试官面试通过人数 / 已面试人数 × 100% /// /// /// public async Task> QueryInterviewPassRate(int langId = 1, int? staffId = null) { dynamic data = new ExpandoObject(); var series = new JArray(); var XAxis = new List(); var date = DateTime.Now.AddMonths(-11); var data1 = new List(); var data2 = new List(); var data3 = new List(); var startDate = DateTime.Now.AddMonths(-11); var endDate = DateTime.Now.AddMonths(1); startDate = new DateTime(startDate.Year, startDate.Month, 1); endDate = new DateTime(endDate.Year, endDate.Month, 1); var orderIds = await Db.Queryable() .WhereIF(staffId != null, x => x.StaffId == staffId) .Where(x => x.CreateTime >= startDate && x.CreateTime < endDate) .Select(x => x.OrderId) .Distinct() .ToListAsync(); var orders = await Db.Queryable().Where(x => orderIds.Contains(x.Id) && x.Status != DIC_INTERVIEW_ORDER_STATUS.Fail && x.Status != DIC_INTERVIEW_ORDER_STATUS.HasRecommended).ToListAsync(); for (int i = 1; i <= 12; i++) { var date1 = DateTimeHelper.ConvertToMonthString(date); XAxis.Add(date1); var group = orders .Where(x => x.RecommendTime != null && x.RecommendTime.Value.Date.Month == date.Month && x.RecommendTime.Value.Date.Year == date.Year) .ToList(); var count = group.Count; var count1 = group.Where(x => x.IsPass == true).Count(); var count2 = count - count1; data1.Add(count); data2.Add(count2); decimal count3 = 0; if (count2 > 0 && count > 0) count3 = ((decimal)count2 / count) * 100; data3.Add(StringHelper.TrimDecimal(count3, 2)); date = date.AddMonths(1); } var item = new JObject { new JProperty("color", "rgba(43, 165, 177, 1)"), new JProperty("data", data1), new JProperty("name", await QueryLangValue("F_ResumeMaintenance_0234", "已面试人数")), }; series.Add(item); item = new JObject { new JProperty("color", "rgba(255, 152, 18, 1)"), new JProperty("data", data2), new JProperty("name", await QueryLangValue("F_ResumeMaintenance_0235", "面试通过人数")), }; series.Add(item); item = new JObject { new JProperty("color", "rgba(255, 147, 0, 1)"), new JProperty("data", data3), new JProperty("name", await QueryLangValue("F_ResumeMaintenance_0233", "面试官面试通过率")), }; series.Add(item); data.XAxis = XAxis; data.series = series; return ServiceResult.OprateSuccess("获取成功", data); } #endregion #region 面试官/HR推荐 - 发OFFER率 /// /// 面试官/HR推荐 - 发OFFER率:已发offer人数 / 面试通过人数 × 100% /// /// /// public async Task> QuerySendOfferRate(int langId = 1, int? staffId = null) { dynamic data = new ExpandoObject(); var series = new JArray(); var XAxis = new List(); var date = DateTime.Now.AddMonths(-11); var data1 = new List(); var data2 = new List(); var data3 = new List(); var startDate = DateTime.Now.AddMonths(-11); var endDate = DateTime.Now.AddMonths(1); startDate = new DateTime(startDate.Year, startDate.Month, 1); endDate = new DateTime(endDate.Year, endDate.Month, 1); var orderIds = await Db.Queryable() .WhereIF(staffId != null, x => x.StaffId == staffId) .Where(x => x.CreateTime >= startDate && x.CreateTime < endDate) .Select(x => x.OrderId) .Distinct() .ToListAsync(); var orders = await Db.Queryable().Where(x => orderIds.Contains(x.Id) && x.Status == DIC_INTERVIEW_ORDER_STATUS.HasSendOffer || x.Status == DIC_INTERVIEW_ORDER_STATUS.HasOffer).ToListAsync(); for (int i = 1; i <= 12; i++) { var date1 = DateTimeHelper.ConvertToMonthString(date); XAxis.Add(date1); var group = orders .Where(x => x.RecommendTime != null && x.RecommendTime.Value.Date.Month == date.Month && x.RecommendTime.Value.Date.Year == date.Year && x.IsPass == true) .ToList(); var count = group.Count; var count1 = group.Where(x => x.IsPass == true).Count(); var count2 = count - count1; data1.Add(count); data2.Add(count2); decimal count3 = 0; if (count2 > 0 && count > 0) count3 = ((decimal)count2 / count) * 100; data3.Add(StringHelper.TrimDecimal(count3, 2)); date = date.AddMonths(1); } var item = new JObject { new JProperty("color", "rgba(43, 165, 177, 1)"), new JProperty("data", data1), new JProperty("name", await QueryLangValue("F_ResumeMaintenance_0235", "面试通过人数")), }; series.Add(item); item = new JObject { new JProperty("color", "rgba(255, 152, 18, 1)"), new JProperty("data", data2), new JProperty("name", await QueryLangValue("F_ResumeMaintenance_0236", "已发offer人数")), }; series.Add(item); item = new JObject { new JProperty("color", "rgba(255, 147, 0, 1)"), new JProperty("data", data3), new JProperty("name", await QueryLangValue("F_ResumeMaintenance_0237", "已发OFFER率")), }; series.Add(item); data.XAxis = XAxis; data.series = series; return ServiceResult.OprateSuccess("获取成功", data); } #endregion }