tuiwucarrer/Admin.NET/Admin.NET.Core/Service/ZYPlanPro/PlanProService.cs

1825 lines
76 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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<SysDictData> _sysDictDataRep;
private readonly IMongoDBRepository _mongoRepository;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly SqlSugarRepository<SysAreaConfig> _sysAreaConfig;
public PlanProService(IDistributedCache distributedCache, SqlSugarRepository<SysDictData> sysDictDataRep, IMongoDBRepository mongoDBRepository,
IHttpContextAccessor httpContextAccessor, SqlSugarRepository<SysAreaConfig> sysAreaConfig)
{
_distributed = distributedCache;
_sysDictDataRep = sysDictDataRep;
_mongoRepository = mongoDBRepository;
_httpContextAccessor = httpContextAccessor;
_sysAreaConfig = sysAreaConfig;
}
/// <summary>
///根据查询条件获取招生计划
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
public async Task<PageBaseResult<seachzsplanfusionResponse>> 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<seachzsplanfusionResponse>();
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var bejson = dbclient.GetCollection<zsplanfusionmodel>(string.Format("zsplanfusionmodel_{0}", request.locationCode));
// 动态条件列表
var filterBuilders = new List<FilterDefinition<zsplanfusionmodel>>();
if (request.feature != null)
{
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.All(p => p.features, request.feature));
}
if (request.province != null)
{
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.In(p => p.province, request.province));
}
if (!string.IsNullOrWhiteSpace(request.keyword))
{
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.Regex(p => p.majorName, new BsonRegularExpression($"/{request.keyword}/")));
}
if (!string.IsNullOrWhiteSpace(request.universityName))
{
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.Regex(p => p.universityName, new BsonRegularExpression($"/{request.universityName}/")));
}
if (!string.IsNullOrWhiteSpace(request.batchName))
{
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.Eq(p => p.batchName, request.batchName));
}
if (request.majors != null)
{
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.In(p => p.majorName, request.majors));
}
// 使用And组合所有过滤条件
FilterDefinition<zsplanfusionmodel> filter = filterBuilders.Count > 0
? Builders<zsplanfusionmodel>.Filter.And(filterBuilders)
: new BsonDocument(); // 如果没有条件,则使用空过滤器
var sort = Builders<zsplanfusionmodel>.Sort.Ascending(x => x._score); // 替换YourField为实际的排序字段
var pagelist = await bejson.Find(filter).ToListAsync();
pagelist.ForEach(a =>
{
var filter = Builders<zsplanfusionmodel>.Filter.Eq("_id", a._id);
#region ******浙江batchname
//if (a._score >= 488)
//{
// // 构建更新定义:将新字段添加到文档
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "普通类一段");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
//}
//else if (a._score < 488 && a._score > 0)
//{
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "普通类二段");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
//}
//else
//{
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "缺失");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
//}
#endregion ******浙江batchname
#region ******山东batchname
//if (a._score >= 443)
//{
// // 构建更新定义:将新字段添加到文档
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "普通类一段");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
//}
//else if (a._score < 443 && a._score > 0)
//{
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "普通类二段");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
//}
//else
//{
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "缺失");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
//}
#endregion ******山东batchname
#region ***********河南batchbname*******
// 假设我们要更新的文档的过滤条件(这里以 _id 为例)
//if (a.subjectType == "文科")
//{
// if (a._score >= 547)
// {
// // 构建更新定义:将新字段添加到文档
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "本一");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
// }
// else if (a._score < 547 && a._score >= 465)
// {
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "本二");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
// }
// else if (a._score > 0 && a._score < 465)
// {
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "专科");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
// }
// else
// {
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "缺失");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
// }
//}
//if (a.subjectType == "理科")
//{
// if (a._score >= 514)
// {
// // 构建更新定义:将新字段添加到文档
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "本一");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
// }
// else if (a._score < 514 && a._score >= 409)
// {
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "本二");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
// }
// else if (a._score > 0&&a._score<409)
// {
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "专科");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
// }
// else
// {
// var updateDefinition = Builders<zsplanfusionmodel>.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<seachzsplanfusionResponse>()
{
PageNo = request.PageIndex,
PageSize = request.PageSize,
TotalPage = totalPages,
TotalRows = totalCount,
Rows = items,
};
}
/// <summary>
///根据院校id获取招生计划列表
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpGet]
public async Task<List<PlanProOutDto>> List([FromQuery] PlanProRequestDto request)
{
//var unlist = new List<UniversityDto>();
// 动态条件列表
var filterBuilders = new List<FilterDefinition<PlanProResponseDto>>();
if (string.IsNullOrWhiteSpace(request.locationCode))
{
throw Oops.Oh("locationCode 不能为空");
}
filterBuilders.Add(Builders<PlanProResponseDto>.Filter.Eq(p => p.location, request.locationCode));
if (request._uid <= 0)
{
throw Oops.Oh("用户id 不能为空");
}
if (request._uid > 0)
{
filterBuilders.Add(Builders<PlanProResponseDto>.Filter.Eq(p => p._uid, request._uid));
}
if (!string.IsNullOrWhiteSpace(request.years))
{
filterBuilders.Add(Builders<PlanProResponseDto>.Filter.Eq(p => p.years, request.years));
}
if (!string.IsNullOrWhiteSpace(request.batchName))
{
filterBuilders.Add(Builders<PlanProResponseDto>.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<PlanProResponseDto>(string.Format("zsplanpro_{0}_{1}", request.locationCode, years));
FilterDefinition<PlanProResponseDto> filter = filterBuilders.Count > 0
? Builders<PlanProResponseDto>.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;
}
/// <summary>
/// 根据院校id获取招生计划列表(V2)
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpGet]
public async Task<PlanProMainDto> ListV2([FromQuery] PlanProRequestDto request)
{
var result = new PlanProMainDto();
var filterBuilders = new List<FilterDefinition<PlanProResponseDto>>();
if (string.IsNullOrWhiteSpace(request.locationCode))
{
throw Oops.Oh("locationCode 不能为空");
}
filterBuilders.Add(Builders<PlanProResponseDto>.Filter.Eq(p => p.location, request.locationCode));
if (request._uid <= 0)
{
throw Oops.Oh("用户id 不能为空");
}
filterBuilders.Add(Builders<PlanProResponseDto>.Filter.Eq(p => p._uid, request._uid));
if (!string.IsNullOrWhiteSpace(request.years))
{
filterBuilders.Add(Builders<PlanProResponseDto>.Filter.Eq(p => p.years, request.years));
}
if (!string.IsNullOrWhiteSpace(request.batchName))
{
filterBuilders.Add(Builders<PlanProResponseDto>.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<PlanProResponseDto>($"zsplanpro_{request.locationCode}_{years}");
// **查询符合 request 条件的计划数据**
FilterDefinition<PlanProResponseDto> planFilter = filterBuilders.Count > 0
? Builders<PlanProResponseDto>.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<PlanProResponseDto>.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<string> yearsList = new List<string>();
for (int i = 0; i < 4; i++) // 这里控制要多少年
{
yearsList.Add((year - i).ToString());
}
result.yearsDtos = yearsList;
return result;
}
/// <summary>
///根据院校给出录取分数线
/// </summary>
/// <returns></returns>
[ApiDescriptionSettings(Name = "AdmissionMark"), HttpGet]
public async Task<planadmissionMarkDto> AdmissionMark([FromQuery] PlanProRequestDto request)
{
var result = new planadmissionMarkDto();
var filterBuilders = new List<FilterDefinition<newZsplanfusionDto>>();
if (string.IsNullOrWhiteSpace(request.locationCode))
{
throw Oops.Oh("locationCode 不能为空");
}
filterBuilders.Add(Builders<newZsplanfusionDto>.Filter.Eq(p => p.location, request.locationCode));
if (request._uid <= 0)
{
throw Oops.Oh("高校id 不能为空");
}
filterBuilders.Add(Builders<newZsplanfusionDto>.Filter.Eq(p => p.college_id, request._uid));
if (!string.IsNullOrWhiteSpace(request.years))
{
int y = int.Parse(request.years);
filterBuilders.Add(Builders<newZsplanfusionDto>.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<newZsplanfusionDto>($"zz_zsplanfusion_{request.locationCode}");
// **查询符合 request 条件的计划数据**
FilterDefinition<newZsplanfusionDto> planFilter = filterBuilders.Count > 0
? Builders<newZsplanfusionDto>.Filter.And(filterBuilders)
: new BsonDocument();
var list = await bejson.Find(planFilter).ToListAsync();
result.newZsplanfusions = list.OrderBy(e => e.year).ToList();
List<string> yearsList = new List<string>();
for (int i = 0; i < 4; i++) // 这里控制要多少年
{
yearsList.Add((year - i).ToString());
}
result.Years = yearsList;
return result;
}
/// <summary>
///查询录取分数线V2
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[ApiDescriptionSettings(Name = "AdmissionMarkV2"), HttpGet]
public async Task<planadmissionMarkDto> AdmissionMarkV2([FromQuery] PlanProRequestDto request)
{
var result = new planadmissionMarkDto();
var filterBuilders = new List<FilterDefinition<SpNameScoreItem>>();
//if (string.IsNullOrWhiteSpace(request.locationCode))
//{
// throw Oops.Oh("locationCode 不能为空");
//}
//filterBuilders.Add(Builders<SpNameScoreItem>.Filter.Eq(p => p.lo, request.locationCode));
if (request._uid <= 0)
{
throw Oops.Oh("高校id 不能为空");
}
filterBuilders.Add(Builders<SpNameScoreItem>.Filter.Eq(p => p.school_id, request._uid));
if (!string.IsNullOrWhiteSpace(request.years))
{
int y = int.Parse(request.years);
filterBuilders.Add(Builders<SpNameScoreItem>.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<SpNameScoreItem>(dbname);
// **查询符合 request 条件的计划数据**
FilterDefinition<SpNameScoreItem> planFilter = filterBuilders.Count > 0
? Builders<SpNameScoreItem>.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<string> yearsList = new List<string>();
for (int i = 0; i < 4; i++) // 这里控制要多少年
{
yearsList.Add((year - i).ToString());
}
result.Years = yearsList;
return result;
}
#region #########更新批次数据###########
#endregion #########更新批次数据###########
[HttpGet]
public async Task<bool> SyncBatchNamessplanPro([FromQuery] PlanProRequestDto request)
{
//var filterBuilders = new List<FilterDefinition<PlanProResponseDto>>();
//var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
//var bejson = dbclient.GetCollection<PlanProResponseDto>(string.Format("zsplanpro_{0}_{1}", request.locationCode, request.years));
//var bulkOps = new List<WriteModel<PlanProResponseDto>>();
//// 构建过滤器
//FilterDefinition<PlanProResponseDto> filter = filterBuilders.Count > 0
// ? Builders<PlanProResponseDto>.Filter.And(filterBuilders)
// : Builders<PlanProResponseDto>.Filter.Empty;
//// 查询数据
//var list = await bejson.Find(filter).ToListAsync();
//var _planpro = dbclient.GetCollection<enroll_planpro>(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<PlanProResponseDto>.Update.Set(x => x.batchName, eb.batchName);
// var updateOne = new UpdateOneModel<PlanProResponseDto>(
// Builders<PlanProResponseDto>.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<FilterDefinition<zsplanfusionDto>>();
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var bejson = dbclient.GetCollection<zsplanfusionDto>("zsplanfusion_330000");
var bulkOps = new List<WriteModel<zsplanfusionDto>>();
// 构建过滤器
FilterDefinition<zsplanfusionDto> filter = filterBuilders.Count > 0
? Builders<zsplanfusionDto>.Filter.And(filterBuilders)
: Builders<zsplanfusionDto>.Filter.Empty;
// 查询数据
var list = await bejson.Find(filter).ToListAsync();
var _planpro = dbclient.GetCollection<enroll_planpro>(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<zsplanfusionDto>.Update.Set(x => x.batchName, eb.batchName);
var updateOne = new UpdateOneModel<zsplanfusionDto>(
Builders<zsplanfusionDto>.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*****临时更新数据****
/// <summary>
/// 临时更新数据
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpGet]
public async Task<bool> SyncZJZsplanPro([FromQuery] PlanProRequestDto request)
{
var filterBuilders = new List<FilterDefinition<PlanProResponseDto>>();
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var bejson = dbclient.GetCollection<PlanProResponseDto>(string.Format("zsplanpro_{0}_{1}", request.locationCode, request.years));
// 构建过滤器
FilterDefinition<PlanProResponseDto> filter = filterBuilders.Count > 0
? Builders<PlanProResponseDto>.Filter.And(filterBuilders)
: Builders<PlanProResponseDto>.Filter.Empty;
// 查询数据
var list = await bejson.Find(filter).ToListAsync();
var university = dbclient.GetCollection<UniversityDto>("university");
var unlist = await university.Find(Builders<UniversityDto>.Filter.Empty).ToListAsync();
// 更新 `_uid` 字段并生成批量更新操作
var bulkOps = new List<WriteModel<PlanProResponseDto>>();
//list.ForEach(a =>
//{
// var uninfo = unlist.FirstOrDefault(e => e.name == a.universityName);
// if (uninfo != null)
// {
// // a._uid = uninfo._id;
// // 添加更新操作
// var updateDefinition = Builders<PlanProResponseDto>.Update.Set(x => x._uid, uninfo._id);
// var updateOne = new UpdateOneModel<PlanProResponseDto>(
// Builders<PlanProResponseDto>.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<bool> zsplanfusiondatachange([FromQuery] string location, string key)
{
if (key != "ycymedu")
{
return false;
}
var filterBuilders = new List<FilterDefinition<zsplanfusionDto>>();
FilterDefinition<zsplanfusionDto> filter = filterBuilders.Count > 0
? Builders<zsplanfusionDto>.Filter.And(filterBuilders)
: new BsonDocument(); // 如果没有条件,则使用空过滤器
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var bejson = dbclient.GetCollection<zsplanfusionDto>(string.Format("zsplanfusion_{0}", location));
var pagelist = await bejson.Find(filter).ToListAsync();
var list = new List<zsplanfusionmodel>();
var ff = new List<string>();
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<PlanProResponseDto>.Update.Set("batchName", "普通类一段");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
// }
// else if (a._score < 488 && a._score > 0)
// {
// var updateDefinition = Builders<PlanProResponseDto>.Update.Set("batchName", "普通类二段");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
// }
// else
// {
// var updateDefinition = Builders<PlanProResponseDto>.Update.Set("batchName", "缺失");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
// }
#endregion ******浙江batchname
#region ******山东batchname
//if (a._score >= 443)
//{
// // 构建更新定义:将新字段添加到文档
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "普通类一段");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
//}
//else if (a._score < 443 && a._score > 0)
//{
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "普通类二段");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
//}
//else
//{
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "缺失");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
//}
#endregion ******山东batchname
#region ***********河南batchbname*******
// 假设我们要更新的文档的过滤条件(这里以 _id 为例)
//if (a.subjectType == "文科")
//{
// if (a._score >= 547)
// {
// // 构建更新定义:将新字段添加到文档
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "本一");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
// }
// else if (a._score < 547 && a._score >= 465)
// {
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "本二");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
// }
// else if (a._score > 0 && a._score < 465)
// {
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "专科");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
// }
// else
// {
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "缺失");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
// }
//}
//if (a.subjectType == "理科")
//{
// if (a._score >= 514)
// {
// // 构建更新定义:将新字段添加到文档
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "本一");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
// }
// else if (a._score < 514 && a._score >= 409)
// {
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "本二");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
// }
// else if (a._score > 0&&a._score<409)
// {
// var updateDefinition = Builders<zsplanfusionmodel>.Update.Set("batchName", "专科");
// var updateResult = bejson.UpdateOne(filter, updateDefinition);
// }
// else
// {
// var updateDefinition = Builders<zsplanfusionmodel>.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<PlanItem>()
{
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<zsplanfusionmodel>(string.Format("zsplanfusionmodel_{0}", location));
await newbson.InsertManyAsync(list);
return true;
}
#endregion
/// <summary>
/// 一键填报
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
public async Task<PageBaseTrendsResult<OneKeyResponse, ZyTModel>> 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<OneKeyResponse>();
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var bejson = dbclient.GetCollection<zsplanfusionmodel>(string.Format("zsplanfusionmodel_{0}", request.location));
// 动态条件列表
var filterBuilders = new List<FilterDefinition<zsplanfusionmodel>>();
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<zsplanfusionmodel>.Filter.AnyIn(p => p.subjects, subjects) |
Builders<zsplanfusionmodel>.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<zsplanfusionmodel>.Filter.Gte(e => e._score, minValue) & Builders<zsplanfusionmodel>.Filter.Lte(e => e._score, maxValue));
if (request.province != null && request.province.Count() > 0)
{
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.In(e => e.province, request.province));
}
if (request.majors != null && request.majors.Count() > 0)
{
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.In(e => e.majorName, request.majors));
}
if (!string.IsNullOrWhiteSpace(request.batchName))
{
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.Eq(p => p.batchName, request.batchName));
}
if (!string.IsNullOrWhiteSpace(request.keyword))
{
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.Regex(p => p.majorName, new BsonRegularExpression($"/{request.keyword}/")));
}
if (request.subjectType != null && request.subjectType.Count() > 0)
{
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.In(e => e.subjectType, request.subjectType));
}
if (request.nature != null && request.nature.Count() > 0)
{
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.In(e => e.nature, request.nature));
}
// 使用And组合所有过滤条件
FilterDefinition<zsplanfusionmodel> filter = filterBuilders.Count > 0
? Builders<zsplanfusionmodel>.Filter.And(filterBuilders)
: new BsonDocument(); // 如果没有条件,则使用空过滤器
var sort = Builders<zsplanfusionmodel>.Sort.Ascending(x => x._score); // 替换YourField为实际的排序字段
var pagelist = await bejson.Find(filter).ToListAsync();
var list = new List<OnekeyAiUniversityDto>();
var unjson = dbclient.GetCollection<UniversityDto>("university");
var upagelist = pagelist.OrderByDescending(c => c._schoolScore);//最终应该是 冲 稳 保 各取一部分
var uids = upagelist.Select(c => c.universityName).ToList();
var unfilter = Builders<UniversityDto>.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<OneKeyResponse, ZyTModel>()
{
PageNo = request.PageIndex,
PageSize = request.PageSize,
TotalPage = totalPages,
TotalRows = totalCount,
TModel = tmodel,
Rows = items,
};
}
/// <summary>
/// 一键填报
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
public async Task<PageBaseTrendsResult<OneKeyResponse, ZyTModel>> 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<List<ZyBatchRule>>(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>($"zsplanfusionmodel_{request.location}");
var universityCollection = dbclient.GetCollection<UniversityDto>("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<FilterDefinition<zsplanfusionmodel>>();
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<zsplanfusionmodel>.Filter.AnyIn(p => p.subjects, subjects) |
Builders<zsplanfusionmodel>.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<zsplanfusionmodel>.Filter.Gte(e => e._score, minValue) &
Builders<zsplanfusionmodel>.Filter.Lte(e => e._score, maxValue));
// 动态添加其他条件
if (request.province != null && request.province.Any())
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.In(e => e.province, request.province));
if (request.majors != null && request.majors.Any())
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.In(e => e.majorName, request.majors));
if (!string.IsNullOrWhiteSpace(request.batchName))
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.Eq(p => p.batchName, request.batchName));
if (!string.IsNullOrWhiteSpace(request.keyword))
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.Regex(p => p.majorName, new BsonRegularExpression($"/{request.keyword}/")));
if (request.subjectType != null && request.subjectType.Any())
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.In(e => e.subjectType, request.subjectType));
if (request.nature != null && request.nature.Any())
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.In(e => e.nature, request.nature));
// 使用 And 组合过滤器
var finalFilter = filterBuilders.Any()
? Builders<zsplanfusionmodel>.Filter.And(filterBuilders)
: Builders<zsplanfusionmodel>.Filter.Empty;
// 定义排序规则
var sort = Builders<zsplanfusionmodel>.Sort.Ascending(x => x._score);
// 并行异步查询 MongoDB
var zsplanfusionTask = zsplanfusionCollection.Find(finalFilter).Sort(sort).ToListAsync();
var universityTask = universityCollection.Find(FilterDefinition<UniversityDto>.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<OneKeyResponse>();
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<OneKeyResponse>();
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<PlanItem>())
.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<OneKeyResponse, ZyTModel>()
{
TModel = tmodel,
Rows = mergedItems.OrderByDescending(e => e.majorItems.Max(m => m.type)).ToList(),
};
}
/// <summary>
/// 智能填报展示接口
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
public async Task<aiPerviewDto> 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<AICollectResponse>();
var pagelist = new List<zsplanfusionmodel>();
var result = await _distributed.GetAsync(key);
if (result == null)
{
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var bejson = dbclient.GetCollection<zsplanfusionmodel>(string.Format("zsplanfusionmodel_{0}", request.location));
// 动态条件列表
var filterBuilders = new List<FilterDefinition<zsplanfusionmodel>>();
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<zsplanfusionmodel>.Filter.Regex(p => p.universityName, new BsonRegularExpression($"/{request.keyword}/")));
}
// 构建科目条件
var subjects = request.subjects.Select(s => CalcuScoreFinder.GetTitle(s)).ToList();
var filterItems = Builders<zsplanfusionmodel>.Filter.AnyIn(p => p.subjects, subjects) |
Builders<zsplanfusionmodel>.Filter.AnyEq(p => p.subjects, "不限");
filterBuilders.Add(filterItems);
var minValue = request.score - 60;
var maxValue = request.score + 15;
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.Gte(e => e._score, minValue) & Builders<zsplanfusionmodel>.Filter.Lte(e => e._score, maxValue));
FilterDefinition<zsplanfusionmodel> filter = filterBuilders.Count > 0
? Builders<zsplanfusionmodel>.Filter.And(filterBuilders)
: new BsonDocument(); // 如果没有条件,则使用空过滤器
var sort = Builders<zsplanfusionmodel>.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<universityPerviewDto>()
{
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<pieChatsDto>()
{
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<aiPerviewDto>(Encoding.UTF8.GetString(result));
}
return aidto;
}
/// <summary>
/// 智能填报-院校列表信息
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
public async Task<PageBaseTrendsResult<OnekeyAiUniversityDto, ZyTModel>> 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>($"zsplanfusionmodel_{request.location}");
// 动态条件构建
var filterBuilders = new List<FilterDefinition<zsplanfusionmodel>>();
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<zsplanfusionmodel>.Filter.AnyIn(p => p.subjects, subjects) |
Builders<zsplanfusionmodel>.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<zsplanfusionmodel>.Filter.Gte(e => e._score, minValue) &
Builders<zsplanfusionmodel>.Filter.Lte(e => e._score, maxValue)
);
if (!string.IsNullOrWhiteSpace(request.keyword))
{
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.Regex(p => p.universityName, new BsonRegularExpression($"/{request.keyword}/")));
}
// 执行查询
var filter = Builders<zsplanfusionmodel>.Filter.And(filterBuilders);
var sortDefinition = Builders<zsplanfusionmodel>.Sort.Ascending(x => x._score);
// 异步查询数据库
var queryTask = collection.Find(filter).Sort(sortDefinition).ToListAsync();
// 获取所有符合条件的学校名称
var universityCollection = dbClient.GetCollection<UniversityDto>("university");
// var universityFilter = Builders<UniversityDto>.Filter.In(doc => doc.name, new List<string>()); // 临时查询,用于后续操作
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<UChildItem>();
}
else
{
item.childItems = item.items
.SelectMany(e => e.items ?? Enumerable.Empty<PlanItem>())
.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<OnekeyAiUniversityDto, ZyTModel>
{
TModel = tmodel,
Rows = paginatedItems,
TotalPage = totalPages,
TotalRows = totalCount,
PageNo = request.PageIndex,
PageSize = request.PageSize
};
}
}