using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using YD_YiLu.Api.Services.Interface; using YD_YiLu.Commons.Dto.DeviceSync; namespace YD_YiLu.Api.Controllers { /// /// 壹动站/壹体屏/活力课间屏 设备同步 HTTP 接口(小站登录与心跳见 WebSocket:/ws/camera/device) /// [AllowAnonymous] public class DeviceSyncController : ControllerBase { private readonly IDeviceSyncService _deviceSyncService; private readonly ILogger _logger; public DeviceSyncController(IDeviceSyncService deviceSyncService, ILogger logger) { _deviceSyncService = deviceSyncService; _logger = logger; } /// /// 人员拉取(全量,与 user_page 共用服务逻辑;活力课间屏) /// [HttpPost] [Route("/device/sync/user")] public async Task UserPullFull([FromBody] DeviceSyncUserRequestDto dto) { return await _deviceSyncService.UserSyncAsync(dto.DeviceSerial, dto.DeviceType, dto.UserType); } /// /// 人员分页下发(壹动站/壹体屏;弃用的 user_trace 请改用本接口) /// [HttpPost] [Route("/device/sync/user_page")] public async Task UserPullPage([FromBody] DeviceSyncUserPageRequestDto dto) { if (dto.PageSize <= 0 && !dto.FullSync) dto.PageSize = 10; if (dto.PageIndex < 1) dto.PageIndex = 1; var res = await _deviceSyncService.UserPageAsync(dto); return res; } /// /// 弃用地址别名:device/sync/user_trace → 与 user_page 相同 /// [HttpPost] [Route("/device/sync/user_trace")] public Task UserTrace([FromBody] DeviceSyncUserPageRequestDto dto) => UserPullPage(dto); /// /// 获取人员详情(壹动站协议) /// [HttpGet] [Route("/device/sync/user/detail")] public async Task UserDetail([FromQuery] string deviceSerial, [FromQuery] int userId) { return await _deviceSyncService.GetUserDetailAsync(deviceSerial, userId); } /// /// 组织信息下发 /// [HttpPost] [Route("/device/sync/organization")] public async Task Organization([FromBody] DeviceSyncOrganizationRequestDto dto) { return await _deviceSyncService.OrganizationAsync(dto); } /// /// 人员上次成绩(按人员序列号批量) /// [HttpPost] [Route("/device/sync/grade/last_grade")] public async Task LastGrade([FromBody] DeviceSyncLastGradeRequestDto dto) { if (dto == null || string.IsNullOrWhiteSpace(dto.DeviceSerial)) return new List(); return await _deviceSyncService.LastGradeAsync(dto); } /// /// 成绩批量上报 /// [HttpPost] [Route("/device/sync/train_push")] public async Task TrainPush([FromBody] List list) { var rawBody = HttpContext.Items["TrainPushRawBody"] as string; _logger.LogInformation( "TrainPush model binding result. RawBodyLength: {RawBodyLength}, MappedCount: {MappedCount}, Body: {RawBody}", rawBody?.Length ?? 0, list?.Count ?? 0, rawBody); var res = await _deviceSyncService.TrainPushAsync(list); return res; } /// /// 获取训练详情 /// [HttpGet] [Route("/device/sync/train/details")] public async Task TrainDetails([FromQuery] int trainId) { var res = await _deviceSyncService.TrainDetailsAsync(trainId); return res; } /// /// 个人成绩排行榜 /// [HttpPost] [Route("/device/sync/grade/order")] public async Task GradeOrder([FromBody] DeviceSyncGradeOrderRequestDto dto) { var res = await _deviceSyncService.GradeOrderAsync(dto); return res; } /// /// 查询运动记录 /// [HttpPost] [Route("/device/sync/grade/record")] public async Task RecordApp([FromBody] DeviceSyncRecordAppRequestDto dto) { var res = await _deviceSyncService.RecordAppAsync(dto); return res; } /// /// 查询我的运动 /// [HttpPost] [Route("/device/sync/grade/my_record")] public async Task MyRecord([FromBody] DeviceSyncMyRecordRequestDto dto) { var res = await _deviceSyncService.MyRecordAsync(dto); return res; } /// /// 视频回放上传 /// /// /// [HttpPost("device/sync/video/upload")] public async Task UploadVideo([FromForm] DeviceVideoUploadRequestDto dto) { var res = await _deviceSyncService.DeviceVideoUploadAsync(dto); return res; } } }