using YBEE.EQM.Core;
namespace YBEE.EQM.Application;
///
/// TQES报表服务
///
///
///
///
public class ExamReportingTqesService(ISqlRepository tqesSqlRep, IRepository examPlanRep, IExportExcelService exportExcelService) : IExamReportingTqesService, ITransient
{
///
/// 根据监测计划ID导出全区优势薄弱
///
///
///
public async Task<(string, byte[])> ExportTotalAdvWeak(int examPlanId)
{
var examPlan = examPlanRep.Include(t => t.Semester).FirstOrDefault(t => t.Id == examPlanId) ?? throw Oops.Oh(ErrorCode.E2001, "监测计划");
// 临时存放目录
string fileRoot = Path.Combine(FileUtil.GetTempFileRoot(), $"{Guid.NewGuid()}");
Directory.CreateDirectory(fileRoot);
string filePath = Path.Combine(fileRoot, $"{examPlan.Name}-优势薄弱");
Directory.CreateDirectory(filePath);
try
{
var semester = examPlan.Semester;
// 存储过程参数
var p = new
{
startYear = semester.BeginYear,
endYear = semester.EndYear,
semesterTypeID = (int)semester.SemesterType,
schoolTypeID = (int)examPlan.EducationStage - 1
};
#region 优势薄弱
// 优势薄弱
var items = await tqesSqlRep.SqlQueriesAsync("EXECUTE [ir].[USP_RS_PJS_School_AdvWeak] @startYear, @endYear, @semesterTypeID, @schoolTypeID", p);
// 定义EXCEL列
List> cols1 =
[
new() { Name = "序号", Width = 6, GetCellValue = (r) => r.RowNum },
new() { Name = "城乡类别", Width = 10, GetCellValue = (r) => r.UrbanRuralTypeName },
new() { Name = "学校名称", Width = 20, GetCellValue = (r) => r.SchoolName, Align = ExportExcelCellAlign.LEFT },
new() { Name = "优势学科", Width = 38, GetCellValue = (r) => r.AdvCourseName, Align = ExportExcelCellAlign.LEFT, WrapText = true },
new() { Name = "数量", Width = 6, GetCellValue = (r) => r.AdvCourseCount },
new() { Name = "优势班级", Width = 55, GetCellValue = (r) => r.AdvClassCourseName, Align = ExportExcelCellAlign.LEFT, WrapText = true },
new() { Name = "数量", Width = 6, GetCellValue = (r) => r.AdvClassCourseCount },
new() { Name = "薄弱学科", Width = 38, GetCellValue = (r) => r.WeakCourseName, Align = ExportExcelCellAlign.LEFT, WrapText = true },
new() { Name = "数量", Width = 6, GetCellValue = (r) => r.WeakCourseCount },
new() { Name = "薄弱班级", Width = 55, GetCellValue = (r) => r.WeakClassCourseName, Align = ExportExcelCellAlign.LEFT, WrapText = true },
new() { Name = "数量", Width = 6, GetCellValue = (r) => r.WeakClassCourseCount },
];
var e1 = exportExcelService.ExportExcel(new ExportExcelDto()
{
IsXlsx = true,
Title = $"{examPlan.FullName}优势薄弱学科",
Columns = cols1,
Items = items,
IncludeExportTime = false,
NotSetRowHeight = true,
});
await File.WriteAllBytesAsync(Path.Combine(filePath, $"{examPlan.EducationStage.GetDescription()}-优势薄弱学科.xlsx"), e1);
#endregion
#region 优势薄弱(近两期对比)
// 优势薄弱(近两期对比)
var citems = await tqesSqlRep.SqlQueriesAsync("EXECUTE [ir].[USP_RS_PJS_School_DE_AdvWeak] @startYear, @endYear, @semesterTypeID, @schoolTypeID", p);
// 定义EXCEL列
List> cols2 =
[
new() { Name = "序号", Width = 6, GetCellValue = (r) => r.RowNum },
new() { Name = "城乡类别", Width = 10, GetCellValue = (r) => r.UrbanRuralTypeName },
new() { Name = "学校名称", Width = 20, GetCellValue = (r) => r.SchoolName, Align = ExportExcelCellAlign.LEFT },
new() { Name = "年级学科获得改进", Width = 38, GetCellValue = (r) => r.GradeImpr, Align = ExportExcelCellAlign.LEFT, WrapText = true },
new() { Name = "年级学科继续关注", Width = 38, GetCellValue = (r) => r.GradeAttn, Align = ExportExcelCellAlign.LEFT, WrapText = true },
new() { Name = "班级学科获得改进", Width = 55, GetCellValue = (r) => r.ClassImpr, Align = ExportExcelCellAlign.LEFT, WrapText = true },
new() { Name = "班级学科继续关注", Width = 55, GetCellValue = (r) => r.ClassAttn, Align = ExportExcelCellAlign.LEFT, WrapText = true },
];
var e2 = exportExcelService.ExportExcel(new ExportExcelDto()
{
IsXlsx = true,
Title = $"{examPlan.FullName}优势薄弱学科(最近两期对比)",
Columns = cols2,
Items = citems,
IncludeExportTime = false,
NotSetRowHeight = true,
});
await File.WriteAllBytesAsync(Path.Combine(filePath, $"{examPlan.EducationStage.GetDescription()}-优势薄弱学科(最近两期对比).xlsx"), e2);
#endregion
string outFileName = $"{examPlan.Name}-优势薄弱-{DateTime.Now.Ticks}.zip";
string outFilePath = Path.Combine(fileRoot, outFileName);
ICSharpCode.SharpZipLib.Zip.FastZip zip = new();
zip.CreateZip(outFilePath, filePath, true, string.Empty);
var retBytes = await File.ReadAllBytesAsync(outFilePath);
return (outFileName, retBytes);
}
catch (Exception ex)
{
throw new Exception("导出错误", ex);
}
finally
{
Directory.Delete(fileRoot, true);
}
}
}