ltx 48151578a1 feat: 运动馆班级批量删除与菜单权限登记
新增 SportsHall/BatchDeleteClasses 接口:校验批量数量、本校运动馆班级归属及空班条件,在可串行化事务中清理班级和教练关联,并发送物联网删除同步。

学生批量删除增加 BatchDelete 动作权限校验;按实际页面菜单匹配权限,兼容生产库中重复的学生管理菜单。运动馆班级删除由已授权角色使用,不硬编码学校角色。

新增幂等菜单权限脚本,仅向学生管理和运动馆班级管理的有效页面菜单登记批量删除动作,不自动给角色授权。QA 与生产库已核验菜单动作;代码上线仍需独立部署。

验证:Debug/Release 构建通过,SQL 在 QA 重跑无重复写入。
2026-10-15 14:51:56 +08:00

142 lines
4.8 KiB
C#

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using VOL.Business.IServices.School;
using VOL.Business.IServices.SportsHall;
using VOL.Business.Services.School;
using VOL.Core.Filters;
using VOL.Model;
using VOL.Model.School.Request;
using VOL.Model.School.Response;
using VOL.Model.SportsHall;
namespace VOL.WebApi.Controllers.SportsHall
{
[Route("api/[controller]")]
[ApiController]
[ApiExplorerSettings(GroupName = "v3")]
[TypeFilter(typeof(CustomApiResponseFilter))]
public class SportsHallController : ControllerBase
{
#region 初始化
private readonly ISportsHallService _sportsHallService;
public SportsHallController(
ISportsHallService sportsHallService)
{
_sportsHallService = sportsHallService;
}
#endregion
/// <summary>
/// 新增
/// </summary>
/// <param name="paramDto"></param>
/// <returns></returns>
[HttpPost(nameof(AddClass))]
public async Task<ActionResult> AddClass([FromBody] AddSportsHallClassParam paramDto)
{
await _sportsHallService.AddClass(paramDto);
return Ok("新增成功");
}
/// <summary>
/// 更新
/// </summary>
/// <param name="paramDto"></param>
/// <returns></returns>
[HttpPost(nameof(ModifyClass))]
public async Task<ActionResult> ModifyClass([FromBody] ModifySportsHallClassParam paramDto)
{
await _sportsHallService.ModifyClass(paramDto);
return Ok("更新成功");
}
/// <summary>
/// 批量删除当前学校的运动馆空班级
/// </summary>
[HttpPost(nameof(BatchDeleteClasses))]
public async Task<ActionResult> BatchDeleteClasses([FromBody] List<int> ids)
{
var deletedCount = await _sportsHallService.BatchDeleteClasses(ids);
return Ok($"成功删除{deletedCount}个班级");
}
/// <summary>
/// 导入运动馆学生体测数据
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
[HttpPost(nameof(SportsHallImportStudentsTestData))]
public async Task<ActionResult> SportsHallImportStudentsTestData(IFormFile file)
{
await _sportsHallService.SportsHallImportStudentsTestData(file);
return Ok("导入成功");
}
/// <summary>
/// 导入体测成绩管理学生体测数据
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
[HttpPost(nameof(SummaryOfGradesImportStudentsTestData))]
public async Task<ActionResult> SummaryOfGradesImportStudentsTestData(IFormFile file)
{
await _sportsHallService.SummaryOfGradesImportStudentsTestData(file);
return Ok("导入成功");
}
/// <summary>
/// 运动馆体测成绩分页列表
/// </summary>
/// <param name="paramDto"></param>
/// <returns></returns>
[HttpGet(nameof(GetSportsHallStudentsTestPageList))]
public async Task<PageDataDto<SportsHallStudentsTestModel>> GetSportsHallStudentsTestPageList(SportsHallStudentsTestParam paramDto)
{
return await _sportsHallService.GetSportsHallStudentsTestPageList(paramDto);
}
/// <summary>
/// 体测成绩管理分页列表(全部体测项目)
/// </summary>
/// <param name="paramDto"></param>
/// <returns></returns>
[HttpGet(nameof(GetSummaryOfGradesStudentsTestPageList))]
public async Task<PageDataDto<SummaryOfGradesStudentsTestModel>> GetSummaryOfGradesStudentsTestPageList(SportsHallStudentsTestParam paramDto)
{
return await _sportsHallService.GetSummaryOfGradesStudentsTestPageList(paramDto);
}
/// <summary>
/// 成绩推送
/// </summary>
/// <param name="paramDto"></param>
/// <returns></returns>
[HttpPost(nameof(ScorePush))]
public async Task<ActionResult> ScorePush([FromBody] SportsHallStudentsTestParam paramDto)
{
await _sportsHallService.ScorePush(paramDto);
return Ok("推送成功");
}
/// <summary>
/// 成绩修正
/// </summary>
/// <param name="paramDto"></param>
/// <returns></returns>
[HttpPost(nameof(ScoreUpdate))]
public async Task<ActionResult> ScoreUpdate([FromBody] SportsHallStudentsTestDataUpdateParam paramDto)
{
await _sportsHallService.ScoreUpdate(paramDto);
return Ok("更新成功");
}
}
}