TellmeRevitPluging/Controllers/StatsController.cs

157 lines
5.4 KiB
C#

using System;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using RevitHttpControl.Models;
using RevitHttpControl.Services;
namespace RevitHttpControl.Controllers
{
/// <summary>
/// 统计功能控制器
/// </summary>
[RoutePrefix("api/stats")]
public class StatsController : ApiController
{
/// <summary>
/// 同步获取统计数据
/// </summary>
/// <param name="request">统计请求</param>
/// <returns>同步统计响应</returns>
[HttpPost]
[Route("sync")]
public HttpResponseMessage GetSyncStats([FromBody] StatsRequest request)
{
try
{
// 参数验证
if (request == null)
{
var badRequestResponse = new ApiResponse<object>
{
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<SyncStatsResponse>
{
Success = true,
Code = 200,
Message = "统计数据获取成功",
Data = statsResponse
};
return Request.CreateResponse(HttpStatusCode.OK, successResponse);
}
catch (ArgumentException ex)
{
var badRequestResponse = new ApiResponse<object>
{
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<object>
{
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<object>
{
Success = false,
Code = 500,
Message = "获取统计数据时发生错误",
Data = new
{
error = "INTERNAL_ERROR",
errorDescription = ex.Message
}
};
return Request.CreateResponse(HttpStatusCode.InternalServerError, errorResponse);
}
}
/// <summary>
/// 异步获取统计数据
/// </summary>
/// <param name="request">统计请求</param>
/// <returns>异步统计响应</returns>
[HttpPost]
[Route("async")]
public HttpResponseMessage GetAsyncStats([FromBody] StatsRequest request)
{
try
{
// 参数验证
if (request == null)
{
var badRequestResponse = new ApiResponse<object>
{
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<AsyncStatsResponse>
{
Success = true,
Code = 202,
Message = "统计任务已创建",
Data = asyncResponse
};
return Request.CreateResponse(HttpStatusCode.Accepted, successResponse);
}
catch (Exception ex)
{
var errorResponse = new ApiResponse<object>
{
Success = false,
Code = 500,
Message = "创建统计任务失败",
Data = new
{
error = "INTERNAL_ERROR",
errorDescription = ex.Message
}
};
return Request.CreateResponse(HttpStatusCode.InternalServerError, errorResponse);
}
}
}
}