using System; using System.Net; using System.Net.Http; using System.Web.Http; using RevitHttpControl.Models; using RevitHttpControl.Services; namespace RevitHttpControl.Controllers { /// /// 统计功能控制器 /// [RoutePrefix("api/stats")] public class StatsController : ApiController { /// /// 同步获取统计数据 /// /// 统计请求 /// 同步统计响应 [HttpPost] [Route("sync")] public HttpResponseMessage GetSyncStats([FromBody] StatsRequest request) { try { // 参数验证 if (request == null) { var badRequestResponse = new ApiResponse { Success = false, Code = 400, Message = "请求参数不能为空", Data = new { error = "INVALID_REQUEST" } }; return Request.CreateResponse(HttpStatusCode.BadRequest, badRequestResponse); } // 同步获取统计数据 var statsResponse = RevitService.GetElementStatsDetail(request.Type); var successResponse = new ApiResponse { Success = true, Code = 200, Message = "统计数据获取成功", Data = statsResponse }; return Request.CreateResponse(HttpStatusCode.OK, successResponse); } catch (ArgumentException ex) { var badRequestResponse = new ApiResponse { Success = false, Code = 400, Message = ex.Message, Data = new { error = "INVALID_STATS_TYPE" } }; return Request.CreateResponse(HttpStatusCode.BadRequest, badRequestResponse); } catch (InvalidOperationException ex) { var errorResponse = new ApiResponse { Success = false, Code = 409, Message = ex.Message, Data = new { error = "NO_DOCUMENT_OPEN" } }; return Request.CreateResponse(HttpStatusCode.Conflict, errorResponse); } catch (Exception ex) { var errorResponse = new ApiResponse { Success = false, Code = 500, Message = "获取统计数据时发生错误", Data = new { error = "INTERNAL_ERROR", errorDescription = ex.Message } }; return Request.CreateResponse(HttpStatusCode.InternalServerError, errorResponse); } } /// /// 异步获取统计数据 /// /// 统计请求 /// 异步统计响应 [HttpPost] [Route("async")] public HttpResponseMessage GetAsyncStats([FromBody] StatsRequest request) { try { // 参数验证 if (request == null) { var badRequestResponse = new ApiResponse { Success = false, Code = 400, Message = "请求参数不能为空", Data = new { error = "INVALID_REQUEST" } }; return Request.CreateResponse(HttpStatusCode.BadRequest, badRequestResponse); } // 创建异步任务 var taskId = TaskManager.Instance.CreateTask(request.ExecutionId); TaskManager.Instance.SetTaskRunning(taskId); // 异步执行统计操作 RevitService.GetElementCountAsync(request.Type, taskId, TaskManager.Instance); var asyncResponse = new AsyncStatsResponse { TaskId = taskId, StatusUrl = $"/api/task/{taskId}" }; var successResponse = new ApiResponse { Success = true, Code = 202, Message = "统计任务已创建", Data = asyncResponse }; return Request.CreateResponse(HttpStatusCode.Accepted, successResponse); } catch (Exception ex) { var errorResponse = new ApiResponse { Success = false, Code = 500, Message = "创建统计任务失败", Data = new { error = "INTERNAL_ERROR", errorDescription = ex.Message } }; return Request.CreateResponse(HttpStatusCode.InternalServerError, errorResponse); } } } }