tuiwucarrer/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/VolunTbService.cs

737 lines
32 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

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

using Admin.NET.Core;
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;
/// <summary>
/// 我的志愿表
/// </summary>
[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 800)]
public class VolunTbService : IDynamicApiController, ITransient
{
private readonly SqlSugarRepository<SysVolunteerTb> _rep;
private readonly UserManager _userManager;
private readonly IMongoDBRepository _mongoRepository;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly IHttpClientFactory _httpClientFactory;
private readonly SqlSugarRepository<BusProvince> _busProvince;
public VolunTbService(SqlSugarRepository<SysVolunteerTb> rep, UserManager userManager, IMongoDBRepository mongoDBRepository, IHttpContextAccessor httpContextAccessor, IHttpClientFactory httpClientFactory, SqlSugarRepository<BusProvince> busProvince)
{
_rep = rep;
_userManager = userManager;
_mongoRepository = mongoDBRepository;
_httpClientFactory = httpClientFactory;
_httpContextAccessor = httpContextAccessor;
_busProvince = busProvince;
}
/// <summary>
/// 分页查询我的志愿表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
[ApiDescriptionSettings(Name = "Page")]
public async Task<SqlSugarPagedList<VoTableDtoResponse>> 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<SysWeChatUserExtend>((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);
}
/// <summary>
/// 查询志愿列表
/// </summary>
/// <returns></returns>
[HttpGet]
[ApiDescriptionSettings(Name = "List")]
public async Task<List<VoTableDtoResponse>> 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();
}
/// <summary>
/// 查询志愿列表
/// </summary>
/// <returns></returns>
[HttpGet]
[ApiDescriptionSettings(Name = "V2/List")]
public async Task<List<VoTableDtoResponse>> 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();
}
/// <summary>
/// 保存我的志愿
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
[ApiDescriptionSettings(Name = "Post")]
public async Task<long> 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;
}
/// <summary>
/// 修改我的志愿
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
[ApiDescriptionSettings(Name = "Put")]
public async Task<long> 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;
}
/// <summary>
/// 删除我的志愿表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[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); //假删除
}
/// <summary>
///志愿单提交给专家
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[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);
}
/// <summary>
/// 已添加志愿列表详情
/// </summary>
/// <param name="Id"></param>
/// <param name="location"></param>
/// <returns></returns>
[HttpGet]
[ApiDescriptionSettings(Name = "Get")]
public async Task<VoTabDetailDto> 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<List<VTbDetailDto>>(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<zsplanfusionmodel>(string.Format("zsplanfusionmodel_{0}", location));
var filterBuilders = new List<FilterDefinition<zsplanfusionmodel>>();
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.In(p => p.pid, pids));
FilterDefinition<zsplanfusionmodel> filter = filterBuilders.Count > 0
? Builders<zsplanfusionmodel>.Filter.And(filterBuilders)
: new BsonDocument(); // 如果没有条件,则使用空过滤器
var list = await bejson.Find(filter).ToListAsync();
var dtolist = new List<TbDetailASDto>();
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<VItemDetail>();
string educationCategory = string.Empty;
var features = new List<string>();
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<PlanItem>())
.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<UniversityDto>("university");
// 获取 dtolist 中的所有 UnId
var unIds = dtolist.Select(c => c.UnId).ToList();
// 构建查询条件
FilterDefinition<UniversityDto> unfilter = unIds.Any()
? Builders<UniversityDto>.Filter.In(p => p._id, unIds)
: Builders<UniversityDto>.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<string>();
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;
}
/// <summary>
/// 导出excel
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpGet("Export"), NonUnify]
public async Task<IActionResult> Export([FromQuery] ExportExcelDto dto)
{
var viewentity = await _rep.GetFirstAsync(u => u.Id == dto.Id);
var jsons = JsonConvert.DeserializeObject<List<VTbDetailDto>>(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<zsplanfusionmodel>(string.Format("zsplanfusionmodel_{0}", dto.location));
var filterBuilders = new List<FilterDefinition<zsplanfusionmodel>>();
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.In(p => p.pid, pids));
FilterDefinition<zsplanfusionmodel> filter = filterBuilders.Count > 0
? Builders<zsplanfusionmodel>.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"
};
}
}
/// <summary>
///
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
[HttpGet("downloadpdf")]
public async Task<IActionResult> 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<PdfOptHelper.dataModel>();
var viewentity = await _rep.GetFirstAsync(u => u.Id == dto.Id);
var jsons = JsonConvert.DeserializeObject<List<VTbDetailDto>>(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<zsplanfusionmodel>(string.Format("zsplanfusionmodel_{0}", dto.location));
var filterBuilders = new List<FilterDefinition<zsplanfusionmodel>>();
filterBuilders.Add(Builders<zsplanfusionmodel>.Filter.In(p => p.pid, pids));
FilterDefinition<zsplanfusionmodel> filter = filterBuilders.Count > 0
? Builders<zsplanfusionmodel>.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<PdfOptHelper.dataMajorModel>();
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<string>();
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<string>() { 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_"))
};
}
/// <summary>
/// 生成 PDF 并上传至阿里云 OSS返回文件 URL。
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
[HttpGet("downloadpdfUrl")]
public async Task<dynamic> 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<PdfOptHelper.dataModel>();
var viewentity = await _rep.GetFirstAsync(u => u.Id == dto.Id);
var jsons = JsonConvert.DeserializeObject<List<VTbDetailDto>>(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<zsplanfusionmodel>(string.Format("zsplanfusionmodel_{0}", dto.location));
var filter = Builders<zsplanfusionmodel>.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<PdfOptHelper.dataMajorModel>();
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>
{
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<string> { 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<SysFileService>().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
};
}
}