下载模板接口

This commit is contained in:
马梓彭 2026-03-19 23:36:06 +08:00
parent 318504339c
commit 0d7c6d9dfa
6 changed files with 117 additions and 28 deletions

View File

@ -169,6 +169,12 @@ public class IssueCertificateInput
/// </summary> /// </summary>
public class ScoreImportDto public class ScoreImportDto
{ {
/// <summary>
/// 赛事地址
/// </summary>
[ExcelColumnName("赛事地址")]
public string EventAddress { get; set; }
/// <summary> /// <summary>
/// 项目名称 /// 项目名称
/// </summary> /// </summary>
@ -186,6 +192,12 @@ public class ScoreImportDto
/// </summary> /// </summary>
[ExcelColumnName("姓名")] [ExcelColumnName("姓名")]
public string Name { get; set; } public string Name { get; set; }
/// <summary>
/// 联系方式
/// </summary>
[ExcelColumnName("联系方式")]
public string Contact { get; set; }
/// <summary> /// <summary>
/// 单位名称 /// 单位名称
@ -199,17 +211,17 @@ public class ScoreImportDto
[ExcelColumnName("成绩")] [ExcelColumnName("成绩")]
public string Score { get; set; } public string Score { get; set; }
/// <summary>
/// 名次
/// </summary>
[ExcelColumnName("名次")]
public int Rank { get; set; }
/// <summary> /// <summary>
/// 名次(文字) /// 名次(文字)
/// </summary> /// </summary>
[ExcelColumnName("名次(文字)")] [ExcelColumnName("名次")]
public string RankText { get; set; } public string RankText { get; set; }
/// <summary>
/// 名次
/// </summary>
[ExcelColumnName("名次 ")]
public int Rank { get; set; }
} }
/// <summary> /// <summary>

View File

@ -151,7 +151,7 @@ public class EventRegistrationService : BaseService<EventRegistration>, ITransie
/// 获取素材下载链接 /// 获取素材下载链接
/// </summary> /// </summary>
[DisplayName("获取素材下载链接")] [DisplayName("获取素材下载链接")]
public async Task<List<string>> GetMaterialUrls(List<long> ids) public async Task<List<string>> MaterialUrls(List<long> ids)
{ {
if (ids == null || !ids.Any()) return new List<string>(); if (ids == null || !ids.Any()) return new List<string>();

View File

@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using YD_Event.Application.Event.Dtos; using YD_Event.Application.Event.Dtos;
using YD_Event.Core.Entities; using YD_Event.Core.Entities;
using MiniExcelLibs; using MiniExcelLibs;
@ -191,18 +192,79 @@ public class EventScoreService : BaseService<EventResult>, ITransient
} }
} }
/// <summary>
/// 查看证书接口
/// </summary>
/// <param name="id">报名人员ID (EventRegistrationPerson的Id)</param>
/// <returns>证书详情</returns>
[DisplayName("查看证书")]
[HttpGet("/api/EventScore/GetCertificateDetail/{id}")]
public async Task<IActionResult> GetCertificateDetail([FromRoute] long id)
{
if (id <= 0)
{
return new BadRequestObjectResult(new { message = "无效的 ID" });
}
var personExists = await _personRepository.IsAnyAsync(x => x.Id == id);
if (!personExists)
{
return new NotFoundObjectResult(new { message = "人员记录不存在" });
}
var cert = await _certificateRepository.GetFirstAsync(x => x.ParticipationRecordId == id);
if (cert == null)
{
return new NotFoundObjectResult(new { message = "未找到对应的证书信息" });
}
if (string.IsNullOrWhiteSpace(cert.CertificateUrl))
{
return new NoContentResult();
}
return new JsonResult(new { url = cert.CertificateUrl });
}
/// <summary> /// <summary>
/// 下载模板 /// 下载模板
/// </summary> /// </summary>
public byte[] DownloadTemplate() [DisplayName("下载模板")]
[HttpGet]
public IActionResult DownloadTemplate()
{ {
var list = new List<ScoreImportDto> // 动态生成空数据及正确列名、样式的Excel模板
{ var headers = new string[] {
new ScoreImportDto { ProjectName = "30秒单摇", GroupName = "少儿组", Name = "崔一", UnitName = "上海跃动1", Score = "300", Rank = 1, RankText = "第一名" } "赛事地址",
"项目",
"组别",
"姓名",
"联系方式",
"单位",
"成绩",
"名次",
"名次 "
};
// 创建一个包含动态表头的列表,MiniExcel可以通过字典或匿名对象集合来生成带指定列名的Excel
var value = new List<Dictionary<string, object>>
{
// 插入一行空数据以确保生成正确的表头
headers.ToDictionary(h => h, h => (object)null)
};
using var memoryStream = new MemoryStream();
// MiniExcel 保存,使用默认样式。如果需要复杂的背景色和边框(如图片中的浅绿色表头),
// MiniExcel 目前不支持高级样式导出,因此这里我们使用 OpenXml 直接操作或基础导出。
// 但由于需求要求保持代码清晰并尽量匹配原图,这里先用 MiniExcel 导出带中文表头的文件。
// 为了实现完全一致的浅绿色样式,最好结合 EPPlus 或 ClosedXML。
// 考虑到项目中可能没有引入 EPPlus,使用 MiniExcel 的基础导出,并辅以说明。
memoryStream.SaveAs(value);
return new FileContentResult(memoryStream.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
FileDownloadName = "模板.xlsx"
}; };
using var stream = new MemoryStream();
stream.SaveAs(list);
return stream.ToArray();
} }
/// <summary> /// <summary>

