using LinqKit; using New_College.Common; using New_College.Common.Helper; using New_College.IRepository; using New_College.IRepository.UnitOfWork; using New_College.Model; using New_College.Model.Models; using New_College.Model.ViewModels; using New_College.Repository.Base; using NPOI.OpenXmlFormats.Dml.Diagram; using NPOI.SS.Formula.Functions; using Serilog; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Numerics; using System.Text; using System.Threading.Tasks; namespace New_College.Repository { /// /// T_EnrollmentPlanedescRepository /// public class T_EnrollmentPlanedescRepository : BaseRepository, IT_EnrollmentPlanedescRepository { private readonly IV_CustomerInfoRepository v_CustomerInfo; private readonly IT_EnrollmentPlaneRepository t_EnrollmentPlane; private readonly ID_MajorRepository d_Major; private readonly ID_PlanMajorDescRepository planMajorDesc; private readonly ID_PlanMajorScoreLineRepository planMajorScoreLine; private readonly ID_UniversityRepository d_University; private readonly ISysRegionRepository _sysRegionRepository; private readonly IT_TbSNeedDataInfoRepository t_TbSNeedDataInfo; public T_EnrollmentPlanedescRepository(IUnitOfWork unitOfWork, IV_CustomerInfoRepository _CustomerInfoRepository, IT_EnrollmentPlaneRepository t_EnrollmentPlaneRepository, ID_MajorRepository d_MajorRepository, ID_PlanMajorDescRepository planMajorDesc, ID_PlanMajorScoreLineRepository planMajorScoreLine, ID_UniversityRepository d_University, ISysRegionRepository sysRegionRepository, IT_TbSNeedDataInfoRepository tbSNeedDataInfo) : base(unitOfWork) { this.v_CustomerInfo = _CustomerInfoRepository; this.t_EnrollmentPlane = t_EnrollmentPlaneRepository; this.d_Major = d_MajorRepository; this.planMajorDesc = planMajorDesc; this.planMajorScoreLine = planMajorScoreLine; this.d_University = d_University; this._sysRegionRepository = sysRegionRepository; this.t_TbSNeedDataInfo = tbSNeedDataInfo; } public async Task>> GetUniversityMapItems(CWBUniversityDetailQuery query) { query.Year = query.Year > 2023 ? 2023 : query.Year; var response = new List(); RefAsync totalNumber = 0; var regionlist = this.Db.Queryable().Where(c => c.Level == 1).WhereIF(query.provinceIds != null && query.provinceIds.Any(), c => SqlFunc.ContainsArray(query.provinceIds, c.KeyId)).Select(c => c.RegionName).ToList(); var subjects = new string[] { }; string sbuOne = string.Empty; string sbuTwo = string.Empty; string sbuTree = string.Empty; float chongfirst = query.Score + 15; float chongend = query.Score + 5; float wenend = query.Score - 15; if (!string.IsNullOrWhiteSpace(query.SubjectClaim)) { subjects = query.SubjectClaim.Split(","); sbuOne = subjects[0]; sbuTwo = subjects[1]; sbuTree = subjects[2]; } var majornames = new List(); var majoraslist = new List(); if (query.MajorIds != null && query.MajorIds.Count > 0) { //所选专业增加majorids筛选 //query.MajorIds majoraslist = await this.d_Major.Query(x => x.IsDelete == false && SqlFunc.ContainsArray(query.MajorIds, x.Id)); if (majoraslist.Count() <= 0) // return new MessageModel>() { success = false, msg = "所选专业大类数据完善中..." }; majornames = majoraslist.Select(x => x.MajorCode).ToList(); } var recommandinfo = await this.Db.Queryable() .WhereIF(regionlist.Any(), p => SqlFunc.ContainsArray(regionlist, p.Province)) //.WhereIF(query.Year > 0, p => p.Years == query.Year) .WhereIF(!string.IsNullOrEmpty(query.Location), p => p.Location == query.Location) // .WhereIF(!string.IsNullOrEmpty(query.BatchName), p => p.BatchName == query.BatchName) .WhereIF(string.IsNullOrWhiteSpace(query.Type), p => int.Parse(p._23Score) > 0 && (int.Parse(p._23Score) <= query.Score + 15)) .WhereIF(query.Type == "冲", p => int.Parse(p._23Score) > 0 && (int.Parse(p._23Score) <= query.Score + 15 && int.Parse(p._23Score) > query.Score + 5)) .WhereIF(query.Type == "稳", p => int.Parse(p._23Score) > 0 && (int.Parse(p._23Score) <= query.Score + 5 && int.Parse(p._23Score) > query.Score - 15)) .WhereIF(query.Type == "保", p => int.Parse(p._23Score) > 0 && (int.Parse(p._23Score) < query.Score - 15)) .WhereIF(!string.IsNullOrWhiteSpace(query.SubjectClaim), p => (SqlFunc.Contains(p._23subject, sbuOne) || SqlFunc.Contains(p._23subject, sbuTwo) || SqlFunc.Contains(p._23subject, sbuTree))) .WhereIF(majornames.Any() && majornames.Count() > 0, p => SqlFunc.ContainsArray(majornames, p.MajorCode)) //.WhereIF(query.UniversityIds.Any() && query.UniversityIds.Count() > 0, p => SqlFunc.ContainsArray(query.UniversityIds, p.UId)) .Select(p => new UniversityEnrollmentPlanResult() { // UniversityId = p.UId, //PlanId = p.Id, // Scoreline = p.LowScore }) .ToListAsync(); // var recommendInfo = await this.Db.Queryable() // .WhereIF(regionlist.Any(), p => SqlFunc.ContainsArray(regionlist, p.AreaName)) //.WhereIF(query.Year > 0, p => p.Years == query.Year) //.WhereIF(!string.IsNullOrEmpty(query.Location), p => p.Location == query.Location) //.WhereIF(!string.IsNullOrEmpty(query.BatchName), p => p.BatchName == query.BatchName) //.WhereIF(string.IsNullOrWhiteSpace(query.Type), p => p.LowScore > 0 && (p.LowScore <= query.Score + 15)) //.WhereIF(query.Type == "冲", p => p.LowScore > 0 && (p.LowScore <= query.Score + 15 && p.LowScore > query.Score + 5)) //.WhereIF(query.Type == "稳", p => p.LowScore > 0 && (p.LowScore <= query.Score + 5 && p.LowScore > query.Score - 15)) //.WhereIF(query.Type == "保", p => p.LowScore > 0 && (p.LowScore < query.Score - 15)) //.WhereIF(!string.IsNullOrWhiteSpace(query.SubjectClaim), p => (SqlFunc.Contains(p.SelectSubject, sbuOne) || SqlFunc.Contains(p.SelectSubject, sbuTwo) || SqlFunc.Contains(p.SelectSubject, sbuTree))) //.WhereIF(majornames.Any() && majornames.Count() > 0, p => SqlFunc.ContainsArray(majornames, p.MajorCode)) // .WhereIF(query.UniversityIds.Any() && query.UniversityIds.Count() > 0, p => SqlFunc.ContainsArray(query.UniversityIds, p.UId)) //.Select(p => new UniversityEnrollmentPlanResult() //{ // UniversityId = p.UId, // PlanId = p.Id, // // Scoreline = p.LowScore //}) //.ToListAsync(); // var universitylist = recommendInfo.Select(c => c.UniversityId).Distinct().ToList(); // universitylist.ForEach(a => // { // response.Add(new UniversityMapMajorItems() // { // UId = a, // MIds = recommendInfo.Where(e => e.UniversityId == a).Select(c => c.PlanId).ToList() // }); // }); return new MessageModel>() { response = response }; } /// /// CWB /// /// /// public async Task>> GetCWBUniversityDetail(CWBUniversityDetailQuery query) { query.Year = query.Year > 2023 ? 2023 : query.Year; RefAsync totalNumber = 0; if (query.provinceIds == null) { query.provinceIds = new List() { 0 }; } if (string.IsNullOrWhiteSpace(query.SubjectClaim)) { return new MessageModel>() { msg = "选科参数必填", success = false }; } var subjecttype = query.SubjectClaim.Length == 2 ? query.SubjectClaim : "综合"; query.SubjectClaim = query.SubjectClaim.Length == 2 ? (query.SubjectClaim == "理科" ? "物,化,生" : "政,史,地") : query.SubjectClaim; var regionlist = this.Db.Queryable().Where(c => c.Level == 1).WhereIF(query.provinceIds != null && query.provinceIds.Any(), c => SqlFunc.ContainsArray(query.provinceIds, c.KeyId)).Select(c => c.RegionName).ToList(); var claim = new string[] { }; string sbuOne = string.Empty; string sbuTwo = string.Empty; string sbuTree = string.Empty; float chongfirst = query.Score + 15; float chongend = query.Score + 5; float wenend = query.Score - 15; var claim01 = ""; var claim02 = ""; var claim03 = ""; if (!string.IsNullOrWhiteSpace(query.SubjectClaim)) { claim = query.SubjectClaim.Split(","); claim01 = claim[0]; claim02 = claim[1]; claim03 = claim[2]; } var majornames = new List(); var majoraslist = new List(); if (query.MajorIds != null && query.MajorIds.Count > 0) { //所选专业增加majorids筛选 //query.MajorIds majoraslist = await this.d_Major.Query(x => x.IsDelete == false && SqlFunc.ContainsArray(query.MajorIds, x.Id)); if (majoraslist.Count() <= 0) return new MessageModel>() { success = false, msg = "所选专业大类数据完善中..." }; majornames = majoraslist.Select(x => x.MajorName).ToList(); } StringBuilder sqlstr = new StringBuilder(); sqlstr.AppendFormat("SELECT * from T_TbSNeedDataInfo where SubjectType='{0}' ", subjecttype); if (regionlist.Any()) { sqlstr.AppendFormat(" and Province in ('{0}')", string.Join("','", regionlist)); } //if (query.Year > 0) //{ // sqlstr.AppendFormat("and Years={0}", query.Year); //} if (!string.IsNullOrEmpty(query.Location)) { sqlstr.AppendFormat(" and Location='{0}'", query.Location); } if (string.IsNullOrEmpty(query.Type)) { sqlstr.AppendFormat(" and (_23Score BETWEEN {0} and {1})", query.Score - 60, query.Score + 15); } if (query.Type == "冲") { sqlstr.AppendFormat(" and (_23Score BETWEEN {0} and {1})", query.Score, query.Score + 15); } if (query.Type == "稳") { sqlstr.AppendFormat(" and (_23Score BETWEEN {0} and {1})", query.Score - 26, query.Score - 1); } if (query.Type == "保") { sqlstr.AppendFormat(" and (_23Score BETWEEN {0} and {1})", query.Score - 60, query.Score - 26); } if (majornames.Any() && majornames.Count() > 0) { sqlstr.AppendFormat(" and MajorName in ('{0}')", string.Join("','", majornames)); } if (!string.IsNullOrWhiteSpace(query.SubjectClaim)) { sqlstr.AppendFormat(" and (_23subject like'%{0}%' or _23subject like'%{1}%' or _23subject like'%{2}%' )", claim01, claim02, claim03); } sqlstr.Append(" order by _23Score"); //string sql = string.Format("SELECT * from T_TbSNeedDataInfo where location='{0}' and _23Score BETWEEN {1} and {2} and (_23subject like'%{3}%' or _23subject like'%{4}%' or _23subject like'%{5}%' )" // , query.Location, query.Score, query.Score + 15, claim01, claim02, claim03); var recommendInfo = await this.Db.SqlQueryable(sqlstr.ToString()).ToListAsync(); // var recommendInfo = await this.Db.Queryable() // .WhereIF(regionlist.Any(), p => SqlFunc.ContainsArray(regionlist, p.Province)) // //.WhereIF(query.Year > 0, p => p.Years == query.Year) // .WhereIF(!string.IsNullOrEmpty(query.Location), p => p.Location == query.Location) // .Where(p => p.SubjectType == subjecttype) // //.WhereIF(!string.IsNullOrEmpty(query.BatchName), p => p.BatchName == query.BatchName) // .WhereIF(string.IsNullOrWhiteSpace(query.Type), p => int.Parse(p._23Score) > 0 && SqlFunc.Between(int.Parse(p._23Score), query.Score - 60, query.Score + 15)) // .WhereIF(query.Type == "冲", p => int.Parse(p._23Score) > 0 && SqlFunc.Between(int.Parse(p._23Score), query.Score, query.Score + 15)) // .WhereIF(query.Type == "稳", p => int.Parse(p._23Score) > 0 && SqlFunc.Between(int.Parse(p._23Score), query.Score - 26, query.Score - 1)) // .WhereIF(query.Type == "保", p => int.Parse(p._23Score) > 0 && SqlFunc.Between(int.Parse(p._23Score), query.Score - 60, query.Score - 26)) // .WhereIF(!string.IsNullOrWhiteSpace(query.SubjectClaim), c => SqlFunc.Contains(c._23subject, claim01) || SqlFunc.Contains(c._23subject, claim02) || SqlFunc.Contains(c._23subject, claim03) || c._23subject == "不限") // .WhereIF(majornames.Any() && majornames.Count() > 0, p => SqlFunc.ContainsArray(majornames, p.MajorName)) //.ToListAsync(); var universitylist = recommendInfo.GroupBy(g => g.UniversityName).Select(c => new UniversityEnrollmentPlanResult() { UniversityName = c.Key }).ToList(); var universitytemps = (await d_University.Query(c => SqlFunc.ContainsArray(recommendInfo.Select(c => c.UniversityName).ToList(), c.Name))).Select(c => new D_University() { Id = c.Id, Logo = c.Logo, Name = c.Name }).ToList(); var ulist = universitylist.Select(s => new UniversityEnrollmentPlanResult() { Logo = universitytemps.FirstOrDefault(e => e.Name == s.UniversityName) != null ? universitytemps.FirstOrDefault(e => e.Name == s.UniversityName).Logo : "", UniversityId = universitytemps.FirstOrDefault(e => e.Name == s.UniversityName) != null ? universitytemps.FirstOrDefault(e => e.Name == s.UniversityName).Id : 0, AreaName = recommendInfo.Any(e => e.UniversityName == s.UniversityName) ? recommendInfo.FirstOrDefault(e => e.UniversityName == s.UniversityName).Province : " ", UniversityCode = recommendInfo.Any(e => e.UniversityName == s.UniversityName) ? recommendInfo.FirstOrDefault(e => e.UniversityName == s.UniversityName).EnrollmentCode : "", Rank = recommendInfo.Any(e => e.UniversityName == s.UniversityName) ? recommendInfo.FirstOrDefault(e => e.UniversityName == s.UniversityName).UniversityRank : " ", _985 = recommendInfo.Any(e => e.UniversityName == s.UniversityName) ? (recommendInfo.FirstOrDefault(e => e.UniversityName == s.UniversityName).LnstitutionalLevel != null ? (recommendInfo.FirstOrDefault(e => e.UniversityName == s.UniversityName).LnstitutionalLevel.Contains("985") ? "是" : "否") : "否") : "否", _211 = recommendInfo.Any(e => e.UniversityName == s.UniversityName) ? (recommendInfo.FirstOrDefault(e => e.UniversityName == s.UniversityName).LnstitutionalLevel != null ? (recommendInfo.FirstOrDefault(e => e.UniversityName == s.UniversityName).LnstitutionalLevel.Contains("211") ? "是" : "否") : "否") : "否", _SYL = recommendInfo.Any(e => e.UniversityName == s.UniversityName) ? (recommendInfo.FirstOrDefault(e => e.UniversityName == s.UniversityName).LnstitutionalLevel != null ? (recommendInfo.FirstOrDefault(e => e.UniversityName == s.UniversityName).LnstitutionalLevel.Contains("双一流") ? "是" : "否") : "否") : "否", SchoolScoreline = recommendInfo.Any(e => e.UniversityName == s.UniversityName) ? int.Parse(recommendInfo.FirstOrDefault(e => e.UniversityName == s.UniversityName)._23SchoolScoreLine) : 0, SchoolLowScore = recommendInfo.Any(e => e.UniversityName == s.UniversityName) ? int.Parse(recommendInfo.FirstOrDefault(e => e.UniversityName == s.UniversityName)._23SchoolScore) : 0, Type = MajorPlanScoreTool.GetPlanScore(int.Parse(recommendInfo.FirstOrDefault(e => e.UniversityName == s.UniversityName)._23Score), (int)query.Score) == 2 ? "冲" : MajorPlanScoreTool.GetPlanScore(int.Parse(recommendInfo.FirstOrDefault(e => e.UniversityName == s.UniversityName)._23Score), (int)query.Score) == 1 ? "稳" : "保",//冲稳保院校 Percentage = MajorPlanScoreTool.GetPlanPercentage(int.Parse(recommendInfo.FirstOrDefault(e => e.UniversityName == s.UniversityName)._23Score), (int)query.Score), AscriptionName = recommendInfo.Any(e => e.UniversityName == s.UniversityName) ? recommendInfo.FirstOrDefault(e => e.UniversityName == s.UniversityName).Ownership : " ", CityName = recommendInfo.Any(e => e.UniversityName == s.UniversityName) ? recommendInfo.FirstOrDefault(e => e.UniversityName == s.UniversityName).City : " ", MjaorPlan = recommendInfo.Any(e => e.UniversityName == s.UniversityName) ? recommendInfo.Where(e => e.UniversityName == s.UniversityName).Count() : 0, planCount = recommendInfo.Any(e => e.UniversityName == s.UniversityName) ? recommendInfo.Where(e => e.UniversityName == s.UniversityName).Sum(m => int.Parse(m._23Count)) : 0, PlanIds = recommendInfo.Any(e => e.UniversityName == s.UniversityName) ? (recommendInfo.Where(e => e.UniversityName == s.UniversityName).Select(c => c.ID).ToList()) : null, UniversityName = s.UniversityName, }).OrderByDescending(t => t.Type).OrderBy(t => t.SchoolScoreline).Skip(query.PageSize * (query.PageIndex - 1)).Take(query.PageSize).ToList(); return new MessageModel>() { success = true, msg = "获取成功", response = new PageModel() { data = ulist, dataCount = universitylist.Count, page = query.PageIndex, PageSize = query.PageSize, pageCount = (int)Math.Ceiling(universitylist.Count / Convert.ToDecimal(query.PageSize)) } }; } /// /// 智能选大学 /// /// /// public async Task> GetRecommendUniversity(RecommendUniversityQuery query) { var subjecttype = query.SubjectClaim.Length == 2 ? query.SubjectClaim : "综合"; query.SubjectClaim = query.SubjectClaim.Length == 2 ? (query.SubjectClaim == "理科" ? "物,化,生" : "政,史,地") : query.SubjectClaim; RefAsync totalNumber = 0; var maxscore = query.Score + 15; var minscore = query.Score - 60; query.Year = query.Year > 2023 ? 2023 : query.Year; //var custome = (await this.v_CustomerInfo.QueryById(query.CustomerId)); // int planId = (await t_EnrollmentPlane.Query(e => e.Years == custome.Year && e.Area_Id == custome.AreaId)).FirstOrDefault().Id; //} var recommendInfo = await this.Db.Queryable((plans, universitys) => new object[] { JoinType.Left, plans.UId == universitys.Id }) .Where((plans, universitys) => plans.Location == query.Location) .Where((plans, universitys) => plans.SubjectType == subjecttype) .Where((plans, universitys) => plans.Years == query.Year) .WhereIF(query.SubjectLevel > 0, (plans, universitys) => universitys.Subject_Level == query.SubjectLevel) .WhereIF(query.Type >= 0, (plans, universitys) => universitys.Type == query.Type) .WhereIF(query.Nhef >= 0, (plans, universitys) => universitys.Nhef == query.Nhef) .WhereIF(query.Sff >= 0, (plans, universitys) => universitys.Sff == query.Sff) .WhereIF(query.Syl >= 0, (plans, universitys) => universitys.Syl == query.Syl) .WhereIF(query.Nature > 0, (plans, universitys) => universitys.Nature == query.Nature) .WhereIF(!string.IsNullOrWhiteSpace(query.AreaName) && query.AreaName != "选择省份", (plans, universitys) => universitys.Area_Name == query.AreaName) .WhereIF(maxscore > 10, (plans, universitys) => plans.LowScore <= maxscore) .WhereIF(minscore > 0, (plans, universitys) => plans.LowScore > minscore) .WhereIF(query.Ranking > 0, (plans, universitys) => plans.LowScoreRank >= query.Ranking - 6) // .Where(!string.IsNullOrWhiteSpace(query.SubjectClaim), (plans, universitys) => (plans.SubjectType.Contains(sbuOne) || plans.SelectSubject.Contains(sbuTwo) || plans.SelectSubject.Contains(sbuTree))) .OrderBy((plans, universitys) => plans.LowScoreRank, OrderByType.Asc) .Select((plans, universitys) => new UniversityResult() { Id = universitys.Id, Name = universitys.Name, Nature = universitys.Nature, AscriptionName = universitys.AscriptionName, SubjectLevel = universitys.Subject_Level, AreaName = universitys.Area_Name, Logo = universitys.Logo, Syl = universitys.Syl == 1 ? true : false, Nhef = universitys.Nhef == 1 ? true : false, Sff = universitys.Sff == 1 ? true : false, UniversityType = universitys.Type, Scorepostion = plans.LowScoreRank, ScoreLine = plans.LowScore, Years = plans.Years }) .ToPageListAsync(query.PageIndex, query.PageSize, totalNumber); recommendInfo.ForEach(recommendInfo => { recommendInfo.Percentage = MajorPlanScoreTool.GetPlanPercentage((int)recommendInfo.ScoreLine, query.Score); }); return new PageModel() { data = recommendInfo.OrderBy(o => o.Percentage).ToList(), page = query.PageIndex, PageSize = query.PageSize, dataCount = totalNumber, pageCount = (int)Math.Ceiling(totalNumber / Convert.ToDecimal(query.PageSize)) }; } } }