using Admin.NET.Core.Util; using AngleSharp.Dom; using Elastic.Clients.Elasticsearch; using Microsoft.Extensions.Caching.Distributed; using MongoDB.Bson; using MongoDB.Driver; using Newtonsoft.Json; using Qiniu.Util; using SqlSugar; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using static SKIT.FlurlHttpClient.Wechat.Api.Models.ScanProductAddV2Request.Types.Product.Types; namespace Admin.NET.Core.Service; [ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 900)] [Route("api/PlanPro")] public class PlanProService : IDynamicApiController, ITransient { //private const string _cachekey = "plan_"; private readonly IDistributedCache _distributed; private readonly SqlSugarRepository _sysDictDataRep; private readonly IMongoDBRepository _mongoRepository; private readonly IHttpContextAccessor _httpContextAccessor; private readonly SqlSugarRepository _sysAreaConfig; public PlanProService(IDistributedCache distributedCache, SqlSugarRepository sysDictDataRep, IMongoDBRepository mongoDBRepository, IHttpContextAccessor httpContextAccessor, SqlSugarRepository sysAreaConfig) { _distributed = distributedCache; _sysDictDataRep = sysDictDataRep; _mongoRepository = mongoDBRepository; _httpContextAccessor = httpContextAccessor; _sysAreaConfig = sysAreaConfig; } /// ///根据查询条件获取招生计划 /// /// /// [HttpPost] public async Task> PlanList([FromBody] seachzsplanfusionRequestDto request) { if (string.IsNullOrWhiteSpace(request.locationCode)) { throw Oops.Oh("locationCode参数不能为空"); } //if (request.subjects == null || request.subjects.Count() <= 0) //{ // throw Oops.Oh("subjects参数 不能为空"); //} //if (!request.score.HasValue)//目前位次计算还没有好的计算方式,分数转位次只做参考,因还需考虑到选科组合不同对应位次细分问题 //{ // throw Oops.Oh("score参数 不能为空"); //} var onekeylist = new List(); var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); var bejson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", request.locationCode)); // 动态条件列表 var filterBuilders = new List>(); if (request.feature != null) { filterBuilders.Add(Builders.Filter.All(p => p.features, request.feature)); } if (request.province != null) { filterBuilders.Add(Builders.Filter.In(p => p.province, request.province)); } if (!string.IsNullOrWhiteSpace(request.keyword)) { filterBuilders.Add(Builders.Filter.Regex(p => p.majorName, new BsonRegularExpression($"/{request.keyword}/"))); } if (!string.IsNullOrWhiteSpace(request.universityName)) { filterBuilders.Add(Builders.Filter.Regex(p => p.universityName, new BsonRegularExpression($"/{request.universityName}/"))); } if (!string.IsNullOrWhiteSpace(request.batchName)) { filterBuilders.Add(Builders.Filter.Eq(p => p.batchName, request.batchName)); } if (request.majors != null) { filterBuilders.Add(Builders.Filter.In(p => p.majorName, request.majors)); } // 使用And组合所有过滤条件 FilterDefinition filter = filterBuilders.Count > 0 ? Builders.Filter.And(filterBuilders) : new BsonDocument(); // 如果没有条件,则使用空过滤器 var sort = Builders.Sort.Ascending(x => x._score); // 替换YourField为实际的排序字段 var pagelist = await bejson.Find(filter).ToListAsync(); pagelist.ForEach(a => { var filter = Builders.Filter.Eq("_id", a._id); #region ******浙江batchname //if (a._score >= 488) //{ // // 构建更新定义:将新字段添加到文档 // var updateDefinition = Builders.Update.Set("batchName", "普通类一段"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); //} //else if (a._score < 488 && a._score > 0) //{ // var updateDefinition = Builders.Update.Set("batchName", "普通类二段"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); //} //else //{ // var updateDefinition = Builders.Update.Set("batchName", "缺失"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); //} #endregion ******浙江batchname #region ******山东batchname //if (a._score >= 443) //{ // // 构建更新定义:将新字段添加到文档 // var updateDefinition = Builders.Update.Set("batchName", "普通类一段"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); //} //else if (a._score < 443 && a._score > 0) //{ // var updateDefinition = Builders.Update.Set("batchName", "普通类二段"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); //} //else //{ // var updateDefinition = Builders.Update.Set("batchName", "缺失"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); //} #endregion ******山东batchname #region ***********河南batchbname******* // 假设我们要更新的文档的过滤条件(这里以 _id 为例) //if (a.subjectType == "文科") //{ // if (a._score >= 547) // { // // 构建更新定义:将新字段添加到文档 // var updateDefinition = Builders.Update.Set("batchName", "本一"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); // } // else if (a._score < 547 && a._score >= 465) // { // var updateDefinition = Builders.Update.Set("batchName", "本二"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); // } // else if (a._score > 0 && a._score < 465) // { // var updateDefinition = Builders.Update.Set("batchName", "专科"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); // } // else // { // var updateDefinition = Builders.Update.Set("batchName", "缺失"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); // } //} //if (a.subjectType == "理科") //{ // if (a._score >= 514) // { // // 构建更新定义:将新字段添加到文档 // var updateDefinition = Builders.Update.Set("batchName", "本一"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); // } // else if (a._score < 514 && a._score >= 409) // { // var updateDefinition = Builders.Update.Set("batchName", "本二"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); // } // else if (a._score > 0&&a._score<409) // { // var updateDefinition = Builders.Update.Set("batchName", "专科"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); // } // else // { // var updateDefinition = Builders.Update.Set("batchName", "缺失"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); // } //} #endregion ***********河南batchbname******* // 执行更新操作 onekeylist.Add(new seachzsplanfusionResponse() { //type = MajorPlanscoreTool.GetPlanScore(a._score, request.score.Value), //// percentAge = MajorPlanscoreTool.GetPlanPercentage(a._score, request.score.Value), //percentAge = MajorPlanscoreTool.CalctPercentage(a.items.Select(c => c.score).ToList(), request.score.Value), academic = a.academicYear, cityName = a.city, collegeCode = a.enrollmentCode, features = a.features, fee = a.fee, lowScore = a._schoolScore, lowscoreRank = a._schoolScoreLine, majorGroup = string.IsNullOrWhiteSpace(a.majorGroup) ? "" : "(" + a.majorGroup.Split("(")[1], major = a.majorName, majorCode = a.majorCode, planId = a.pid, ownership = a.ownership, planCount = a.planCount, provinceName = a.province, remark = a.remark, subjectClam = a._23subject, universityName = a.universityName, // nature = a.nature, subjectType = a.subjectType, batchName = a.batchName // planItems = a.items }); }); int totalPages = 0, totalCount = 0; totalCount = onekeylist.Count; totalPages = (int)Math.Ceiling((double)totalCount / request.PageSize); var items = onekeylist.Skip((request.PageIndex - 1) * request.PageSize).Take(request.PageSize).ToList(); return new PageBaseResult() { PageNo = request.PageIndex, PageSize = request.PageSize, TotalPage = totalPages, TotalRows = totalCount, Rows = items, }; } /// ///根据院校id获取招生计划列表 /// /// /// [HttpGet] public async Task> List([FromQuery] PlanProRequestDto request) { //var unlist = new List(); // 动态条件列表 var filterBuilders = new List>(); if (string.IsNullOrWhiteSpace(request.locationCode)) { throw Oops.Oh("locationCode 不能为空"); } filterBuilders.Add(Builders.Filter.Eq(p => p.location, request.locationCode)); if (request._uid <= 0) { throw Oops.Oh("用户id 不能为空"); } if (request._uid > 0) { filterBuilders.Add(Builders.Filter.Eq(p => p._uid, request._uid)); } if (!string.IsNullOrWhiteSpace(request.years)) { filterBuilders.Add(Builders.Filter.Eq(p => p.years, request.years)); } if (!string.IsNullOrWhiteSpace(request.batchName)) { filterBuilders.Add(Builders.Filter.Eq(p => p.batchName, request.batchName)); } DateTime dt = DateTime.Now; DateTime fixedDate = new DateTime(dt.Year, 7, 20); // 创建当前年份的7月20日 int year = dt > fixedDate ? dt.Year : dt.Year - 1; // 比较当前日期与固定日期 string years = string.IsNullOrWhiteSpace(request.years) ? year.ToString() : request.years; // 使用And组合所有过滤条件 var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); var bejson = dbclient.GetCollection(string.Format("zsplanpro_{0}_{1}", request.locationCode, years)); FilterDefinition filter = filterBuilders.Count > 0 ? Builders.Filter.And(filterBuilders) : new BsonDocument(); // 如果没有条件,则使用空过滤器 var list = await bejson.Find(filter).ToListAsync(); var result = list.Select(s => new PlanProOutDto() { batchName = s.batchName, location = s.location, major = s.major, majorcode = s.majorcode, majorgroupname = string.IsNullOrWhiteSpace(s.majorgroupname) ? "" : "(" + s.majorgroupname.Split("(")[1], plancount = s.plancount, remark = s.remark, selectsubject = s.selectsubject, years = s.years, lowscorerank = s.lowscorerank.ToString() == "0" ? "--" : s.lowscorerank.ToString(), lowscore = s.lowscore.ToString() == "0" ? "--" : s.lowscore.ToString(), academic = s.academic, universityCode = s.universityCode, universityName = s.universityName, fee = s.fee, _uid = s._uid }).ToList(); return result; } /// /// 根据院校id获取招生计划列表(V2) /// /// /// [HttpGet] public async Task ListV2([FromQuery] PlanProRequestDto request) { var result = new PlanProMainDto(); var filterBuilders = new List>(); if (string.IsNullOrWhiteSpace(request.locationCode)) { throw Oops.Oh("locationCode 不能为空"); } filterBuilders.Add(Builders.Filter.Eq(p => p.location, request.locationCode)); if (request._uid <= 0) { throw Oops.Oh("用户id 不能为空"); } filterBuilders.Add(Builders.Filter.Eq(p => p._uid, request._uid)); if (!string.IsNullOrWhiteSpace(request.years)) { filterBuilders.Add(Builders.Filter.Eq(p => p.years, request.years)); } if (!string.IsNullOrWhiteSpace(request.batchName)) { filterBuilders.Add(Builders.Filter.Eq(p => p.batchName, request.batchName)); } DateTime dt = DateTime.Now; DateTime fixedDate = new DateTime(dt.Year, 7, 20); int year = dt > fixedDate ? dt.Year : dt.Year - 1; string years = string.IsNullOrWhiteSpace(request.years) ? year.ToString() : request.years; var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); var bejson = dbclient.GetCollection($"zsplanpro_{request.locationCode}_{years}"); // **查询符合 request 条件的计划数据** FilterDefinition planFilter = filterBuilders.Count > 0 ? Builders.Filter.And(filterBuilders) : new BsonDocument(); var list = await bejson.Find(planFilter).ToListAsync(); result.plans = list.Select(s => new PlanProOutDto() { batchName = s.batchName, location = s.location, major = s.major, majorcode = s.majorcode, majorgroupname = string.IsNullOrWhiteSpace(s.majorgroupname) ? "" : "(" + s.majorgroupname.Split("(")[1], plancount = s.plancount, remark = s.remark, selectsubject = s.selectsubject, years = s.years, lowscorerank = s.lowscorerank.ToString() == "0" ? "--" : s.lowscorerank.ToString(), lowscore = s.lowscore.ToString() == "0" ? "--" : s.lowscore.ToString(), academic = s.academic, universityCode = s.universityCode, universityName = s.universityName, fee = s.fee, _uid = s._uid }).ToList(); // **批次列表查询(不带 batchName 过滤)** var batchFilter = Builders.Filter.Eq(p => p.location, request.locationCode); var batchList = await bejson .Find(batchFilter) .Project(p => p.batchName) // 仅查询 batchName 字段 .ToListAsync(); result.Batches = batchList .Distinct() // 去重 .Select(b => new PlanBatchNameDto { batchName = b }) .ToList(); // 生成过去 4 年的年份列表 List yearsList = new List(); for (int i = 0; i < 4; i++) // 这里控制要多少年 { yearsList.Add((year - i).ToString()); } result.yearsDtos = yearsList; return result; } /// ///根据院校给出录取分数线 /// /// [ApiDescriptionSettings(Name = "AdmissionMark"), HttpGet] public async Task AdmissionMark([FromQuery] PlanProRequestDto request) { var result = new planadmissionMarkDto(); var filterBuilders = new List>(); if (string.IsNullOrWhiteSpace(request.locationCode)) { throw Oops.Oh("locationCode 不能为空"); } filterBuilders.Add(Builders.Filter.Eq(p => p.location, request.locationCode)); if (request._uid <= 0) { throw Oops.Oh("高校id 不能为空"); } filterBuilders.Add(Builders.Filter.Eq(p => p.college_id, request._uid)); if (!string.IsNullOrWhiteSpace(request.years)) { int y = int.Parse(request.years); filterBuilders.Add(Builders.Filter.Eq(p => p.year, y)); } DateTime dt = DateTime.Now; DateTime fixedDate = new DateTime(dt.Year, 7, 20); int year = dt > fixedDate ? dt.Year : dt.Year - 1; string years = string.IsNullOrWhiteSpace(request.years) ? year.ToString() : request.years; var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); var bejson = dbclient.GetCollection($"zz_zsplanfusion_{request.locationCode}"); // **查询符合 request 条件的计划数据** FilterDefinition planFilter = filterBuilders.Count > 0 ? Builders.Filter.And(filterBuilders) : new BsonDocument(); var list = await bejson.Find(planFilter).ToListAsync(); result.newZsplanfusions = list.OrderBy(e => e.year).ToList(); List yearsList = new List(); for (int i = 0; i < 4; i++) // 这里控制要多少年 { yearsList.Add((year - i).ToString()); } result.Years = yearsList; return result; } /// ///查询录取分数线V2 /// /// /// [ApiDescriptionSettings(Name = "AdmissionMarkV2"), HttpGet] public async Task AdmissionMarkV2([FromQuery] PlanProRequestDto request) { var result = new planadmissionMarkDto(); var filterBuilders = new List>(); //if (string.IsNullOrWhiteSpace(request.locationCode)) //{ // throw Oops.Oh("locationCode 不能为空"); //} //filterBuilders.Add(Builders.Filter.Eq(p => p.lo, request.locationCode)); if (request._uid <= 0) { throw Oops.Oh("高校id 不能为空"); } filterBuilders.Add(Builders.Filter.Eq(p => p.school_id, request._uid)); if (!string.IsNullOrWhiteSpace(request.years)) { int y = int.Parse(request.years); filterBuilders.Add(Builders.Filter.Eq(p => p.year, y)); } var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); string dbname = $"spscorenames_{request.locationCode.Substring(0, 2)}_{request.years}"; var bejson = dbclient.GetCollection(dbname); // **查询符合 request 条件的计划数据** FilterDefinition planFilter = filterBuilders.Count > 0 ? Builders.Filter.And(filterBuilders) : new BsonDocument(); var list = await bejson.Find(planFilter).ToListAsync(); result.newZsplanfusions = list.Select(s => new newZsplanfusionDto() { b_college_name = s.name, college_id = (int)s.school_id, location = request.locationCode, subject_name = s.sg_info, group_code = s.sg_name, group_name = s.sg_name, major_code = s.sp_scode, major_name = s.sp_name, major_memo = s.spname, score_min = s.min.ToString(), rank_min = s.min_section.ToString(), year = s.year, score_max = s.max, score_average = s.average, volunteer_type = s.local_batch_name }).ToList(); DateTime dt = DateTime.Now; DateTime fixedDate = new DateTime(dt.Year, 7, 20); int year = dt > fixedDate ? dt.Year : dt.Year - 1; string years = string.IsNullOrWhiteSpace(request.years) ? year.ToString() : request.years; List yearsList = new List(); for (int i = 0; i < 4; i++) // 这里控制要多少年 { yearsList.Add((year - i).ToString()); } result.Years = yearsList; return result; } #region #########更新批次数据########### #endregion #########更新批次数据########### [HttpGet] public async Task SyncBatchNamessplanPro([FromQuery] PlanProRequestDto request) { //var filterBuilders = new List>(); //var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); //var bejson = dbclient.GetCollection(string.Format("zsplanpro_{0}_{1}", request.locationCode, request.years)); //var bulkOps = new List>(); //// 构建过滤器 //FilterDefinition filter = filterBuilders.Count > 0 // ? Builders.Filter.And(filterBuilders) // : Builders.Filter.Empty; //// 查询数据 //var list = await bejson.Find(filter).ToListAsync(); //var _planpro = dbclient.GetCollection(string.Format("enroll_{0}_{1}", request.locationCode, request.years)); //var enroll = await _planpro.Find(new BsonDocument()).ToListAsync(); //list.ForEach(a => { // var eb = enroll.FirstOrDefault(e => e.enrollmentCode == a.universityCode && e.majorCode == a.majorcode); // if (eb != null) // { // // 添加更新操作 // var updateDefinition = Builders.Update.Set(x => x.batchName, eb.batchName); // var updateOne = new UpdateOneModel( // Builders.Filter.Eq(x => x._id, a._id), // 使用主键过滤 // updateDefinition // ); // bulkOps.Add(updateOne); // } //}); //// 执行批量更新 //if (bulkOps.Any()) //{ // var result = await bejson.BulkWriteAsync(bulkOps); // Console.WriteLine($"Matched: {result.MatchedCount}, Modified: {result.ModifiedCount}"); //} var filterBuilders = new List>(); var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); var bejson = dbclient.GetCollection("zsplanfusion_330000"); var bulkOps = new List>(); // 构建过滤器 FilterDefinition filter = filterBuilders.Count > 0 ? Builders.Filter.And(filterBuilders) : Builders.Filter.Empty; // 查询数据 var list = await bejson.Find(filter).ToListAsync(); var _planpro = dbclient.GetCollection(string.Format("enroll_{0}_{1}", request.locationCode, request.years)); var enroll = await _planpro.Find(new BsonDocument()).ToListAsync(); list.ForEach(a => { var eb = enroll.FirstOrDefault(e => e.enrollmentCode == a.enrollmentCode && e.majorCode == a.majorCode); if (eb != null) { // 添加更新操作 var updateDefinition = Builders.Update.Set(x => x.batchName, eb.batchName); var updateOne = new UpdateOneModel( Builders.Filter.Eq(x => x._id, a._id), // 使用主键过滤 updateDefinition ); bulkOps.Add(updateOne); } }); // 执行批量更新 if (bulkOps.Any()) { var result = await bejson.BulkWriteAsync(bulkOps); Console.WriteLine($"Matched: {result.MatchedCount}, Modified: {result.ModifiedCount}"); } return true; } #region*****临时更新数据**** /// /// 临时更新数据 /// /// /// [HttpGet] public async Task SyncZJZsplanPro([FromQuery] PlanProRequestDto request) { var filterBuilders = new List>(); var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); var bejson = dbclient.GetCollection(string.Format("zsplanpro_{0}_{1}", request.locationCode, request.years)); // 构建过滤器 FilterDefinition filter = filterBuilders.Count > 0 ? Builders.Filter.And(filterBuilders) : Builders.Filter.Empty; // 查询数据 var list = await bejson.Find(filter).ToListAsync(); var university = dbclient.GetCollection("university"); var unlist = await university.Find(Builders.Filter.Empty).ToListAsync(); // 更新 `_uid` 字段并生成批量更新操作 var bulkOps = new List>(); //list.ForEach(a => //{ // var uninfo = unlist.FirstOrDefault(e => e.name == a.universityName); // if (uninfo != null) // { // // a._uid = uninfo._id; // // 添加更新操作 // var updateDefinition = Builders.Update.Set(x => x._uid, uninfo._id); // var updateOne = new UpdateOneModel( // Builders.Filter.Eq(x => x._id, a._id), // 使用主键过滤 // updateDefinition // ); // bulkOps.Add(updateOne); // } //}); //// 执行批量更新 //if (bulkOps.Any()) //{ // var result = await bejson.BulkWriteAsync(bulkOps); // Console.WriteLine($"Matched: {result.MatchedCount}, Modified: {result.ModifiedCount}"); //} return true; } #endregion #region *****录入数据 [HttpGet] public async Task zsplanfusiondatachange([FromQuery] string location, string key) { if (key != "ycymedu") { return false; } var filterBuilders = new List>(); FilterDefinition filter = filterBuilders.Count > 0 ? Builders.Filter.And(filterBuilders) : new BsonDocument(); // 如果没有条件,则使用空过滤器 var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); var bejson = dbclient.GetCollection(string.Format("zsplanfusion_{0}", location)); var pagelist = await bejson.Find(filter).ToListAsync(); var list = new List(); var ff = new List(); pagelist.ForEach(c => { string batchname = string.Empty; #region ***四川*** if (c.subjectType == "文科") { if (c._23Score >= 527) { // 构建更新定义:将新字段添加到文档 batchname = "本一"; } else if (c._23Score < 527 && c._23Score >= 458) { batchname = "本二"; } else if (c._23Score > 0 && c._23Score < 458) { batchname = "专科"; } else { batchname = "缺失"; } } if (c.subjectType == "理科") { if (c._23Score >= 520) { batchname = "本一"; } else if (c._23Score < 520 && c._23Score >= 433) { batchname = "本二"; } else if (c._23Score > 0 && c._23Score < 433) { batchname = "专科"; } else { batchname = "缺失"; } } #endregion #region ******浙江batchname //list.ForEach(a => { // if (a.lowscore >= 488) // { // // 构建更新定义:将新字段添加到文档 // var updateDefinition = Builders.Update.Set("batchName", "普通类一段"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); // } // else if (a._score < 488 && a._score > 0) // { // var updateDefinition = Builders.Update.Set("batchName", "普通类二段"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); // } // else // { // var updateDefinition = Builders.Update.Set("batchName", "缺失"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); // } #endregion ******浙江batchname #region ******山东batchname //if (a._score >= 443) //{ // // 构建更新定义:将新字段添加到文档 // var updateDefinition = Builders.Update.Set("batchName", "普通类一段"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); //} //else if (a._score < 443 && a._score > 0) //{ // var updateDefinition = Builders.Update.Set("batchName", "普通类二段"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); //} //else //{ // var updateDefinition = Builders.Update.Set("batchName", "缺失"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); //} #endregion ******山东batchname #region ***********河南batchbname******* // 假设我们要更新的文档的过滤条件(这里以 _id 为例) //if (a.subjectType == "文科") //{ // if (a._score >= 547) // { // // 构建更新定义:将新字段添加到文档 // var updateDefinition = Builders.Update.Set("batchName", "本一"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); // } // else if (a._score < 547 && a._score >= 465) // { // var updateDefinition = Builders.Update.Set("batchName", "本二"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); // } // else if (a._score > 0 && a._score < 465) // { // var updateDefinition = Builders.Update.Set("batchName", "专科"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); // } // else // { // var updateDefinition = Builders.Update.Set("batchName", "缺失"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); // } //} //if (a.subjectType == "理科") //{ // if (a._score >= 514) // { // // 构建更新定义:将新字段添加到文档 // var updateDefinition = Builders.Update.Set("batchName", "本一"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); // } // else if (a._score < 514 && a._score >= 409) // { // var updateDefinition = Builders.Update.Set("batchName", "本二"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); // } // else if (a._score > 0&&a._score<409) // { // var updateDefinition = Builders.Update.Set("batchName", "专科"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); // } // else // { // var updateDefinition = Builders.Update.Set("batchName", "缺失"); // var updateResult = bejson.UpdateOne(filter, updateDefinition); // } //} #endregion ***********河南batchbname******* list.Add(new zsplanfusionmodel() { batchName = batchname, academicYear = c.academicYear, city = c.city, educationCategory = c.educationCategory, enrollmentCode = c.enrollmentCode, enrollmentType = c.enrollmentType, features = c.lnstitutionalLevel == null ? ff : c.lnstitutionalLevel.Split("/", StringSplitOptions.RemoveEmptyEntries).ToList(), fee = c.fee, firstType = c.firstType, location = c.location, majorCode = c.majorCode, majorGroup = string.IsNullOrWhiteSpace(c.majorGroup) ? "" : c.majorGroup.Split("(")[1], majorName = c.majorName, mjaorLevel = c.mjaorLevel == null ? ff : c.mjaorLevel.Split("/", StringSplitOptions.RemoveEmptyEntries).ToList(), nature = c.nature, ownership = c.ownership, phDMajor = c.phDMajor,//要改回去 pid = c.pid, professionalAssessment = c.professionalAssessment, province = c.province, remark = c.remark, subjectType = c.subjectType, universityName = c.universityName, _23subject = c._23subject, _24subject = c._24subject, _id = c._id, _schoolAvgLine = c._schoolAvgLine.Value, _schoolAvgScore = c._schoolAvgScore.Value, _schoolScore = c._schoolScore, _schoolScoreLine = c._schoolScoreLine, _score = c._23Score, planCount = c._23Count, items = new List() { new PlanItem(){ year="2023", count=c._23Count, planCount=c._23Count, rankLine=c._23ScoreLine, score = c._23Score, }, new PlanItem(){ year="2022", count=c._22Count, planCount=c._22Count, rankLine=c._22ScoreLine, score = c._22Score, }, new PlanItem(){ year="2021", count=c._21Count, planCount=c._21Count, rankLine=c._21ScoreLine, score = c._21Score, } } }); }); var newbson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", location)); await newbson.InsertManyAsync(list); return true; } #endregion /// /// 一键填报 /// /// /// [HttpPost] public async Task> OneKey([FromBody] zsplanfusionRequestDto request) { if (string.IsNullOrWhiteSpace(request.location)) { throw Oops.Oh("location参数不能为空"); } if (request.location == "410000") { request.p = 3; } if (!request.p.HasValue) { throw Oops.Oh("_p参数不能为空"); } if (request.subjects == null || request.subjects.Count() <= 0) { throw Oops.Oh("subjects参数 不能为空"); } if (!request.score.HasValue)//目前位次计算还没有好的计算方式,分数转位次只做参考,因还需考虑到选科组合不同对应位次细分问题 { throw Oops.Oh("score参数 不能为空"); } var onekeylist = new List(); var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); var bejson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", request.location)); // 动态条件列表 var filterBuilders = new List>(); switch (request.p) { case 0: request.subjects = request.subjects.Contains("理科") ? new string[] { "物", "化", "生" }.ToList() : new string[] { "史", "政", "地" }.ToList(); //选科如果是老的 就自动转换新基数 break; case 1: case 2: request.subjects = request.subjects; break; case 3: request.subjects = request.location == "410000" ? (request.subjects.Contains("物") ? new string[] { "理科" }.ToList() : new string[] { "文科" }.ToList()) : request.subjects; break; } // 构建科目条件 var subjects = request.subjects.Select(s => CalcuScoreFinder.GetTitle(s)).ToList(); var filterItems = Builders.Filter.AnyIn(p => p.subjects, subjects) | Builders.Filter.AnyEq(p => p.subjects, "不限"); filterBuilders.Add(filterItems); // 设置查询条件:FieldToQuery在minValue和maxValue之间 var minValue = request.score - 60; var maxValue = request.score + 15; if (request.startscore.HasValue && request.startscore > 0) { minValue = request.startscore.Value; maxValue = request.endscore.Value; } filterBuilders.Add(Builders.Filter.Gte(e => e._score, minValue) & Builders.Filter.Lte(e => e._score, maxValue)); if (request.province != null && request.province.Count() > 0) { filterBuilders.Add(Builders.Filter.In(e => e.province, request.province)); } if (request.majors != null && request.majors.Count() > 0) { filterBuilders.Add(Builders.Filter.In(e => e.majorName, request.majors)); } if (!string.IsNullOrWhiteSpace(request.batchName)) { filterBuilders.Add(Builders.Filter.Eq(p => p.batchName, request.batchName)); } if (!string.IsNullOrWhiteSpace(request.keyword)) { filterBuilders.Add(Builders.Filter.Regex(p => p.majorName, new BsonRegularExpression($"/{request.keyword}/"))); } if (request.subjectType != null && request.subjectType.Count() > 0) { filterBuilders.Add(Builders.Filter.In(e => e.subjectType, request.subjectType)); } if (request.nature != null && request.nature.Count() > 0) { filterBuilders.Add(Builders.Filter.In(e => e.nature, request.nature)); } // 使用And组合所有过滤条件 FilterDefinition filter = filterBuilders.Count > 0 ? Builders.Filter.And(filterBuilders) : new BsonDocument(); // 如果没有条件,则使用空过滤器 var sort = Builders.Sort.Ascending(x => x._score); // 替换YourField为实际的排序字段 var pagelist = await bejson.Find(filter).ToListAsync(); var list = new List(); var unjson = dbclient.GetCollection("university"); var upagelist = pagelist.OrderByDescending(c => c._schoolScore);//最终应该是 冲 稳 保 各取一部分 var uids = upagelist.Select(c => c.universityName).ToList(); var unfilter = Builders.Filter.In(doc => doc.name, uids); var unlist = unjson.Find(unfilter).ToList(); var distunlist = unlist.Distinct().ToList(); distunlist.ForEach(a => { onekeylist.Add(new OneKeyResponse() { uId = a._id, logo = a.logo, // type = pagelist.Where(e => e.universityName == a.name).FirstOrDefault)( MajorPlanscoreTool.GetPlanScore(a._score, request.score.Value), // percentAge = MajorPlanscoreTool.GetPlanPercentage(a._score, request.score.Value), // percentAge = MajorPlanscoreTool.CalctPercentage(a.items.Select(c => c.score).ToList(), request.score.Value), //academic = a.academicYear, collegeCode = upagelist.Where(e => e.universityName == a.name).FirstOrDefault().enrollmentCode, cityName = a.cityName, educationCategory = upagelist.Where(e => e.universityName == a.name).FirstOrDefault().educationCategory, features = a.features, ownership = upagelist.Where(e => e.universityName == a.name).FirstOrDefault().ownership, provinceName = a.provinceName, universityName = a.name, nature = a.nature, subjectType = upagelist.Where(e => e.universityName == a.name).FirstOrDefault().subjectType, rank = a._id.ToString(), type = MajorPlanscoreTool.GetPlanScore(upagelist.Where(e => e.universityName == a.name).FirstOrDefault()._schoolScore, request.score.Value), majorItems = upagelist.Where(w => w.universityName == a.name).Select(c => new OneKeyMajorItem() { academic = c.academicYear, fee = c.fee, lowScore = c._score, major = c.majorName, majorCode = c.majorCode, majorGroup = string.IsNullOrWhiteSpace(c.majorGroup) ? "" : "(" + c.majorGroup.Split("(")[1], percentAge = MajorPlanscoreTool.GetPlanPercentage(c._score, request.score.Value), planCount = c.planCount, planId = c.pid, planItems = c.items, subjectClam = c._24subject, type = MajorPlanscoreTool.GetPlanScore(c._score, request.score.Value), remark = c.remark }).ToList() }); }); var tmodel = new ZyTModel() { c = onekeylist.Where(e => e.type == 2).Count(), b = onekeylist.Where(e => e.type == 0).Count(), w = onekeylist.Where(e => e.type == 1).Count() }; int totalPages = 0, totalCount = 0; totalCount = onekeylist.Count; totalPages = (int)Math.Ceiling((double)totalCount / request.PageSize); var items = onekeylist.Skip((request.PageIndex - 1) * request.PageSize).Take(request.PageSize).ToList(); return new PageBaseTrendsResult() { PageNo = request.PageIndex, PageSize = request.PageSize, TotalPage = totalPages, TotalRows = totalCount, TModel = tmodel, Rows = items, }; } /// /// 一键填报 /// /// /// [HttpPost] public async Task> OneKeyV2([FromBody] zsplanfusionRequestDto request) { int zycount = 0;//当前批次志愿组总数 int majorsinglcount = 0;//专业组志愿数量 // 参数校验 if (string.IsNullOrWhiteSpace(request.location)) throw Oops.Oh("location参数不能为空"); if (!request.p.HasValue) throw Oops.Oh("_p参数不能为空"); if (request.subjects == null || !request.subjects.Any()) throw Oops.Oh("subjects参数不能为空"); if (!request.score.HasValue) throw Oops.Oh("score参数不能为空"); if (request.location == "410000") { request.p = 3; } var iscacheexit = _distributed.Get($"{CacheConst.KeyProvinceBatch}{request.location}"); if (iscacheexit == null) { var areaconfig = await _sysAreaConfig.AsQueryable().Where(e => e.IsDelete == false && e.LocationCode == request.location).Select(s => new ZyBatchRule() { batchName = s.BatchName, Count = s.Count, ItemCount = s.ItemCount, }).ToListAsync(); zycount = areaconfig.FirstOrDefault(e => e.batchName == request.batchName).Count; majorsinglcount = areaconfig.FirstOrDefault(e => e.batchName == request.batchName).ItemCount; _distributed.Set($"{CacheConst.KeyProvinceBatch}{request.location}", Encoding.UTF8.GetBytes(areaconfig.ToJson()), new DistributedCacheEntryOptions() .SetSlidingExpiration(TimeSpan.FromHours(24))); } else { var cachelocations = JsonConvert.DeserializeObject>(Encoding.UTF8.GetString(_distributed.Get($"{CacheConst.KeyProvinceBatch}{request.location}"))); if (cachelocations.Any(e => e.batchName == request.batchName)) { zycount = cachelocations.FirstOrDefault(e => e.batchName == request.batchName).Count; majorsinglcount = cachelocations.FirstOrDefault(e => e.batchName == request.batchName).ItemCount; } } Stopwatch sw = Stopwatch.StartNew(); // 获取 MongoDB 客户端 var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); var zsplanfusionCollection = dbclient.GetCollection($"zsplanfusionmodel_{request.location}"); var universityCollection = dbclient.GetCollection("university"); DateTime dt = DateTime.Now; DateTime fixedDate = new DateTime(dt.Year, 7, 20); // 创建当前年份的7月20日 int year = dt > fixedDate ? dt.Year : dt.Year - 1; // 比较当前日期与固定日期 // 动态条件列表 var filterBuilders = new List>(); switch (request.p) { case 1: case 2: if (request.location == "310000") { request.score = request.score > 580 ? 580 : request.score; } request.subjects = request.subjects; break; case 3: case 0: request.subjects = request.location == "410000" ? (request.subjects.Contains("物") ? new string[] { "理科" }.ToList() : new string[] { "文科" }.ToList()) : request.subjects; break; } // 构建科目条件 var subjects = request.subjects.Select(s => CalcuScoreFinder.GetTitle(s)).ToList(); var filterSubjects = Builders.Filter.AnyIn(p => p.subjects, subjects) | Builders.Filter.AnyEq(p => p.subjects, "不限"); filterBuilders.Add(filterSubjects); // 分数区间条件 var minValue = request.startscore ?? (request.score.Value - 60); var maxValue = request.endscore ?? (request.score.Value + 15); filterBuilders.Add(Builders.Filter.Gte(e => e._score, minValue) & Builders.Filter.Lte(e => e._score, maxValue)); // 动态添加其他条件 if (request.province != null && request.province.Any()) filterBuilders.Add(Builders.Filter.In(e => e.province, request.province)); if (request.majors != null && request.majors.Any()) filterBuilders.Add(Builders.Filter.In(e => e.majorName, request.majors)); if (!string.IsNullOrWhiteSpace(request.batchName)) filterBuilders.Add(Builders.Filter.Eq(p => p.batchName, request.batchName)); if (!string.IsNullOrWhiteSpace(request.keyword)) filterBuilders.Add(Builders.Filter.Regex(p => p.majorName, new BsonRegularExpression($"/{request.keyword}/"))); if (request.subjectType != null && request.subjectType.Any()) filterBuilders.Add(Builders.Filter.In(e => e.subjectType, request.subjectType)); if (request.nature != null && request.nature.Any()) filterBuilders.Add(Builders.Filter.In(e => e.nature, request.nature)); // 使用 And 组合过滤器 var finalFilter = filterBuilders.Any() ? Builders.Filter.And(filterBuilders) : Builders.Filter.Empty; // 定义排序规则 var sort = Builders.Sort.Ascending(x => x._score); // 并行异步查询 MongoDB var zsplanfusionTask = zsplanfusionCollection.Find(finalFilter).Sort(sort).ToListAsync(); var universityTask = universityCollection.Find(FilterDefinition.Empty).ToListAsync(); await Task.WhenAll(zsplanfusionTask, universityTask); var zsplanfusionResults = await zsplanfusionTask; var universityResults = await universityTask; sw.Stop(); Console.WriteLine($"Database Query Elapsed Time: {sw.ElapsedMilliseconds / 1000} s"); // 将大学结果转为字典以加速匹配 var universityDict = universityResults .GroupBy(u => u.name) // 按 universityName 分组 .ToDictionary( g => g.Key, // 键为大学名称 g => g.First() // 选择每组的第一个元素 ); // 构建结果列表 var onekeylist = new List(); foreach (var group in zsplanfusionResults.GroupBy(z => z.universityName)) { if (!universityDict.TryGetValue(group.Key, out var university)) continue; var majorItems = group.Select(c => new OneKeyMajorItem { uId = university._id, academic = c.academicYear, fee = c.fee, lowScore = c._score, major = c.majorName, majorCode = c.majorCode, majorGroup = string.IsNullOrWhiteSpace(c.majorGroup) ? "" : "(" + c.majorGroup.Split("(")[1], percentAge = MajorPlanscoreTool.GetPlanPercentage(c._score, request.score.Value), planCount = c.planCount, planId = c.pid, planItems = c.items, subjectClam = c._24subject, type = MajorPlanscoreTool.GetPlanScore(c._score, request.score.Value), remark = c.remark }).ToList(); onekeylist.Add(new OneKeyResponse { uId = university._id, logo = university.logo, type = MajorPlanscoreTool.GetPlanScore(group.FirstOrDefault()?._schoolScore ?? 0, request.score.Value), rank = university.rank.ToString(), universityName = university.name, collegeCode = group.FirstOrDefault()?.enrollmentCode, provinceName = university.provinceName, cityName = university.cityName, features = university.features, ownership = group.FirstOrDefault()?.ownership, subjectType = group.FirstOrDefault()?.subjectType, educationCategory = group.FirstOrDefault()?.educationCategory, nature = university.nature, majorItems = majorItems }); } // 使用分类和取值逻辑过滤结果 var keycollect = CWBUtil.ChangeVal(zycount, majorsinglcount); var newitems = new List(); foreach (var type in new[] { 2, 1, 0 }) { var items = onekeylist .Select(main => new OneKeyResponse { uId = main.uId, logo = main.logo, type = main.type, rank = main.rank, universityName = main.universityName, collegeCode = main.collegeCode, provinceName = main.provinceName, cityName = main.cityName, features = main.features, ownership = main.ownership, subjectType = main.subjectType, nature = main.nature, educationCategory = main.educationCategory, majorItems = main.majorItems.Where(item => item.type == type).ToList() }) .Where(main => main.majorItems.Count > 0) .SelectMany(main => main.majorItems.Select(item => new { Main = main, Item = item })) .Take(type == 2 ? keycollect.Item1 : type == 1 ? keycollect.Item2 : keycollect.Item3) .GroupBy(x => x.Main) .Select(g => new OneKeyResponse { uId = g.Key.uId, logo = g.Key.logo, type = g.Key.type, rank = g.Key.rank, universityName = g.Key.universityName, collegeCode = g.Key.collegeCode, provinceName = g.Key.provinceName, cityName = g.Key.cityName, features = g.Key.features, ownership = g.Key.ownership, subjectType = g.Key.subjectType, nature = g.Key.nature, educationCategory = g.Key.educationCategory, majorItems = g.Select(x => x.Item).ToList() }) .ToList(); if (items.Any()) newitems.AddRange(items); } // 合并 newitems 中相同 uId 的 OneKeyResponse var mergedItems = newitems .GroupBy(x => x.uId) .Select(g => new OneKeyResponse { year = year, uId = g.Key, logo = g.First().logo, type = g.First().type, rank = g.First().rank, universityName = g.First().universityName, collegeCode = g.First().collegeCode, provinceName = g.First().provinceName, cityName = g.First().cityName, features = g.First().features, ownership = g.First().ownership, subjectType = g.First().subjectType, nature = g.First().nature, educationCategory = g.First().educationCategory, // 合并所有符合条件的 majorItems majorItems = g.SelectMany(x => x.majorItems).Distinct().ToList() }) .ToList(); var tmodel = new ZyTModel() { c = mergedItems.Where(e => e.majorItems.Any(a => a.type == 2)).Select(s => s.majorItems.Count()).Sum(), b = mergedItems.Where(e => e.majorItems.Any(a => a.type == 1)).Select(s => s.majorItems.Count()).Sum(), w = mergedItems.Where(e => e.majorItems.Any(a => a.type == 0)).Select(s => s.majorItems.Count()).Sum(), }; // 补充标识 mergedItems.ForEach(item => { item.childItems = item.majorItems .SelectMany(e => e.planItems ?? Enumerable.Empty()) .GroupBy(pi => pi.year) .Select(g => new UChildItem { year = g.Key, planCount = g.Sum(pi => pi.planCount), score = g.Average(pi => pi.score), rankLine = g.Average(pi => pi.rankLine) }) .OrderByDescending(result => result.year) .ToList(); }); sw.Stop(); Console.WriteLine($"Total Elapsed2 Time: {sw.ElapsedMilliseconds / 1000} s"); return new PageBaseTrendsResult() { TModel = tmodel, Rows = mergedItems.OrderByDescending(e => e.majorItems.Max(m => m.type)).ToList(), }; } /// /// 智能填报展示接口 /// /// /// [HttpPost] public async Task aiPerview([FromBody] zsplanfusionRequestDto request) { if (string.IsNullOrWhiteSpace(request.location)) { throw Oops.Oh("location参数不能为空"); } if (!request.p.HasValue) { throw Oops.Oh("_p参数不能为空"); } if (request.location == "410000") { request.p = 3; } if (request.subjects == null || request.subjects.Count() <= 0) { throw Oops.Oh("subjects参数 不能为空"); } if (!request.score.HasValue)//目前位次计算还没有好的计算方式,分数转位次只做参考,因还需考虑到选科组合不同对应位次细分问题 { throw Oops.Oh("score参数 不能为空"); } var aidto = new aiPerviewDto(); var key = "ai_" + request.p + "_" + request.location + "_" + string.Join("_", request.subjects) + "_" + request.score; var keylist = "list_" + request.p + "_" + request.location + "_" + string.Join("_", request.subjects) + "_" + request.score; var _option = new DistributedCacheEntryOptions() .SetSlidingExpiration(TimeSpan.FromHours(1)); var onekeylist = new List(); var pagelist = new List(); var result = await _distributed.GetAsync(key); if (result == null) { var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); var bejson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", request.location)); // 动态条件列表 var filterBuilders = new List>(); switch (request.p) { case 1: case 2: if (request.location == "310000") { request.score = request.score > 580 ? 580 : request.score; } request.subjects = request.subjects; break; case 3: case 0: request.subjects = request.location == "410000" ? (request.subjects.Contains("物") ? new string[] { "理科" }.ToList() : new string[] { "文科" }.ToList()) : request.subjects; break; } if (!string.IsNullOrWhiteSpace(request.keyword)) { filterBuilders.Add(Builders.Filter.Regex(p => p.universityName, new BsonRegularExpression($"/{request.keyword}/"))); } // 构建科目条件 var subjects = request.subjects.Select(s => CalcuScoreFinder.GetTitle(s)).ToList(); var filterItems = Builders.Filter.AnyIn(p => p.subjects, subjects) | Builders.Filter.AnyEq(p => p.subjects, "不限"); filterBuilders.Add(filterItems); var minValue = request.score - 60; var maxValue = request.score + 15; filterBuilders.Add(Builders.Filter.Gte(e => e._score, minValue) & Builders.Filter.Lte(e => e._score, maxValue)); FilterDefinition filter = filterBuilders.Count > 0 ? Builders.Filter.And(filterBuilders) : new BsonDocument(); // 如果没有条件,则使用空过滤器 var sort = Builders.Sort.Ascending(x => x._score); // 替换YourField为实际的排序字段 pagelist = await bejson.Find(filter).ToListAsync(); pagelist.ForEach(a => { onekeylist.Add(new AICollectResponse() { type = MajorPlanscoreTool.GetPlanScore(a._score, request.score.Value), percentAge = MajorPlanscoreTool.GetPlanPercentage(a._score, request.score.Value), batchName = a.batchName, academic = a.academicYear, collegeCode = a.enrollmentCode, features = a.features, fee = a.fee, lowScore = a._schoolScore, lowscoreRank = a._schoolScoreLine, majorGroup = string.IsNullOrWhiteSpace(a.majorGroup) ? "" : "("+a.majorGroup.Split("(")[1], major = a.majorName, majorCode = a.majorCode, planId = a.pid, ownership = a.ownership, planCount = a.planCount, provinceName = a.province, cityName = a.city, remark = a.remark, subjectClam = a._23subject, universityName = a.universityName, nature = a.nature, subjectType = a.subjectType, planItems = a.items, educationCategory = a.educationCategory }); }); aidto.universities = new List() { new universityPerviewDto() { Name="985", Count=onekeylist.Where(e=>e.features!=null&&e.features.Any(f => f.Trim().Contains("985"))).GroupBy(s => s.universityName) .Count(), }, new universityPerviewDto() { Name="211", Count=onekeylist.Where(e=>e.features!=null&&e.features.Any(f => f.Trim().Contains("211"))).GroupBy(s => s.universityName) .Count(), }, new universityPerviewDto() { Name="双一流", Count=onekeylist.Where(e=>e.features!=null&&e.features.Any(f => f.Trim().Contains("双一流"))).GroupBy(s => s.universityName) .Count(), }, new universityPerviewDto() { Name="保研", Count=onekeylist.Where(e=>e.features!=null&&e.features.Any(f => f.Trim().Contains("保研"))).GroupBy(s => s.universityName) .Count(), }, new universityPerviewDto() { Name="公办", Count=onekeylist.Where(e=>e.nature=="公办").GroupBy(s => s.universityName) .Count(), }, new universityPerviewDto() { Name="其他", Count=onekeylist.Where(e=>e.features!=null&& e.features.Any(f =>(!f.Trim().Contains("保研")&&!f.Trim().Contains("双一流")&&!f.Trim().Contains("211")&&!f.Trim().Contains("985")))).GroupBy(s => s.universityName) .Count(), }, }; aidto.pieChats = new List() { new pieChatsDto() { name="需冲刺", value=onekeylist.Where(e=>e.type==2).GroupBy(s => s.universityName) .Count(), }, new pieChatsDto() { name="较稳妥", value=onekeylist.Where(e=>e.type==1).GroupBy(s => s.universityName) .Count(), }, new pieChatsDto() { name="可保底", value=onekeylist.Where(e=>e.type==0).GroupBy(s => s.universityName) .Count(), } }; // await _distributed.SetAsync(keylist, Encoding.UTF8.GetBytes(onekeylist.ToJson()), _option); await _distributed.SetAsync(key, Encoding.UTF8.GetBytes(aidto.ToJson()), _option); } else { aidto = JsonConvert.DeserializeObject(Encoding.UTF8.GetString(result)); } return aidto; } /// /// 智能填报-院校列表信息 /// /// /// [HttpPost] public async Task> aiUniversity([FromBody] zsplanfusionRequestDto request) { // 参数校验 if (string.IsNullOrWhiteSpace(request.location)) throw Oops.Oh("location参数不能为空"); if (!request.p.HasValue) throw Oops.Oh("_p参数不能为空"); if (request.subjects == null || !request.subjects.Any()) throw Oops.Oh("subjects参数不能为空"); if (!request.score.HasValue) throw Oops.Oh("score参数不能为空"); if (request.location == "410000") { request.p = 3; } // 缓存键生成 var cacheKey = $"ai_{request.p}_{request.location}_{string.Join("_", request.subjects)}_{request.score}"; var listKey = $"list_{request.p}_{request.location}_{string.Join("_", request.subjects)}_{request.score}"; var _cacheOptions = new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromHours(1)); var dbClient = _mongoRepository.Context.GetDatabase("zhiyuan"); var collection = dbClient.GetCollection($"zsplanfusionmodel_{request.location}"); // 动态条件构建 var filterBuilders = new List>(); switch (request.p) { case 1: case 2: request.subjects = request.subjects; break; case 3: case 0: request.subjects = request.location == "410000" ? (request.subjects.Contains("物") ? new string[] { "理科" }.ToList() : new string[] { "文科" }.ToList()) : request.subjects; break; } // 构建科目条件 var subjects = request.subjects.Select(s => CalcuScoreFinder.GetTitle(s)).ToList(); var filterItems = Builders.Filter.AnyIn(p => p.subjects, subjects) | Builders.Filter.AnyEq(p => p.subjects, "不限"); filterBuilders.Add(filterItems); // 分数范围过滤 var minValue = request.score - 60; var maxValue = request.score + 15; if (request.startscore.HasValue && request.startscore > 0) { minValue = request.startscore.Value; maxValue = request.endscore.Value; } filterBuilders.Add( Builders.Filter.Gte(e => e._score, minValue) & Builders.Filter.Lte(e => e._score, maxValue) ); if (!string.IsNullOrWhiteSpace(request.keyword)) { filterBuilders.Add(Builders.Filter.Regex(p => p.universityName, new BsonRegularExpression($"/{request.keyword}/"))); } // 执行查询 var filter = Builders.Filter.And(filterBuilders); var sortDefinition = Builders.Sort.Ascending(x => x._score); // 异步查询数据库 var queryTask = collection.Find(filter).Sort(sortDefinition).ToListAsync(); // 获取所有符合条件的学校名称 var universityCollection = dbClient.GetCollection("university"); // var universityFilter = Builders.Filter.In(doc => doc.name, new List()); // 临时查询,用于后续操作 var universityTask = universityCollection.Find(new BsonDocument()).ToListAsync(); // 等待所有异步查询操作完成 await Task.WhenAll(queryTask, universityTask); // 获取查询结果 var queryResults = queryTask.Result; var universityData = universityTask.Result; // 构建返回列表 var responseList = queryResults.Select(a => new AICollectResponse { _id = a.pid, type = MajorPlanscoreTool.GetPlanScore(a._score, request.score.Value), percentAge = MajorPlanscoreTool.GetPlanPercentage(a._score, request.score.Value), academic = a.academicYear, _score = a._score, _scoreRank = a.rankLine, collegeCode = a.enrollmentCode, batchName = a.batchName, features = a.features, fee = a.fee, lowScore = a._schoolScore, lowscoreRank = a._schoolScoreLine, majorGroup = string.IsNullOrWhiteSpace(a.majorGroup) ? "" : "(" + a.majorGroup.Split("(")[1], major = CommonUtil.RemoveCarriageReturnsAndSpacesWithRegex(a.majorName), majorCode = a.majorCode, planId = a.pid, ownership = a.ownership, planCount = a.planCount, provinceName = a.province, cityName = a.city, remark = a.remark, subjectClam = a._24subject, universityName = a.universityName, nature = a.nature, subjectType = a.subjectType, planItems = a.items, educationCategory = a.educationCategory, }).ToList(); // 过滤和去重 var universityNames = responseList .WhereIF(request.province?.Any() == true, c => request.province.Any(p => c.provinceName?.Contains(p) == true)) // 安全检查 provinceName .WhereIF(!string.IsNullOrWhiteSpace(request.batchName), c => c.batchName == request.batchName) .WhereIF(request.majors?.Any() == true, c => request.majors.Any(m => c.major?.Contains(m) == true)) // 安全检查 major .WhereIF(request.subjectType?.Any() == true, c => request.subjectType.Any(st => c.subjectType?.Contains(st) == true)) // 安全检查 subjectType .WhereIF(request.nature?.Any() == true, c => request.nature.Contains(c.nature)) // 如果 nature 也可能为 null,可加 ?.Contains .Select(c => c.universityName).Distinct().ToList(); DateTime dt = DateTime.Now; DateTime fixedDate = new DateTime(dt.Year, 7, 20); // 创建当前年份的7月20日 int year = dt > fixedDate ? dt.Year : dt.Year - 1; // 比较当前日期与固定日期 // 转换为返回模型 var resultList = universityNames.Select(name => { var universityGroup = responseList.Where(e => e.universityName == name); var firstEntry = universityGroup.FirstOrDefault(); return new OnekeyAiUniversityDto { _id = firstEntry._id, city = firstEntry.cityName, collegeCode = firstEntry.collegeCode, unName = firstEntry.universityName, educationCategory = firstEntry.educationCategory, features = firstEntry.features, lowScore = firstEntry.lowScore, lowscoreRank = firstEntry.lowscoreRank, year = year, ownership = firstEntry.ownership, province = firstEntry.provinceName, nature = firstEntry.nature, rank = string.IsNullOrEmpty(firstEntry.rank) ? "--" : firstEntry.rank, type = MajorPlanscoreTool.GetPlanScore(firstEntry.lowScore, request.score.Value), percentAge = MajorPlanscoreTool.GetPlanPercentage(firstEntry.lowScore, request.score.Value), MajorCount = universityGroup.Count(), planCount = universityGroup.Sum(e => e.planCount), items = universityGroup.Select(s => new OnekeyAiMajorItem { planCount = s.planCount, planId = s.planId, items = s.planItems, fee = s.fee, major = CommonUtil.RemoveCarriageReturnsAndSpacesWithRegex(s.major), majorCode = s.majorCode, majorGroup = s.majorGroup, percentAge = s.percentAge, remark = s.remark, subjectClam = s.subjectClam, rankline = s._scoreRank, score = s._score, academic = s.academic, type = s.type }).ToList() }; }).ToList(); var tmodel = new ZyTModel() { c = resultList.Where(e => e.type == 2).Count(), b = resultList.Where(e => e.type == 0).Count(), w = resultList.Where(e => e.type == 1).Count() }; // 分页和其他数据获取 var paginatedItems = resultList .WhereIF(request.type.HasValue, e => e.items.Any(it => it.type == request.type)) .OrderByDescending(e => e.lowScore) .Skip((request.PageIndex - 1) * request.PageSize) .Take(request.PageSize) .ToList(); var totalCount = universityNames.Count; var totalPages = (int)Math.Ceiling((double)totalCount / request.PageSize); // 补充标识和 Logo paginatedItems.ForEach(item => { var university = universityData.FirstOrDefault(u => u.name == item.unName); item.uId = university?._id ?? 0; item.logo = university?.logo ?? "https://static-data.ycymedu.com/1105.jpg"; if (item.items == null || !item.items.Any()) { item.childItems = new List(); } else { item.childItems = item.items .SelectMany(e => e.items ?? Enumerable.Empty()) .GroupBy(pi => pi.year) .Select(g => new UChildItem { year = g.Key, planCount = g.Sum(pi => pi.planCount), score = (int)g.Average(pi => pi.score), rankLine = (int)g.Average(pi => pi.rankLine) }) .OrderByDescending(result => result.year) .ToList(); } }); return new PageBaseTrendsResult { TModel = tmodel, Rows = paginatedItems, TotalPage = totalPages, TotalRows = totalCount, PageNo = request.PageIndex, PageSize = request.PageSize }; } }