// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
using DocumentFormat.OpenXml.Office2010.ExcelAc;
using DocumentFormat.OpenXml.Vml.Office;
using DocumentFormat.OpenXml.Wordprocessing;
using Elastic.Clients.Elasticsearch;
using Flurl;
using Flurl.Http;
using Flurl.Util;
using iText.Layout.Element;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Caching.Memory;
using MongoDB.Bson;
using MongoDB.Driver;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using Org.BouncyCastle.Asn1.Bsi;
using Org.BouncyCastle.Asn1.Ocsp;
using RazorEngine.Compilation.ImpromptuInterface.InvokeExt;
using SqlSugar.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinGetCurrentAutoReplyInfoResponse.Types.KeywordAutoReplyRule.Types;
namespace Admin.NET.Core.Service;
///
/// 志愿填报开放基础服务
///
[AllowAnonymous]
[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 900)]
[Route("api/zhiYuan")]
public class ZhiYuanBaseService : IDynamicApiController, ITransient
{
private const string _cachekey = "base_";
private readonly IDistributedCache _distributed;
private readonly SqlSugarRepository _sysDictDataRep;
private readonly SqlSugarRepository _uncollectionrep;
private readonly IMongoDBRepository _mongoRepository;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly SqlSugarRepository _proviceRep;
private readonly UserManager _userManager;
public ZhiYuanBaseService(IDistributedCache distributedCache, SqlSugarRepository sysDictDataRep, IMongoDBRepository mongoDBRepository,
IHttpContextAccessor httpContextAccessor, SqlSugarRepository uncollectionrep, UserManager userManager, SqlSugarRepository proviceRep)
{
_distributed = distributedCache;
_sysDictDataRep = sysDictDataRep;
_mongoRepository = mongoDBRepository;
_httpContextAccessor = httpContextAccessor;
_uncollectionrep = uncollectionrep;
_userManager = userManager;
_proviceRep = proviceRep;
}
///
/// 获取省份信息
///
///
[HttpGet]
public async Task Province()
{
var key = _cachekey + "province";
var result = await _distributed.GetAsync(key);
if (result == null)
{
var baseurl = App.GetConfig("OutExApi", true).BaseUrl;
var _option = new DistributedCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromHours(4));
//var dyresult = await string.Format("{0}api/SysRegion/GetRegionList?code=0", baseurl).SetJsonSerialization().GetAsAsync>();
var dyresult = await string.Format("{0}api/SysRegion/GetRegionList?code=0", baseurl).GetJsonAsync>>();
// string str = dyresult.ToString();
var jsons = JsonConvert.SerializeObject(dyresult.response);
byte[] byresult = Encoding.UTF8.GetBytes(jsons);
await _distributed.SetAsync(key, byresult, _option);
result = byresult;
}
return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(result).ToLowerInvariant());
}
///
/// 各省份年份对应政策规则(已弃用)
///
///
[HttpGet]
public async Task VolunteerInitialization()
{
var key = _cachekey + "volunteerInit";
var result = await _distributed.GetAsync(key);
if (result == null)
{
var baseurl = App.GetConfig("OutExApi", true).BaseUrl;
var _option = new DistributedCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromHours(4));
//var dyresult = await string.Format("{0}api/SeVolunteerInitialization/Get", baseurl).SetJsonSerialization().GetAsAsync>();
var dyresult = await string.Format("{0}api/SeVolunteerInitialization/Get", baseurl).GetJsonAsync>>();
// string str = dyresult.ToString();
var jsons = JsonConvert.SerializeObject(dyresult.response);
byte[] byresult = Encoding.UTF8.GetBytes(jsons);
await _distributed.SetAsync(key, byresult, _option);
result = byresult;
}
return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(result).ToLowerInvariant());
}
///
/// 院校甄别 //野鸡大学
///
///
///
[HttpGet]
public async Task FackUniversitys([FromQuery] FackUniversityRequestDto dto)
{
// 检查是否至少有一个查询条件
if (string.IsNullOrWhiteSpace(dto.keyword) && string.IsNullOrWhiteSpace(dto.provinceName))
{
throw Oops.Oh("至少需要提供一个查询条件(关键字或省份名称)");
}
// 获取数据库客户端
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
// 获取集合
var bejson = dbclient.GetCollection("d_fackuniversity");
// 动态条件列表
var filterBuilders = new List>();
// 如果 keyword 不为空,添加大学名称的正则查询条件
if (!string.IsNullOrWhiteSpace(dto.keyword))
{
filterBuilders.Add(Builders.Filter.Regex(p => p.universityName, new BsonRegularExpression($"/{dto.keyword}/")));
}
if (!string.IsNullOrWhiteSpace(dto.provinceName))
{
filterBuilders.Add(Builders.Filter.Regex(p => p.locationName, new BsonRegularExpression($"/{dto.provinceName.Replace("省", "").Replace("市", "")}/")));
}
// 构建最终的过滤器
FilterDefinition filter = filterBuilders.Count > 0
? Builders.Filter.And(filterBuilders)
: new BsonDocument(); // 如果没有条件,则使用空过滤器
// 执行查询并将结果转换为列表
var list = await bejson.Find(filter).ToListAsync();
list.ForEach(a =>
{
a.locationName = a.locationName.Replace("省", "").Replace("市", "");
});
return list;
}
///
/// 获取院校类型
///
/// 539074685816901
///
[HttpGet]
//[UnifyResult(typeof(CustomPropertyResult<>))]
public async Task UniversityType([Required] long typeId = 539074685816901)
{
var key = _cachekey + "untype_" + typeId;
var result = await _distributed.GetAsync(key);
if (result == null)
{
var _option = new DistributedCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromHours(4));
var dyresult = await _sysDictDataRep.AsQueryable()
.Where(u => u.DictTypeId == typeId)
.OrderBy(u => new { u.Code }).Select(c => new
DicBaseDto
{ id = c.Code, name = c.Value })
.ToListAsync();
byte[] byresult = Encoding.UTF8.GetBytes(dyresult.ToJson());
await _distributed.SetAsync(key, byresult, _option);
result = byresult;
}
return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(result));
}
///
/// 办学性质
///
/// 539083286085701
///
[HttpGet]
//[UnifyResult(typeof(CustomPropertyResult<>))]
public async Task Nature([Required] long typeId = 539083286085701)
{
var key = _cachekey + "nature_" + typeId;
var result = await _distributed.GetAsync(key);
if (result == null)
{
var _option = new DistributedCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromHours(4));
var dyresult = await _sysDictDataRep.AsQueryable()
.Where(u => u.DictTypeId == typeId)
.OrderBy(u => new { u.Code }).Select(c => new
DicBaseDto
{ id = c.Code, name = c.Value })
.ToListAsync();
byte[] byresult = Encoding.UTF8.GetBytes(dyresult.ToJson());
await _distributed.SetAsync(key, byresult, _option);
result = byresult;
}
return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(result));
}
///
/// 院校排行
///
///
///
[HttpGet]
public async Task> UniversityRank([FromQuery] UniversityRankRequest request)
{
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var bejson = dbclient.GetCollection("universityrank");
if (!request.Type.HasValue)
{
throw Oops.Oh("院校类型不能为空");
}
if (!request.Year.HasValue)
{
throw Oops.Oh("年份不能为空");
}
// 动态条件列表
var filterBuilders = new List>();
if (request.Year.HasValue)
{
filterBuilders.Add(Builders.Filter.Eq(p => p.Year, request.Year.Value.ToString()));
}
if (request.Type.HasValue)
{
filterBuilders.Add(Builders.Filter.Eq(p => p.UniversityType, request.Type.Value.ToString()));
}
if (!string.IsNullOrWhiteSpace(request.Name))
{
filterBuilders.Add(Builders.Filter.Regex(p => p.UniversityName, new BsonRegularExpression($"/{request.Name}/")));
}
// 使用And组合所有过滤条件
FilterDefinition filter = filterBuilders.Count > 0
? Builders.Filter.And(filterBuilders)
: new BsonDocument(); // 如果没有条件,则使用空过滤器
//var list = await bejson.Find(filter).ToListAsync();
var sort = Builders.Sort.Ascending(x => x._id); // 替换YourField为实际的排序字段
// 创建分页对象并获取分页数据
var pagination = new MongoPagination(bejson, filter, sort, request.PageSize, request.PageIndex);
var (items, totalCount, totalPages) = await pagination.GetPagedDataAsync();
var universitylistbejson = dbclient.GetCollection("university");
var universitylist = await universitylistbejson.Find(new BsonDocument()).ToListAsync();
items.ForEach(a =>
{
a.cityName = universitylist.Where(e => e.name == a.UniversityName).Any() ? universitylist.Where(e => e.name == a.UniversityName)?.FirstOrDefault().cityName.Replace("市", "") : "";
a.logo = universitylist.Where(e => e.name == a.UniversityName).Any() ? universitylist.Where(e => e.name == a.UniversityName)?.FirstOrDefault().logo : "https://static-data.ycymedu.com/daxuelogo.jpg";
a.uType = universitylist.Where(e => e.name == a.UniversityName).Any() ? universitylist.Where(e => e.name == a.UniversityName)?.FirstOrDefault().utype.FirstOrDefault() : "";
});
return new PageBaseResult()
{
PageNo = request.PageIndex,
PageSize = request.PageSize,
TotalPage = totalPages,
TotalRows = totalCount,
Rows = items,
};
}
//批次线(各省份)
//位次(各省份)
//一分一段(各省份)
//专业大类
//专业小类
//专业名称
///
/// 专业大类和专业二级分类
///
///
///
[HttpGet]
public async Task BaseMajor([FromQuery] int level)
{
var key = _cachekey + "basemajor_" + level;
var result = await _distributed.GetAsync(key);
if (result == null)
{
var baseurl = App.GetConfig("OutExApi", true).BaseUrl;
var _option = new DistributedCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromDays(1));
/* var dyresult = await string.Format("{0}api/front/Library/uniGetMajorInfo?SchoolLevel={1}", baseurl, level).SetJsonSerialization().GetAsAsync>();*/
var dyresult = await string.Format("{0}api/front/Library/uniGetMajorInfo?SchoolLevel={1}", baseurl, level).GetJsonAsync>>();
// string str = dyresult.ToString();
var jsons = JsonConvert.SerializeObject(dyresult.response);
byte[] byresult = Encoding.UTF8.GetBytes(jsons);
await _distributed.SetAsync(key, byresult, _option);
result = byresult;
}
return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(result).ToLowerInvariant());
}
///
/// 一分一段
///
///
///
[HttpGet]
public async Task ScoreLine([FromQuery] ScoreLineRequest request)
{
var baseurl = App.GetConfig("OutExApi", true).BaseUrl;
var headers = _httpContextAccessor.HttpContext.Request.Headers;
var token = headers["Authorization"].ToString();
//var dyresult = await string.Format("{0}api/front/Library/GetScoreLine", baseurl)
// .SetHeaders(new Dictionary { { "Authorization", string.Format("Bearer {0}", token) } })
// .SetQueries(request)
// .SetJsonSerialization(new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() }).GetAsAsync>();
var dyresult = await string.Format("{0}api/front/Library/GetScoreLine", baseurl).WithOAuthBearerToken(token).SetQueryParams(request).GetStringAsync();
var result = JsonConvert.DeserializeObject>>(dyresult);
return result.response;
}
///
/// 院校列表
///
///
///
[HttpPost]
public async Task> University([FromBody] UniversityRequest request)
{
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var bejson = dbclient.GetCollection("university");
// 动态条件列表
var filterBuilders = new List>();
if (!string.IsNullOrWhiteSpace(request.name))
{
filterBuilders.Add(Builders.Filter.Regex(p => p.name, new BsonRegularExpression($"/{request.name}/")));
}
if (request.level.HasValue)
{
filterBuilders.Add(Builders.Filter.Eq("level", request.level.Value));
}
if (request.provinceName != null && request.provinceName.Count() > 0)//省份
{
filterBuilders.Add(Builders.Filter.In(p => p.provinceName, request.provinceName));
}
if (request.nature != null && request.nature.Count() > 0)//包含--公办 民办
{
filterBuilders.Add(Builders.Filter.In(p => p.nature, request.nature));
}
if (request.utype != null && request.utype.Count() > 0)//包含--院校类型 综合 理工
{
filterBuilders.Add(Builders.Filter.AnyIn(p => p.utype, request.utype));
}
//// 构建查询条件:SubItems数组中的某个元素的Description字段包含subItemDescriptionSubstring
//var subItemFilter = filterBuilder.ElemMatch(x => x.SubItems, filterBuilder.Regex(y => y.Description, new BsonRegularExpression($".*{subItemDescriptionSubstring}.*", "i")));
if (request.feature != null && request.feature.Count() > 0) //985、211
{
filterBuilders.Add(Builders.Filter.AnyIn(p => p.features, request.feature));
}
// 使用And组合所有过滤条件
FilterDefinition filter = filterBuilders.Count > 0
? Builders.Filter.And(filterBuilders)
: new BsonDocument(); // 如果没有条件,则使用空过滤器
// 你可以根据需要添加排序字段
var sort = Builders.Sort.Ascending(x => x._id); // 替换YourField为实际的排序字段
// 创建分页对象并获取分页数据
var pagination = new MongoPagination(bejson, filter, sort, request.PageSize, request.PageIndex);
var (items, totalCount, totalPages) = await pagination.GetPagedDataAsync();
#region 更新院校数据
//var university_w = dbclient.GetCollection("university_ww");
//var enmtyfilter = Builders.Filter.Empty; // 创建一个空筛选器,获取所有文档
//var listrectiy = await university_w.Find(enmtyfilter).ToListAsync();
//items.ForEach(async a =>
//{
// var update = Builders.Update;
// var updates = new List>();
// var newmodel = listrectiy.Where(e => e.name == a.name).FirstOrDefault();
// if (newmodel != null)
// {
// if (a.rank <= 0)
// {
// a.rank = newmodel.rank;
// updates.Add(update.Set("rank", newmodel.rank));
// }
//if (string.IsNullOrWhiteSpace(a.address))
//{
// a.address = newmodel.address;
// updates.Add(update.Set("address", newmodel.address));
//}
//if (string.IsNullOrWhiteSpace(a.builddate))
//{
// a.builddate = newmodel.builddate;
// updates.Add(update.Set("builddate", newmodel.builddate));
//}
//if (string.IsNullOrWhiteSpace(a.cityName))
//{
// a.cityName = newmodel.cityName;
// updates.Add(update.Set("cityName", newmodel.cityName));
//}
//if (string.IsNullOrWhiteSpace(a.phone))
//{
// a.phone = newmodel.phone;
// updates.Add(update.Set("phone", newmodel.phone));
//}
//if (a.utype == null || a.utype.Count() <= 0)
//{
// a.utype = JsonConvert.DeserializeObject>(newmodel.utype);
// updates.Add(update.Set("utype", a.utype));
//}
//if (string.IsNullOrWhiteSpace(a.weburl))
//{
// a.weburl = newmodel.weburl;
// updates.Add(update.Set("weburl", newmodel.weburl));
//}
// var filter = Builders.Filter.Eq("_id", a._id); // 使用文档的ID
// if (updates.Count() > 0)
// {
// var result = await bejson.UpdateOneAsync(filter, update.Combine(updates));
// }
// }
//});
#endregion
return new PageBaseResult()
{
PageNo = request.PageIndex,
PageSize = request.PageSize,
TotalPage = totalPages,
TotalRows = totalCount,
Rows = items,
};
}
///
/// 院校对比
///
///
///
[HttpPost]
public async Task> ComparUk([FromBody] CompiarUnkRequestDto dto)
{
string years = dto.years ?? "2024";
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var bejson = dbclient.GetCollection("university");
// 动态条件列表
var filterBuilders = new List>();
if (dto.ids == null && dto.ids.Count() <= 0)//省份
{
throw Oops.Oh("请传入院校Id");
}
filterBuilders.Add(Builders.Filter.In(p => p._id, dto.ids));
FilterDefinition filter = filterBuilders.Count > 0
? Builders.Filter.And(filterBuilders)
: new BsonDocument(); // 如果没有条件,则使用空过滤器
var list = await bejson.Find(filter).ToListAsync();
var planjson = dbclient.GetCollection(string.Format("zsplanpro_{0}_{1}", dto.locationCode, years));
// 动态条件列表
var pBuilders = new List>();
pBuilders.Add(Builders.Filter.In(p => p._uid.Value, dto.ids));
FilterDefinition ffilter = filterBuilders.Count > 0
? Builders.Filter.And(pBuilders)
: new BsonDocument(); // 如果没有条件,则使用空过滤器
var planlist = await planjson.Find(ffilter).ToListAsync();
var result = new List();
list.ForEach(a =>
{
result.Add(new University_wDto()
{
address = a.address,
belong = a.belong,
builddate = a.builddate,
cityName = a.cityName,
collegeCode = a.collegeCode,
level = a.level.Value,
logo = a.logo,
MajorCount = planlist.Where(e => e._uid == a._id).Select(c => c.major).Count(),
planCount = planlist.Where(e => e._uid == a._id).Select(c => c.plancount.Value).Sum(),
_id = a._id,
name = a.name,
nature = a.nature,
phone = a.phone,
provinceName = a.provinceName,
utype = string.Join('/', a.utype),
weburl = a.weburl
});
});
return result;
}
///
///学校招生计划新版本V2
///
///
///
[ApiDescriptionSettings(Name = "PlanListPro/V2"), HttpGet]
public async Task PlanListProV2([FromQuery] PlanProV2RequestDto dto)
{
var result = new PlanProV2ResponseDto();
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
DateTime dt = DateTime.Now;
DateTime fixedDate = new DateTime(dt.Year, 7, 20); // 创建当前年份的7月20日
int year = dt > fixedDate ? dt.Year : dt.Year - 1; // 比较当前日期与固定日期
var planjson = dbclient.GetCollection(string.Format("zsplanpro_{0}_{1}", dto.locationCode, year));
var filter = Builders.Filter.Eq(e => e._uid, dto.uid);
var query = await planjson.Find(filter).ToListAsync();
if (query == null)
{
throw Oops.Oh("暂无数据");
}
result.year = year.ToString();
result.items = query;
return result;
}
///
/// 院校列表
///
///
[HttpGet]
public async Task SaveUniversity([FromQuery] UniversityRequest request)
{
var baseurl = App.GetConfig("OutExApi", true).BaseUrl;
var headers = _httpContextAccessor.HttpContext.Request.Headers;
var token = headers["Authorization"].ToString();
//var dyresult = await "https://api.static.ycymedu.com/universityinfo.json"
// .SetJsonSerialization().GetAsAsync>>();
var dyresult = await "https://api.static.ycymedu.com/universityinfo.json".GetJsonAsync>>();
var jsons = dyresult.response;
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var collection = dbclient.GetCollection("university_ww");
var list = new List();
//待添加的document
jsons.ForEach(c =>
{
if (c.Web == null)
{
c.Web = "";
}
if (c.Description == null)
{
c.Description = "";
}
if (c.Address == null)
{
c.Address = "";
}
if (c.AreaName == null)
{
c.AreaName = "";
}
if (c.AscriptionName == null)
{
c.AscriptionName = "";
}
if (c.Belong == null)
{
c.Belong = "";
}
if (c.BuildDate == null)
{
c.BuildDate = "";
}
if (c.CityName == null)
{
c.CityName = "";
}
if (c.collegeCode == null)
{
c.collegeCode = "";
}
if (c.Logo == null)
{
c.Logo = "";
}
if (c.Nature == null)
{
c.Nature = "";
}
if (c.Phone == null)
{
c.Phone = "";
}
if (c.SubjectLevel == null)
{
c.SubjectLevel = -1;
}
if (c.VrUrl == null)
{
c.VrUrl = "";
}
var featurearray = new BsonArray() { };
if (c.features != null)
{
var feature = c.features.Split("/", StringSplitOptions.RemoveEmptyEntries).ToList();
feature.ForEach(a =>
{
if (a == "双一流大学")
{
a = "双一流";
}
if (a == "保研资格")
{
a = "保研";
}
featurearray.Add(a);
});
}
var utype = new BsonArray() { };
if (c.UniversityType != null)
{
utype.AddRange(c.UniversityType);
}
var imglist = new BsonArray() { };
if (c.Imglist != null)
{
var jbeson = JsonConvert.DeserializeObject>(c.Imglist);
imglist.AddRange(jbeson);
}
list.Add(new BsonDocument{
{ "_id",c.Id },
{ "name", c.Name },
{ "provinceName", c.AreaName },
{ "cityName",c.CityName},
{ "resourcecount", new BsonDocument
{
{ "academician", c.AcademicianCount },
{ "doctorate",c.DoctorateCount },
{ "master",c.MasterCount },
}
}, { "rank", c.Rank },
{ "weburl", c.Web },
{ "logo", c.Logo },
{ "collegeCode", c.collegeCode },
{ "address", c.Address },
{ "imglist", imglist },
{ "vrurl", string.IsNullOrEmpty(c.VrUrl)?"":c.VrUrl },
{ "phone", c.Phone },
{ "features",featurearray},
{ "belong", string.IsNullOrEmpty(c.AscriptionName)?"":c.AscriptionName },
{ "level",c.SubjectLevel },//0是本科,1 是专科
{ "builddate",c.BuildDate },
{ "utype", utype },
{"nature",c.Nature}
});
});
collection.InsertMany(list);
return true;
}
///
/// 院校详情
///
///
///
[HttpGet]
public async Task UniversityDetail([FromQuery] UniversityDetailRequest request)
{
var baseurl = App.GetConfig("OutExApi", true).BaseUrl;
var url = string.Format("{0}api/front/Library/GetUniversityDetails", baseurl);
//var result = await url
// .SetQueries(new OldUniversityRequest()
// {
// CustomerId = request.CId,
// Id = (int)request.Id
// })
// .SetJsonSerialization(new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() })
// .GetAsAsync>();
var dyresult = await url.SetQueryParams(new OldUniversityRequest()
{
CustomerId = request.CId,
Id = (int)request.Id
}).GetStringAsync();
var result = JsonConvert.DeserializeObject>(dyresult);
var response = new UniversityDetailResponse();
if (result != null && result.success && result.response != null)
{
var rpm = result.response.universityResult;
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var collection = dbclient.GetCollection("university");
var filter = Builders.Filter.Eq("_id", rpm.id);
// 获取单条数据
var document = collection.Find(filter).FirstOrDefault();
if (_userManager.UserId > 0)
{
var collect = await _uncollectionrep.AsQueryable().Where(e => e.WxId == _userManager.UserId && e.Id == request.Id).ToListAsync();
if (collect.Any() && collect.Count() > 0)
{
document.isCollect = true;
}
}
document.detail = rpm.description;
response.universityResult = document;
response.graduateModels = result.response.graduateModels;
response.relatedMajors = result.response.relatedMajors;
}
return response;
}
///
/// 融合院校专业模糊查询
///
///
///
[HttpGet]
public async Task CombineList([FromQuery] CombineRequestDto dto)
{
var majorlist = new List();
var baseurl = App.GetConfig("OutExApi", true).BaseUrl;
var url = string.Format("{0}api/front/Library/SeachMajor?Name={1}", baseurl, dto.KeyWord);
//var MajorResult = await url
// .SetJsonSerialization(new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() })
// .GetAsAsync>>();
var MajorResult = await url.GetJsonAsync>>();
if (MajorResult.success)
{
majorlist = MajorResult.response;
}
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var bejson = dbclient.GetCollection("university");
// 动态条件列表
var filterBuilders = new List>();
filterBuilders.Add(Builders.Filter.Regex(p => p.name, new BsonRegularExpression($"/{dto.KeyWord}/")));
FilterDefinition filter = filterBuilders.Count > 0
? Builders.Filter.And(filterBuilders)
: new BsonDocument(); // 如果没有条件,则使用空过滤器
var list = await bejson.Find(filter).ToListAsync();
return new CombinResponseDto()
{
universitys = list.Select(c => new CombinUniversityDto()
{
cityName = c.cityName,
collegeCode = c.collegeCode,
logo = c.logo,
name = c.name,
provinceName = c.provinceName,
_id = c._id,
utype = c.utype
}).ToList(),
majors = majorlist
};
}
///
/// 根据省份和年份查询批次结果
///
///
///
[ApiDescriptionSettings(Name = "BatchList"), HttpGet]
[AllowAnonymous]
public async Task BatchList([FromQuery] BatchResultRequestDto dto)
{
if (string.IsNullOrWhiteSpace(dto.locationCode))
{
throw Oops.Oh("必填信息为空");
}
var years = new int[] { 2024, 2023, 2022, 2021 }.ToList();
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
if (!string.IsNullOrWhiteSpace(dto.year))
{
var bejson = dbclient.GetCollection($"batchlist_{dto.locationCode}_{dto.year}");
var result = await bejson.Find(new BsonDocument()).ToListAsync();
var list = result.FirstOrDefault();
if (!result.Any() || !list.configList.subjectList.Any() || !list.list.Any())
{
return "暂无数据";
}
var yearlist = new List();
yearlist.Add(new gYearlist() { check = string.IsNullOrWhiteSpace(dto.year) ? true : false, year = "不限" });
yearlist.AddRange(years.Select(s => new gYearlist()
{
check = dto.year == s.ToString() ? true : false,
year = s.ToString()
}).ToList());
list.configList.yearList = yearlist;
list.configList.subjectList.ForEach(a => { a.check = a.subject_id == dto.type ? true : false; });
list.configList.subjectList.Insert(0, new gSubjectlist() { check = dto.type.HasValue ? false : true, subject_name = "不限" });
list.list = list.list.WhereIF(dto.type.HasValue, i => i.subject_id == dto.type).ToList();
return list;
}
else
{
var batchlist = new List();
years.ForEach(a =>
{
var bejson = dbclient.GetCollection($"batchlist_{dto.locationCode}_{a.ToString()}");
var result = bejson.Find(new BsonDocument()).ToList();
if (result.Any())
{
batchlist.Add(result.FirstOrDefault());
}
});
var resultlist = batchlist.FirstOrDefault();
var yearlist = new List();
yearlist.Add(new gYearlist() { check = string.IsNullOrWhiteSpace(dto.year) ? true : false, year = "不限" });
yearlist.AddRange(years.Select(s => new gYearlist()
{
check = false,
year = s.ToString()
}).ToList());
resultlist.configList.yearList = yearlist;
resultlist.configList.subjectList.Insert(0, new gSubjectlist() { check = dto.type.HasValue ? false : true, subject_name = "不限" });
resultlist.configList.subjectList.ForEach(a => { a.check = a.subject_id == dto.type ? true : false; });
resultlist.list = batchlist.SelectMany(s => s.list).WhereIF(dto.type.HasValue, i => i.subject_id == dto.type).ToList();
return resultlist;
}
}
[ApiDescriptionSettings(Name = "SyncBatchGaokao"), HttpPost]
public async Task SyncBatchGaokao()
{
// string baseUrl = "http://api.xuexingaokao.com/api/tool/batch/index?pro=";
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var provinceinfo = await _proviceRep.AsQueryable().Where(e => e.IsDelete == false).ToListAsync();
var years = new string[] { "2024", "2023", "2022", "2021" }.ToList();
//provinceinfo.ForEach(a =>
//{
// years.ForEach(y =>
// {
// //var goresult = $"{baseUrl}{a.Code}&year={y}&subject=&batch=×tamp={DateTimeOffset.Now.ToUnixTimeSeconds()}".SetJsonSerialization().GetAsAsync().Result;
// //if (goresult.code == 1 && goresult.data.list.Any())
// //{
// // var newbatchlist = goresult.data.list.Select(s => new gGbatchlist
// // {
// // batch_id = s.batch_id,
// // batch_name = s.batch_name,
// // }).ToList();
// // var subjectList = goresult.data.configList.subjectList.Select(s => new gSubjectlist
// // {
// // subject_id = CalcuScoreFinder.ChangeSubjectName(s.subject_name),
// // subject_name = s.subject_name,
// // check = s.selected,
// // }).ToList();
// // var gbatchList = goresult.data.list.Select(s => new gbatchList()
// // {
// // batch_name = s.batch_name,
// // batch_id = s.batch_id,
// // province_name = s.province_name,
// // year = s.year,
// // subject_id = CalcuScoreFinder.ChangeSubjectName(s.subject_name),
// // subject_name = s.subject_name,
// // province_code = s.province_code,
// // score = s.score
// // }).ToList();
// // var models = new BatchResultDto() { configList = new gConfiglist() { batchList = newbatchlist, subjectList = subjectList }, list = gbatchList, id = 1 };
// // var bejson = dbclient.GetCollection($"batchlist_{a.Code}_{y}");
// // bejson.InsertOne(models);
// }
// });
//});
}
///
/// 专业数据结构(三层)
///
///
///
[ApiDescriptionSettings(Name = "Majors"), HttpGet]
[AllowAnonymous]
public async Task Majors([FromQuery] MajorRootRequestInput input)
{
if (string.IsNullOrWhiteSpace(input.Type))
{
return new { code = 0, msg = "Type为必传字段" };
}
var filterBuilders = new List>();
filterBuilders.Add(Builders.Filter.Eq(p => p.type, input.Type));
FilterDefinition filters = filterBuilders.Count > 0
? Builders.Filter.And(filterBuilders)
: new BsonDocument(); // 如果没有条件,则使用空过滤器
var result = new List();
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var majortroot = dbclient.GetCollection("zmajorroots");
var rootlist = await majortroot.Find(filters).ToListAsync();
// 初始化查询条件
FilterDefinition filter = Builders.Filter.Empty;
// 用于存储多个条件的列表
var filter2 = new List>();
// 如果传入了 nameQuery,则添加 name 模糊查询条件
if (!string.IsNullOrEmpty(input.KeyWord))
{
var nameFilter = Builders.Filter.ElemMatch(x => x.majorMsgs,
Builders.Filter.Regex(y => y.name, new MongoDB.Bson.BsonRegularExpression(input.KeyWord, "i")));
filter2.Add(nameFilter);
}
// 如果传入了 zymcQuery,则添加 zymc 模糊查询条件
if (!string.IsNullOrEmpty(input.KeyWord))
{
var zymcFilter = Builders.Filter.ElemMatch(x => x.majorMsgs,
Builders.Filter.ElemMatch(y => y.childMajors,
Builders.Filter.Regex(z => z.zymc, new MongoDB.Bson.BsonRegularExpression(input.KeyWord, "i"))));
filter2.Add(zymcFilter);
}
// 如果有条件,则用 OR 组合,否则使用空过滤器
if (filter2.Count > 0)
{
filter = Builders.Filter.Or(filter2);
}
// 查询数据
var majorChild = dbclient.GetCollection("zmajorchild");
var childlist = await majorChild.Find(filter).ToListAsync();
result = rootlist.Select(s => new MajorRootResponseDto()
{
type = s.type,
RootDtos = s.majorMsgs
.Select(a => new GKMajorRootDto()
{
key = a.key,
name = a.name,
Count = childlist
.Where(e => e.type == a.key)
.SelectMany(c => c.majorMsgs)
.Where(e => e.childMajors != null && e.childMajors.WhereIF(!string.IsNullOrWhiteSpace(input.KeyWord), f => f.zymc.Contains(input.KeyWord)).Any()) // 过滤掉 childMajors 为空的项
.Select(e => new GaokaoMajorMsgItems()
{
key = e.key,
name = e.name,
childMajors = e.childMajors
}).Count(),
ItemsCount = childlist
.Where(e => e.type == a.key)
.SelectMany(c => c.majorMsgs)
.Where(e => e.childMajors != null && e.childMajors.WhereIF(!string.IsNullOrWhiteSpace(input.KeyWord), f => f.zymc.Contains(input.KeyWord)).Any()) // 过滤掉 childMajors 为空的项
.Select(e => new GaokaoMajorMsgItems()
{
key = e.key,
name = e.name,
childMajors = e.childMajors
}).SelectMany(l => l.childMajors).Count(),
items = childlist
.Where(e => e.type == a.key)
.SelectMany(c => c.majorMsgs)
.Where(e => e.childMajors != null && e.childMajors.WhereIF(!string.IsNullOrWhiteSpace(input.KeyWord), f => f.zymc.Contains(input.KeyWord)).Any()) // 过滤掉 childMajors 为空的项
.Select(e => new GaokaoMajorMsgItems()
{
key = e.key,
name = e.name,
childMajors = e.childMajors
})
.ToList()
})
.Where(dto => dto.items.Any()) //
.ToList()
}).ToList();
// 统计总数
return result;
}
///
/// 专业详情
///
///
///
[ApiDescriptionSettings(Name = "MajorDetail"), HttpGet]
[AllowAnonymous]
public async Task MajorDetail([FromQuery] MajorDetailRequestInput input)
{
if (string.IsNullOrWhiteSpace(input.SpecId))
{
return "专业id不能为空";
}
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var majordetail = dbclient.GetCollection("zmajordetailmsg");
// 构造查询条件
var filter = Builders.Filter.Eq(e => e.specId, input.SpecId);
// 查询单条记录
var result = await majordetail.Find(filter).FirstOrDefaultAsync();
if (result == null)
{
return "专业数据为空!!!";
}
return result;
}
///
/// 专业详情-按UI来的数据源
///
///
///
[ApiDescriptionSettings(Name = "MajorBase"), HttpGet]
[AllowAnonymous]
public async Task MajorBase([FromQuery] MajorCarrerInput input)
{
if (string.IsNullOrWhiteSpace(input.zydm))
{
return "专业id不能为空";
}
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var majordetail = dbclient.GetCollection("zbase_majors");
// 构造查询条件,忽略 subject_code_three 的后缀 T 或 K
var escapedZydm = Regex.Escape(input.zydm); // 确保输入安全
var filter = Builders.Filter.Regex(
e => e.subject_code_three,
new BsonRegularExpression($"^{escapedZydm}[TK]?$"));
// 查询单条记录
var result = await majordetail.Find(filter).FirstOrDefaultAsync();
if (result == null)
{
return new base_Subject()
{
subject_name_two = "专业数据为空!!!"
};
}
return result;
}
///
/// 专业关联课程
///
///
///
[ApiDescriptionSettings(Name = "ZkskcMajor"), HttpGet]
[AllowAnonymous]
public async Task ZkskcMajor([FromQuery] MajorDetailRequestInput input)
{
if (string.IsNullOrWhiteSpace(input.SpecId))
{
return "专业id不能为空";
}
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var majordetail = dbclient.GetCollection("zkskcmajormap");
// 构造查询条件
var filter = Builders.Filter.Eq(e => e.specId, input.SpecId);
// 查询单条记录
var result = await majordetail.Find(filter).FirstOrDefaultAsync();
if (result == null)
{
return "专业数据为空!!!";
}
return result;
}
///
/// 专业关联院校
///
///
///
[ApiDescriptionSettings(Name = "ZksyxMajor"), HttpGet]
[AllowAnonymous]
public async Task ZksyxMajor([FromQuery] MajorDetailRequestInput input)
{
if (string.IsNullOrWhiteSpace(input.SpecId))
{
return "专业id不能为空";
}
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var majordetail = dbclient.GetCollection("zksyxmajormap");
// 构造查询条件
var filter = Builders.Filter.Eq(e => e.specId, input.SpecId);
// 查询单条记录
var result = await majordetail.Find(filter).FirstOrDefaultAsync();
if (result == null)
{
return "专业数据为空!!!";
}
var unviersity = dbclient.GetCollection("university");
// 先确保 result.schSpecList 不为空
var specNames = result.schSpecList?.Select(x => x.yxmc).ToList();
if (specNames == null || specNames.Count == 0)
{
return "未找到对应院校信息";
}
// 构造查询条件,匹配 UniversityDto.name 在 specNames 之中
var universityFilter = Builders.Filter.In(u => u.name, specNames);
// 查询匹配的大学信息
var uresult = await unviersity.Find(universityFilter).ToListAsync();
result.schSpecList.ForEach(a =>
{
if (uresult.Any(e => e.name == a.yxmc))
{
string featuretag = string.Empty;
if (uresult.First(e => e.name == a.yxmc).features.Any())
{
featuretag = string.Join("/", uresult.First(e => e.name == a.yxmc).features);
}
a.logo = uresult.First(e => e.name == a.yxmc).logo;
a.ulevel = uresult.First(e => e.name == a.yxmc).level == 0 ? "本科" : "专科";
a.cityname = uresult.First(e => e.name == a.yxmc).cityName;
a.featuretag = featuretag;
}
});
result.ssdmList = result.ssdmList.Where(w => !string.IsNullOrWhiteSpace(w.code)).ToList();
return result;
}
///
/// 专业相关就业前景
///
/// 注意这个传入专业代码就是 Key 不是spid
///
[ApiDescriptionSettings(Name = "CareerProspects"), HttpGet]
[AllowAnonymous]
public async Task CareerProspects([FromQuery] MajorCarrerInput input)
{
var result = new CareerProspectItems();
if (string.IsNullOrWhiteSpace(input.zydm))
{
throw Oops.Oh("KeyWord不能为空");
}
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var carrerprosp = dbclient.GetCollection("zz_careerprospects");
var filter = Builders.Filter.Eq(e => e.majorcode, input.zydm);
var query = await carrerprosp.Find(filter).ToListAsync();
if (query == null)
{
throw Oops.Oh("专业数据为空!!!");
}
result.rates = query.Select(s => new DicRate()
{
key = s.profession,
value = s.rate
}).ToList();
result.profession = $"{string.Join("、", query.Select(s => s.profession).ToList())}";
result.jobs = $"该专业毕业生可从事{string.Join(";", query.Select(s => s.jobs).ToList())}";
return result;
}
///
/// 院校招生简章列表根据院校id获取
///
///
///
[ApiDescriptionSettings(Name = "Recruits"), HttpGet]
[AllowAnonymous]
public async Task Recruits([FromQuery] UniversityRecruitsDto dto)
{
if (dto.uid <= 0)
{
throw Oops.Oh("uid不能为空");
}
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var recruits = dbclient.GetCollection("zrecruitlist");
var filter = Builders.Filter.Eq(e => e.base_college_id, dto.uid);
var result = await recruits.Find(filter).ToListAsync();
return result;
}
///
/// 院校招生简章详情
///
///
///
[ApiDescriptionSettings(Name = "Recruitdetail"), HttpGet]
[AllowAnonymous]
public async Task Recruitdetail([FromQuery] RecruitsDetailDto dto)
{
if (dto.id <= 0)
{
throw Oops.Oh("id不能为空");
}
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var recruits = dbclient.GetCollection("zrecruitdetail");
var filter = Builders.Filter.Eq(e => e.id, dto.id);
var result = await recruits.Find(filter).FirstOrDefaultAsync();
if (recruits == null)
{
return "数据为空";
}
return result;
}
///
/// 高校院系列表根据院校Id获取
///
///
///
[ApiDescriptionSettings(Name = "Zfacultylist"), HttpGet]
[AllowAnonymous]
public async Task Zfacultylist([FromQuery] RecruitsDetailDto dto)
{
if (dto.id <= 0)
{
throw Oops.Oh("id不能为空");
}
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var facultys = dbclient.GetCollection("zfacultylist");
var filter = Builders.Filter.Eq(e => e.base_college_id, dto.id);
var result = await facultys.Find(filter).ToListAsync();
if (!result.Any())
{
return "数据为空";
}
// 转换逻辑
var uniTreeMajorItems = result.Select(faculty => new uniTreeMajorItems
{
ParnetId = 0, // Root node
Id = (int)faculty._id,
Name = faculty.college_faculty,
MajorNum = faculty.subject.Count,
Item = faculty.subject.Select(subject => new uniTreeMajorItems
{
ParnetId = (int)faculty._id,
Id = (int)subject.id,
Name = subject.faculty_subject,
MajorNum = 0, // Leaf node
Item = null
}).ToList()
}).ToList();
return uniTreeMajorItems;
}
///
/// 获取院校学科评估
///
///
///
[ApiDescriptionSettings(Name = "SubjectIntroducelist"), HttpGet]
[AllowAnonymous]
public async Task SubjectIntroducelist([FromQuery] RecruitsDetailDto dto)
{
if (dto.id <= 0)
{
throw Oops.Oh("id不能为空");
}
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var facultys = dbclient.GetCollection("zsubjectintroduces");
var filter = Builders.Filter.Eq(e => e.base_college_id, dto.id);
var result = await facultys.Find(filter).FirstOrDefaultAsync();
if (facultys == null)
{
return "数据为空";
}
result.first_subject_list = result.first_subject_list.Where(e => e != "").ToList();
result.second_subject_list = result.second_subject_list.Where(e => e != "").ToList();
result.feature_subject_list = result.feature_subject_list.Where(e => e != "").ToList();
result.stress_subject_list = result.stress_subject_list.Where(e => e != "").ToList();
result.double_subject_list=result.double_subject_list.Where(e => e != "").ToList();
result.assessment_subject_list = result.assessment_subject_list.Where(e => e != "").ToList();
result.assessment_subject_list_new = result.assessment_subject_list_new.Where(e => e.data.Any()).ToList();
return result;
}
///
/// 职业基础数据架构
///
///
///
[ApiDescriptionSettings(Name = "BaseProfession"), HttpGet]
[AllowAnonymous]
public async Task BaseProfession([FromQuery] BaseProfessionRequestInputDto dto)
{
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var zprofessionitems = dbclient.GetCollection("z_professionitems");
var filter = Builders.Filter.Empty; // 默认查询所有数据
if (!string.IsNullOrEmpty(dto.KeyWord))
{
filter = Builders.Filter.Or(
Builders.Filter.Regex("rootName", new BsonRegularExpression(dto.KeyWord, "i")),
Builders.Filter.Regex("itemDtos.name", new BsonRegularExpression(dto.KeyWord, "i"))
);
}
var list = await zprofessionitems.Find(filter).ToListAsync();
return list;
}
///
/// 职业详情
///
///
///
[ApiDescriptionSettings(Name = "Professiondetails"), HttpGet]
[AllowAnonymous]
public async Task Professiondetails([FromQuery] RecruitsDetailDto dto)
{
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var zprofession = dbclient.GetCollection("z_professiondetails");
var filter = Builders.Filter.Eq(e => e.id, dto.id);
var result = await zprofession.Find(filter).FirstOrDefaultAsync();
if (zprofession == null)
{
return "数据为空";
}
return result;
}
///
/// 获取AIGC问题
///
///
[ApiDescriptionSettings(Name = "aigcquestionswords"), HttpGet]
[AllowAnonymous]
public async Task GetAIGCQuestionsWords()
{
var dicy = await _sysDictDataRep.GetListAsync(e => e.DictTypeId == 660782446960709);
return dicy.Select(s => s.Remark).ToList();
}
}