1825 lines
76 KiB
C#
1825 lines
76 KiB
C#
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
|
||
};
|
||
}
|
||
|
||
|
||
|
||
}
|