using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Threading.Tasks; using VOL.Business.IServices; using VOL.Business.Services; using VOL.Core.Filters; using VOL.Core.ManageUser; using VOL.Core.Utilities; using VOL.Model; using VOL.Model.Norm.Response; namespace VOL.WebApi.Controllers.Business { /// /// 体测数据 /// [Route("api/[controller]")] [ApiController] [ApiExplorerSettings(GroupName = "v3")] [TypeFilter(typeof(CustomApiResponseFilter))] public class SportsTestResultController : ControllerBase { #region 初始化 private readonly IN_SportsTestResultService _sportsTestResultService; public SportsTestResultController( IN_SportsTestResultService sportsTestResultService) { _sportsTestResultService = sportsTestResultService; } #endregion /// /// 学生成绩分页 /// /// [HttpGet(nameof(GetSportsTestCategoryPageList))] public async Task> GetSportsTestCategoryPageList(StudentsTestDataListParam paramDto) { return await _sportsTestResultService.GetSportsTestCategoryPageList(paramDto); } /// /// 导入学生体测数据 /// /// /// /// [HttpPost(nameof(ImportStudentsTestData))] public async Task ImportStudentsTestData(IFormFile file) { await _sportsTestResultService.ImportStudentsTestData(file); return Ok("导入成功"); } /// /// 导出 /// /// /// [HttpGet(nameof(Export))] public async Task Export(StudentsTestDataListParam paramDto) { var rseList = await _sportsTestResultService.GetStudentsTestDataList(paramDto); var disList = new Dictionary>(); disList.Add("学生成绩", rseList); var exportColumns = Tool.GetPropertyNames(); var excelBytes = Tool.ExportToExcel(disList, exportColumns); Response.Headers.Add("Content-Disposition", "attachment; filename=ExportedData.xlsx"); Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; return File(excelBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"学生成绩{DateTime.Now.ToString("yyyyMMddHHmmss")}"); } [HttpGet(nameof(ExportSummaryOfGrades))] public async Task ExportSummaryOfGrades(StudentsTestDataListParam paramDto) { var records = await _sportsTestResultService.GetStudentsTestDataList(paramDto); var rows = records.Select((row, index) => new SummaryOfGradesTestRecordExportModel { Index = index + 1, GradeAndClass = string.Join("-", new[] { row.GradeName, row.ClassName } .Where(x => !string.IsNullOrWhiteSpace(x))), StudentName = row.StudentName, StudentNo = row.StudentNo, Sex = row.Sex, CategoryName = row.CategoryName, TestResult = FormatTestResult(row), Score = row.Score, Rank = row.Rank, ClassRank = row.ClassRank, ScoreTime = row.ScoreTime.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture) }).ToList(); var columns = new List { nameof(SummaryOfGradesTestRecordExportModel.Index), nameof(SummaryOfGradesTestRecordExportModel.GradeAndClass), nameof(SummaryOfGradesTestRecordExportModel.StudentName), nameof(SummaryOfGradesTestRecordExportModel.StudentNo), nameof(SummaryOfGradesTestRecordExportModel.Sex), nameof(SummaryOfGradesTestRecordExportModel.CategoryName), nameof(SummaryOfGradesTestRecordExportModel.TestResult), nameof(SummaryOfGradesTestRecordExportModel.Score), nameof(SummaryOfGradesTestRecordExportModel.Rank), nameof(SummaryOfGradesTestRecordExportModel.ClassRank), nameof(SummaryOfGradesTestRecordExportModel.ScoreTime) }; var bytes = Tool.ExportToExcel( new Dictionary> { ["体测数据记录"] = rows }, columns, autoFitColumns: false); return File(bytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"体测数据记录{DateTime.Now:yyyyMMddHHmmss}.xlsx"); } private static string FormatTestResult(StudentsTestDataModel row) { if (row.CategoryValue != 10 && row.CategoryValue != 11) return row.Value.ToString("0.##", CultureInfo.InvariantCulture); // Some historical imports contain millisecond values despite the seconds-based category unit. var seconds = row.Value >= 10000 ? row.Value / 1000d : row.Value; var totalSeconds = (int)Math.Round(Math.Max(0, seconds), MidpointRounding.AwayFromZero); return $"{totalSeconds / 60}分{totalSeconds % 60:D2}秒"; } /// /// 新增 /// /// /// [HttpPost(nameof(Add))] public async Task Add([FromBody] List paramDto) { await _sportsTestResultService.AddStudentsTestData(paramDto); return Ok("新增成功"); } /// /// 更新 /// /// /// [HttpPost(nameof(Modify))] public async Task Modify([FromBody] List paramDto) { await _sportsTestResultService.ModifyStudentsTestData(paramDto); return Ok("更新成功"); } /// /// 删除 /// /// /// [HttpPost(nameof(Delete))] public async Task Delete(List ids) { await _sportsTestResultService.DeleteStudentsTestData(ids); return Ok("更新成功"); } } }