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 }; } }