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);
}
}
}
}