using Admin.NET.Core;
using Admin.NET.Core.Service;
using AngleSharp.Dom;
using DocumentFormat.OpenXml.Wordprocessing;
using Elastic.Clients.Elasticsearch;
using Furion.DatabaseAccessor;
using iText.Kernel.Pdf;
using Microsoft.AspNetCore.Http;
using MiniExcelLibs;
using MongoDB.Bson;
using MongoDB.Driver;
using NewLife.Net.Handlers;
using Newtonsoft.Json;
using OfficeOpenXml;
using Org.BouncyCastle.Ocsp;
using SharpCompress.Common;
using SkiaSharp;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Text.Json.Serialization;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using static Admin.NET.Core.PdfOptHelper;
namespace Admin.NET.Application.Service;
///
/// 我的志愿表
///
[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 800)]
public class VolunTbService : IDynamicApiController, ITransient
{
private readonly SqlSugarRepository _rep;
private readonly UserManager _userManager;
private readonly IMongoDBRepository _mongoRepository;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly IHttpClientFactory _httpClientFactory;
private readonly SqlSugarRepository _busProvince;
public VolunTbService(SqlSugarRepository rep, UserManager userManager, IMongoDBRepository mongoDBRepository, IHttpContextAccessor httpContextAccessor, IHttpClientFactory httpClientFactory, SqlSugarRepository busProvince)
{
_rep = rep;
_userManager = userManager;
_mongoRepository = mongoDBRepository;
_httpClientFactory = httpClientFactory;
_httpContextAccessor = httpContextAccessor;
_busProvince = busProvince;
}
///
/// 分页查询我的志愿表
///
///
///
[HttpPost]
[ApiDescriptionSettings(Name = "Page")]
public async Task> Page(SysVolunteerTbInput input)
{
var query = _rep.AsQueryable()
.Where(e => e.CId == _userManager.UserId)
.WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u =>
u.TableName.Contains(input.SearchKey.Trim())
|| u.BatchName.Contains(input.SearchKey.Trim())
//|| u.Type.Contains(input.SearchKey.Trim())
|| u.SubjectClaim.Contains(input.SearchKey.Trim())
//|| u.Score.Contains(input.SearchKey.Trim())
//|| u.Detail.Contains(input.SearchKey.Trim())
)
.WhereIF(input.CId > 0, u => u.CId == input.CId)
.WhereIF(!string.IsNullOrWhiteSpace(input.TableName), u => u.TableName.Contains(input.TableName.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.BatchName), u => u.BatchName.Contains(input.BatchName.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.Type), u => u.Type.Contains(input.Type.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.SubjectClaim), u => u.SubjectClaim.Contains(input.SubjectClaim.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.Detail), u => u.Detail.Contains(input.Detail.Trim()))
.LeftJoin((u, cid) => u.CId == cid.Id)
.OrderBy((u, cid) => u.CreateTime, OrderByType.Desc)
.Select((u, cid) => new VoTableDtoResponse
{
BatchName = u.BatchName,
VId = u.Id,
CId = cid.Id,
CreateTime = u.CreateTime,
CustomerName = u.CreateUserName,
// personlocationCode = u.CreateUserName,
Score = u.Score,
SubjectClaim = u.SubjectClaim,
TableName = u.TableName,
Type = u.Type,
IsPush = u.IsPush,
});
return await query.ToPagedListAsync(input.Page, input.PageSize);
}
///
/// 查询志愿列表
///
///
[HttpGet]
[ApiDescriptionSettings(Name = "List")]
public async Task> List()
{
return await _rep.AsQueryable().Where(e => e.CId == _userManager.UserId).Select(c => new VoTableDtoResponse()
{
BatchName = c.BatchName,
CId = c.CId,
Score = c.Score,
SubjectClaim = c.SubjectClaim,
TableName = c.TableName,
Type = c.Type,
VId = c.Id,
IsPush = c.IsPush,
CreateTime = c.CreateTime
}).OrderByDescending(c => c.VId).ToListAsync();
}
///
/// 查询志愿列表
///
///
[HttpGet]
[ApiDescriptionSettings(Name = "V2/List")]
public async Task> ListV2([FromQuery] string locationCode)
{
var provincename = await _busProvince.AsQueryable().Where(e => e.Code == locationCode).FirstAsync();
return await _rep.AsQueryable().WhereIF(!string.IsNullOrWhiteSpace(locationCode), l => l.LocationCode == locationCode).Where(e => e.CId == _userManager.UserId).Select(c => new VoTableDtoResponse()
{
BatchName = c.BatchName,
CId = c.CId,
Score = c.Score,
SubjectClaim = c.SubjectClaim,
TableName = c.TableName,
Type = c.Type,
VId = c.Id,
IsPush = c.IsPush,
CreateTime = c.CreateTime,
personlocationCode = c.LocationCode,
LocationName = provincename.Name
}).OrderByDescending(c => c.VId).ToListAsync();
}
///
/// 保存我的志愿
///
///
///
[HttpPost]
[ApiDescriptionSettings(Name = "Post")]
public async Task Post([FromBody] VoTableDtoRequest request)
{
//if (request.CId <= 0)
//{
// throw Oops.Oh("用户Id不能为空");
//}
int ordersort = 0;
var vol = (await _rep.GetListAsync(c => c.CId == _userManager.UserId));
if (vol.Any())
{
request.TableName = "我的志愿表" + (vol.OrderByDescending(c => c.CreateTime).FirstOrDefault().OrderSort + 1);
ordersort = (vol.OrderByDescending(c => c.CreateTime).FirstOrDefault().OrderSort + 1);
}
else
{
request.TableName = "我的志愿表01";
ordersort = 1;
}
var newmodels = new SysVolunteerTb()
{
CreateTime = DateTime.Now,
CId = _userManager.UserId,
LocationCode = request.LocationCode,
UpdateTime = DateTime.Now,
OrderSort = ordersort,
IsDelete = false,
SubjectClaim = request.SubjectClaim,
Type = request.Type,
Score = request.Score,
BatchName = request.BatchName,
TableName = request.TableName,
CreateUserId = _userManager.UserId,
UpdateUserId = _userManager.UserId,
CreateUserName = _userManager.RealName,
UpdateUserName = _userManager.RealName,
Detail = request.vTbDetails.ToJson()
};
await _rep.InsertAsync(newmodels);
return newmodels.Id;
}
///
/// 修改我的志愿
///
///
///
[HttpPost]
[ApiDescriptionSettings(Name = "Put")]
public async Task Put([FromBody] VoTableDtoRequest request)
{
if (request.VId <= 0)
{
throw Oops.Oh("志愿id为必传");
}
var model = await _rep.GetSingleAsync(c => c.Id == request.VId);
if (!string.IsNullOrWhiteSpace(request.TableName)) { model.TableName = request.TableName; }
model.Detail = request.vTbDetails.ToJson();
model.UpdateTime = DateTime.Now;
model.UpdateUserName = _userManager.RealName;
model.UpdateUserId = _userManager.UserId;
await _rep.UpdateAsync(model);
return model.Id;
}
///
/// 删除我的志愿表
///
///
///
[HttpPost]
[ApiDescriptionSettings(Name = "Delete")]
public async Task Delete(DeleteSysVolunteerTbInput input)
{
var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
await _rep.DeleteAsync(entity); //假删除
}
///
///志愿单提交给专家
///
///
///
[HttpPost]
[ApiDescriptionSettings(Name = "PushStatus")]
public async Task PushStatus(DeleteSysVolunteerTbInput input)
{
var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
var replist = await _rep.GetListAsync(u => u.CId == entity.CId);
var updatedList = replist.Select(a =>
{
a.IsPush = false;
return a;
}).ToList();
await _rep.UpdateRangeAsync(updatedList);
entity.IsPush = true;
await _rep.UpdateAsync(entity);
}
///
/// 已添加志愿列表详情
///
///
///
///
[HttpGet]
[ApiDescriptionSettings(Name = "Get")]
public async Task Get([FromQuery] long Id, string location)
{
var asrespose = new VoTabDetailDto();
var entity = await _rep.GetFirstAsync(u => u.Id == Id);
var rep = new VoTableDtoResponse();
rep.CId = entity.CId;
rep.TableName = entity.TableName;
rep.BatchName = entity.BatchName;
rep.Type = entity.Type;
rep.SubjectClaim = entity.SubjectClaim;
rep.Score = entity.Score;
asrespose.VoTable = rep;
var jsons = JsonConvert.DeserializeObject>(entity.Detail);
var pids = jsons.SelectMany(c => c.vItems.Select(c => c._pId).ToList()).ToList();
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var bejson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", location));
var filterBuilders = new List>();
filterBuilders.Add(Builders.Filter.In(p => p.pid, pids));
FilterDefinition filter = filterBuilders.Count > 0
? Builders.Filter.And(filterBuilders)
: new BsonDocument(); // 如果没有条件,则使用空过滤器
var list = await bejson.Find(filter).ToListAsync();
var dtolist = new List();
DateTime dt = DateTime.Now;
DateTime fixedDate = new DateTime(dt.Year, 7, 20);
int year = dt > fixedDate ? dt.Year : dt.Year - 1;
jsons.ForEach(c =>
{
var vlist = new List();
string educationCategory = string.Empty;
var features = new List();
string ownership = string.Empty;
string province = string.Empty;
string subjectType = string.Empty;
string city = string.Empty;
string uName = string.Empty;
c.vItems.ForEach(a =>
{
var plan = list.FirstOrDefault(f => f.pid == a._pId);
if (plan != null)
{
uName = plan.universityName;
educationCategory = plan.educationCategory;
features = plan.features;
ownership = plan.ownership;
province = plan.province;
subjectType = plan.subjectType;
city = plan.city;
vlist.Add(new VItemDetail
{
MajorCode = plan.majorCode,
MajorGroup = string.IsNullOrWhiteSpace(plan.majorGroup) ? "" : "(" + plan.majorGroup.Split("(")[1],
percentAge = a.percentAge,
_pId = a._pId,
Sort = a.Sort,
type = a.type,
Major = plan.majorName,
academic = plan.academicYear,
//features = plan.features,
fee = plan.fee,
nature = plan.nature,
// ownership = plan.ownership,
planCount = plan.planCount,
planItems = plan.items,
remark = plan.remark,
subjectClam = plan._23subject,
// subjectType = plan.subjectType,
});
}
});
dtolist.Add(new TbDetailASDto()
{
Year = year,
Type = c.type,
Sort = c.Sort,
UnCode = c.UnCode,
UnName = uName,
educationCategory = educationCategory,
features = features,
ownership = ownership,
province = province,
subjectType = subjectType,
city = city,
Logo = "https://static-data.ycymedu.com/6.jpg",
UnId = c.UnId,
childItems = vlist
.SelectMany(e => e.planItems ?? Enumerable.Empty())
.GroupBy(pi => pi.year)
.Select(g => new UChildItem
{
year = g.Key,
planCount = g.Sum(pi => pi.planCount),
score = Math.Round(g.Average(pi => pi.score), 0),
rankLine = Math.Round(g.Average(pi => pi.rankLine), 0)
})
.OrderByDescending(result => result.year)
.ToList(),
vItems = vlist
});
});
var university = dbclient.GetCollection("university");
// 获取 dtolist 中的所有 UnId
var unIds = dtolist.Select(c => c.UnId).ToList();
// 构建查询条件
FilterDefinition unfilter = unIds.Any()
? Builders.Filter.In(p => p._id, unIds)
: Builders.Filter.Empty; // 如果 dtolist 为空,则查询所有数据
// 执行查询
var unlist = await university.Find(unfilter).ToListAsync();
dtolist.ForEach(a =>
{
a.Rank = unlist.Where(e => e._id == a.UnId).Any() ? unlist.Where(e => e._id == a.UnId).FirstOrDefault().rank : "暂无";
a.features = unlist.Where(e => e._id == a.UnId).Any() ? unlist.Where(e => e._id == a.UnId).FirstOrDefault().features : new List();
a.Logo = unlist.Where(e => e._id == a.UnId).Any() ? unlist.Where(e => e._id == a.UnId).FirstOrDefault().logo : "https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/nocontent/empty.png";
});
asrespose.tbDetails = dtolist;
return asrespose;
}
///
/// 导出excel
///
///
///
[HttpGet("Export"), NonUnify]
public async Task Export([FromQuery] ExportExcelDto dto)
{
var viewentity = await _rep.GetFirstAsync(u => u.Id == dto.Id);
var jsons = JsonConvert.DeserializeObject>(viewentity.Detail);
var pids = jsons.SelectMany(c => c.vItems.Select(c => c._pId).ToList()).ToList();
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var bejson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", dto.location));
var filterBuilders = new List>();
filterBuilders.Add(Builders.Filter.In(p => p.pid, pids));
FilterDefinition filter = filterBuilders.Count > 0
? Builders.Filter.And(filterBuilders)
: new BsonDocument();
var list = await bejson.Find(filter).ToListAsync();
// 按院校分组
var groupedData = jsons.GroupBy(c => new { c.UnCode, c.UnName })
.Select(group => new
{
UniversityCode = group.Key.UnCode,
UniversityName = group.Key.UnName,
Items = group.SelectMany(c => c.vItems).ToList()
}).ToList();
using (var package = new ExcelPackage())
{
var worksheet = package.Workbook.Worksheets.Add("志愿表");
// 设置字体
worksheet.Cells.Style.Font.Name = "Calibri";
worksheet.Cells.Style.Font.Size = 12;
// 设置表头
worksheet.Cells[1, 1].Value = "院校代码";
worksheet.Cells[1, 2].Value = "院校名称";
worksheet.Cells[1, 3].Value = "专业名称";
worksheet.Cells[1, 4].Value = "专业信息";
worksheet.Cells[1, 5].Value = "2024招生计划";
worksheet.Cells[1, 6].Value = "2024分数/位次";
worksheet.Cells[1, 7].Value = "2023分数/位次";
worksheet.Cells[1, 8].Value = "2022分数/位次";
// 设置表头样式
using (var headerRange = worksheet.Cells[1, 1, 1, 8])
{
headerRange.Style.Font.Bold = true;
headerRange.Style.Font.Size = 12; // 表头字体稍大
headerRange.Style.Font.Color.SetColor(SixLabors.ImageSharp.Color.White); // 白色字体
headerRange.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
headerRange.Style.Fill.BackgroundColor.SetColor(SixLabors.ImageSharp.Color.FromRgb(51, 112, 255)); // 深蓝色背景
headerRange.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;
headerRange.Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center;
headerRange.Style.Border.BorderAround(OfficeOpenXml.Style.ExcelBorderStyle.Thick, System.Drawing.Color.Black); // 边框加粗
}
int currentRow = 2; // 从第2行开始写数据
// 写入数据并处理合并
foreach (var university in groupedData)
{
int startRow = currentRow; // 合并起始行
foreach (var major in university.Items)
{
var plan = list.FirstOrDefault(f => f.pid == major._pId);
if (plan != null)
{
//var _24items = plan.items.Where(e => e.year == "2024");
var _23items = plan.items.Where(e => e.year == "2023");
var _22items = plan.items.Where(e => e.year == "2022");
worksheet.Cells[currentRow, 3].Value = plan.majorName;
worksheet.Cells[currentRow, 4].Value = string.Format("代码:{0}\n学年:{1}/年\n费用:{2}\n 选科:{3}", plan.majorCode, plan.academicYear, plan.fee, plan._24subject);
worksheet.Cells[currentRow, 5].Value = plan.planCount;
worksheet.Cells[currentRow, 6].Value = plan._score > 0 ? plan._score : "--";
worksheet.Cells[currentRow, 7].Value = string.Format("{0}\n{1}", _23items.Any() ? _23items.FirstOrDefault().score > 0 ? _23items.FirstOrDefault().score.ToString() : "--" : "--", _23items.FirstOrDefault().rankLine);
worksheet.Cells[currentRow, 8].Value = string.Format("{0}\n{1}", _22items.Any() ? _22items.FirstOrDefault().score > 0 ? _22items.FirstOrDefault().score.ToString() : "--" : "--", _22items.FirstOrDefault().rankLine);
currentRow++;
}
}
// 合并院校代码和院校名称列
if (startRow < currentRow - 1)
{
worksheet.Cells[startRow, 1, currentRow - 1, 1].Merge = true; // 合并院校代码列
worksheet.Cells[startRow, 2, currentRow - 1, 2].Merge = true; // 合并院校名称列
}
worksheet.Cells[startRow, 1].Value = university.UniversityCode;
worksheet.Cells[startRow, 2].Value = university.UniversityName;
}
// 设置内容单元格样式
for (int i = 2; i < currentRow; i++)
{
// 交替行背景色
var rowColor = i % 2 == 0 ? SixLabors.ImageSharp.Color.FromRgb(242, 242, 242) : SixLabors.ImageSharp.Color.White;
using (var contentRange = worksheet.Cells[i, 1, i, 8])
{
contentRange.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
contentRange.Style.Fill.BackgroundColor.SetColor(rowColor);
// 设置水平和垂直居中
contentRange.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;
contentRange.Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center;
// 设置边框
contentRange.Style.Border.Top.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
contentRange.Style.Border.Top.Color.SetColor(SixLabors.ImageSharp.Color.Gray); // 顶部边框颜色
contentRange.Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
contentRange.Style.Border.Bottom.Color.SetColor(SixLabors.ImageSharp.Color.Gray); // 底部边框颜色
contentRange.Style.Border.Left.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
contentRange.Style.Border.Left.Color.SetColor(SixLabors.ImageSharp.Color.Gray); // 左侧边框颜色
contentRange.Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
contentRange.Style.Border.Right.Color.SetColor(SixLabors.ImageSharp.Color.Gray); // 右侧边框颜色
}
}
// 自动调整列宽
worksheet.Cells.AutoFitColumns();
// 设置行高
worksheet.Cells.Style.WrapText = true; // 自动换行
worksheet.Row(1).Height = 24; // 表头行高
for (int i = 2; i < currentRow; i++)
{
worksheet.Row(i).Height = 65; // 数据行行高
}
// 导出 Excel 文件
var stream = new MemoryStream();
package.SaveAs(stream);
stream.Seek(0, SeekOrigin.Begin);
return new FileStreamResult(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
FileDownloadName = $"志愿表_{DateTime.Now:yyyyMMddHHmmss}.xlsx"
};
}
}
///
///
///
///
///
///
[HttpGet("downloadpdf")]
public async Task GenerateAsync([FromQuery] ExportExcelDto dto)
{
string[] unversityheaders = { "志愿", "概率", "院校代码", "院校名称", "24招生计划", "历年", "2024", "2023", "2022" };
string[] majorlistheaders = { "序号", "概率", "专业代码", "专业名称", "24招生计划", "历年", "2024", "2023", "2022" };
if (dto.Id <= 0)
{
throw new Exception("id为空");
}
var ulist = new List();
var viewentity = await _rep.GetFirstAsync(u => u.Id == dto.Id);
var jsons = JsonConvert.DeserializeObject>(viewentity.Detail);
var pids = jsons.SelectMany(c => c.vItems.Select(c => c._pId).ToList()).ToList();
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var bejson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", dto.location));
var filterBuilders = new List>();
filterBuilders.Add(Builders.Filter.In(p => p.pid, pids));
FilterDefinition filter = filterBuilders.Count > 0
? Builders.Filter.And(filterBuilders)
: new BsonDocument(); // 如果没有条件,则使用空过滤器
var list = await bejson.Find(filter).ToListAsync();
var udist = jsons.Select(s => new PdfOptHelper.dataModel { universityCode = s.UnCode, universityName = s.UnName }).Distinct().ToList();
int k = 0;
udist.ForEach(a =>
{
k++;
var majorlist = new List();
var schoolinfo = new zsplanfusionmodel();
var vitems = jsons.Where(e => e.UnCode == a.universityCode).SelectMany(s => s.vItems).ToList();
int z = 0;
vitems.ForEach(v =>
{
z++;
var majormodel = list.Where(e => e.pid == v._pId).FirstOrDefault();
var mlist = new List();
mlist.Add(string.Format("{0}\n{1}\n{2}\n{3}", majormodel.planCount == 0 ? "--" : majormodel.planCount.ToString(), majormodel._score == 0 ? "--" : majormodel._score.ToString(), "--", "--"));
majormodel.items.OrderByDescending(b => b.year).Take(2).ToList().ForEach(x =>
{
mlist.Add(string.Format("{0}\n{1}\n{2}\n{3}", x.planCount, x.score, x.rankLine, "--"));
});
majorlist.Add(new dataMajorModel()
{
id = z,
majorCode = majormodel.majorCode,
mjaorName = PdfOptHelper.AddLineBreaks(majormodel.majorName, 9),
probability = v.percentAge,
history = "计划人数\n最低分\n最低位次\n效位差",
planCount = string.Format("{0}人\n{1}年\n¥{2}\n{3}", majormodel.planCount.ToString(), majormodel.academicYear, majormodel.fee, majormodel._24subject),
years = mlist
});
schoolinfo = majormodel;
});
ulist.Add(new PdfOptHelper.dataModel()
{
id = k,
planCount = list.Where(e => e.universityName == a.universityName).Sum(s => s.planCount).ToString(),
universityName = a.universityName,
universityCode = a.universityCode,
planName = a.planName,
probability = "--",
history = "计划人数\n最低分\n最低位次\n效位差",
years = new List() { schoolinfo.items.Sum(s => s.planCount).ToString(), schoolinfo._schoolScore.ToString(), schoolinfo._schoolScoreLine.ToString(), "--" },
majorModels = majorlist
});
});
var stream = PdfOptHelper.CreatePdfAsync(string.Format("{0}-{1}-{2}", viewentity.Type, viewentity.SubjectClaim, viewentity.Score), unversityheaders.ToList(), majorlistheaders.ToList(), ulist, viewentity.CreateTime.Value);
// 将 byte[] 转换为 MemoryStream
var pdfStream = new MemoryStream(stream);
return new FileStreamResult(pdfStream, "application/pdf")
{
FileDownloadName = string.Format("{0}.pdf", DateTime.Now.ToString("yyyyMMddhhssfff_"))
};
}
///
/// 生成 PDF 并上传至阿里云 OSS,返回文件 URL。
///
///
///
///
[HttpGet("downloadpdfUrl")]
public async Task GeneratePdfAsync([FromQuery] ExportExcelDto dto)
{
string[] unversityheaders = { "志愿", "概率", "院校代码", "院校名称", "24招生计划", "历年", "2024", "2023", "2022" };
string[] majorlistheaders = { "序号", "概率", "专业代码", "专业名称", "24招生计划", "历年", "2024", "2023", "2022" };
if (dto.Id <= 0)
{
throw new Exception("id为空");
}
var ulist = new List();
var viewentity = await _rep.GetFirstAsync(u => u.Id == dto.Id);
var jsons = JsonConvert.DeserializeObject>(viewentity.Detail);
var pids = jsons.SelectMany(c => c.vItems.Select(c => c._pId).ToList()).ToList();
var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan");
var bejson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", dto.location));
var filter = Builders.Filter.In(p => p.pid, pids);
var list = await bejson.Find(filter).ToListAsync();
var udist = jsons.Select(s => new PdfOptHelper.dataModel { universityCode = s.UnCode, universityName = s.UnName }).Distinct().ToList();
int k = 0;
foreach (var a in udist)
{
k++;
var majorlist = new List();
var schoolinfo = new zsplanfusionmodel();
var vitems = jsons.Where(e => e.UnCode == a.universityCode).SelectMany(s => s.vItems).ToList();
int z = 0;
foreach (var v in vitems)
{
z++;
var majormodel = list.FirstOrDefault(e => e.pid == v._pId);
if (majormodel == null) continue;
var mlist = new List
{
string.Format("{0}\n{1}\n{2}\n{3}", majormodel.planCount == 0 ? "--" : majormodel.planCount.ToString(), majormodel._score == 0 ? "--" : majormodel._score.ToString(), "--", "--")
};
majormodel.items.OrderByDescending(b => b.year).Take(2).ToList().ForEach(x =>
{
mlist.Add(string.Format("{0}\n{1}\n{2}\n{3}", x.planCount, x.score, x.rankLine, "--"));
});
majorlist.Add(new PdfOptHelper.dataMajorModel()
{
id = z,
majorCode = majormodel.majorCode,
mjaorName = PdfOptHelper.AddLineBreaks(majormodel.majorName, 9),
probability = v.percentAge,
history = "计划人数\n最低分\n最低位次\n效位差",
planCount = string.Format("{0}人\n{1}年\n¥{2}\n{3}", majormodel.planCount.ToString(), majormodel.academicYear, majormodel.fee, majormodel._24subject),
years = mlist
});
schoolinfo = majormodel;
}
ulist.Add(new PdfOptHelper.dataModel()
{
id = k,
planCount = list.Where(e => e.universityName == a.universityName).Sum(s => s.planCount).ToString(),
universityName = a.universityName,
universityCode = a.universityCode,
planName = a.planName,
probability = "--",
history = "计划人数\n最低分\n最低位次\n效位差",
years = new List { schoolinfo.items.Sum(s => s.planCount).ToString(), schoolinfo._schoolScore.ToString(), schoolinfo._schoolScoreLine.ToString(), "--" },
majorModels = majorlist
});
}
var stream = PdfOptHelper.CreatePdfAsync(string.Format("{0}-{1}-{2}", viewentity.Type, viewentity.SubjectClaim, viewentity.Score), unversityheaders.ToList(), majorlistheaders.ToList(), ulist, viewentity.CreateTime.Value);
var pdfStream = new MemoryStream(stream);
var fileName = string.Format("{0}.pdf", DateTime.Now.ToString("yyyyMMddhhssfff_"));
var provincename = await _busProvince.AsQueryable().Where(e => e.Code == viewentity.LocationCode).FirstAsync();
// 2. 构造 IFormFile
IFormFile formFile = new FormFile(pdfStream, 0, stream.Length, "file", fileName)
{
Headers = new HeaderDictionary(),
ContentType = "application/json"
};
var newFile = await App.GetRequiredService().UploadFile(formFile, "pdf");
return new AIInfoDto
{
Url = newFile.Url,
TableName = viewentity.TableName,
BatchName = viewentity.BatchName,
Score = viewentity.Score,
SubjectClaim = viewentity.SubjectClaim,
Type = viewentity.Type,
ProvinceName = provincename.Name
};
}
}