737 lines
32 KiB
C#
737 lines
32 KiB
C#
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
|
||
|
||
};
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
}
|
||
|
||
|
||
|
||
|