157 lines
5.4 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|