View File

@ -35,5 +35,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="MiniExcel" Version="1.42.0" /> <PackageReference Include="MiniExcel" Version="1.42.0" />
<PackageReference Include="MiniWord" Version="0.9.2" />
<PackageReference Include="QuestPDF" Version="2026.2.3" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -4373,6 +4373,11 @@
成绩导入DTO 成绩导入DTO
</summary> </summary>
</member> </member>
<member name="P:YD_Event.Application.Event.Dtos.ScoreImportDto.EventAddress">
<summary>
赛事地址
</summary>
</member>
<member name="P:YD_Event.Application.Event.Dtos.ScoreImportDto.ProjectName"> <member name="P:YD_Event.Application.Event.Dtos.ScoreImportDto.ProjectName">
<summary> <summary>
项目名称 项目名称
@ -4388,6 +4393,11 @@
姓名 姓名
</summary> </summary>
</member> </member>
<member name="P:YD_Event.Application.Event.Dtos.ScoreImportDto.Contact">
<summary>
联系方式
</summary>
</member>
<member name="P:YD_Event.Application.Event.Dtos.ScoreImportDto.UnitName"> <member name="P:YD_Event.Application.Event.Dtos.ScoreImportDto.UnitName">
<summary> <summary>
单位名称 单位名称
@ -4398,14 +4408,19 @@
成绩 成绩
</summary> </summary>
</member> </member>
<member name="P:YD_Event.Application.Event.Dtos.ScoreImportDto.RankText">
<summary>
名次(文字)
</summary>
</member>
<member name="P:YD_Event.Application.Event.Dtos.ScoreImportDto.Rank"> <member name="P:YD_Event.Application.Event.Dtos.ScoreImportDto.Rank">
<summary> <summary>
名次 名次
</summary> </summary>
</member> </member>
<member name="P:YD_Event.Application.Event.Dtos.ScoreImportDto.RankText"> <member name="T:YD_Event.Application.Event.Dtos.CertificateDetailDto">
<summary> <summary>
名次(文字) 证书详细信息DTO
</summary> </summary>
</member> </member>
<member name="T:YD_Event.Application.Event.Dtos.CertificateExportDto"> <member name="T:YD_Event.Application.Event.Dtos.CertificateExportDto">
@ -5238,7 +5253,7 @@
导出报名 导出报名
</summary> </summary>
</member> </member>
<member name="M:YD_Event.Application.Event.EventRegistrationService.GetMaterialUrls(System.Collections.Generic.List{System.Int64})"> <member name="M:YD_Event.Application.Event.EventRegistrationService.MaterialUrls(System.Collections.Generic.List{System.Int64})">
<summary> <summary>
获取素材下载链接 获取素材下载链接
</summary> </summary>
@ -5268,6 +5283,13 @@
发放证书 发放证书
</summary> </summary>
</member> </member>
<member name="M:YD_Event.Application.Event.EventScoreService.GetCertificateDetail(System.Int64)">
<summary>
查看证书接口
</summary>
<param name="id">报名人员ID (EventRegistrationPerson的Id)</param>
<returns>证书详情</returns>
</member>
<member name="M:YD_Event.Application.Event.EventScoreService.DownloadTemplate"> <member name="M:YD_Event.Application.Event.EventScoreService.DownloadTemplate">
<summary> <summary>
下载模板 下载模板

View File

@ -79,16 +79,7 @@ public class Startup : AppStartup
}); });
//允许跨域 //允许跨域
services.AddCorsAccessor(options => services.AddCorsAccessor();
{
options.AddPolicy("Furion", builder =>
{
builder.SetIsOriginAllowed(_ => true)
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
});
});
//配置缓存 文档:https://easycaching.readthedocs.io/en/latest/ //配置缓存 文档:https://easycaching.readthedocs.io/en/latest/
services.AddEasyCaching(options => services.AddEasyCaching(options =>