TellmeRevitPluging/Common/Extensions.cs
2025-12-09 17:43:30 +08:00

230 lines
7.9 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using RevitHttpControl.Models;
namespace RevitHttpControl.Common
{
/// <summary>
/// 扩展方法类
/// </summary>
public static class Extensions
{
/// <summary>
/// 创建成功响应
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="controller">控制器实例</param>
/// <param name="data">响应数据</param>
/// <param name="message">响应消息</param>
/// <param name="statusCode">HTTP状态码</param>
/// <returns>HTTP响应消息</returns>
public static HttpResponseMessage CreateSuccessResponse<T>(this ApiController controller, T data,
string message = "操作成功", HttpStatusCode statusCode = HttpStatusCode.OK)
{
var response = new ApiResponse<T>
{
Success = true,
Code = (int)statusCode,
Message = message,
Data = data
};
return controller.Request.CreateResponse(statusCode, response);
}
/// <summary>
/// 创建错误响应
/// </summary>
/// <param name="controller">控制器实例</param>
/// <param name="errorCode">错误码</param>
/// <param name="message">错误消息</param>
/// <param name="statusCode">HTTP状态码</param>
/// <param name="errorDescription">详细错误描述</param>
/// <returns>HTTP响应消息</returns>
public static HttpResponseMessage CreateErrorResponse(this ApiController controller, string errorCode,
string message, HttpStatusCode statusCode = HttpStatusCode.InternalServerError,
string errorDescription = null)
{
var errorData = new
{
error = errorCode,
errorDescription = errorDescription
};
var response = new ApiResponse<object>
{
Success = false,
Code = (int)statusCode,
Message = message,
Data = errorData
};
return controller.Request.CreateResponse(statusCode, response);
}
/// <summary>
/// 创建验证错误响应
/// </summary>
/// <param name="controller">控制器实例</param>
/// <param name="message">验证错误消息</param>
/// <returns>HTTP响应消息</returns>
public static HttpResponseMessage CreateValidationErrorResponse(this ApiController controller, string message)
{
return controller.CreateErrorResponse(ErrorCodes.INVALID_REQUEST, message, HttpStatusCode.BadRequest);
}
/// <summary>
/// 创建未找到错误响应
/// </summary>
/// <param name="controller">控制器实例</param>
/// <param name="resourceName">资源名称</param>
/// <returns>HTTP响应消息</returns>
public static HttpResponseMessage CreateNotFoundResponse(this ApiController controller, string resourceName = "资源")
{
return controller.CreateErrorResponse(ErrorCodes.TASK_NOT_FOUND, $"{resourceName}不存在", HttpStatusCode.NotFound);
}
/// <summary>
/// 创建异步任务响应
/// </summary>
/// <param name="controller">控制器实例</param>
/// <param name="taskId">任务ID</param>
/// <param name="message">响应消息</param>
/// <returns>HTTP响应消息</returns>
public static HttpResponseMessage CreateAsyncTaskResponse(this ApiController controller, Guid taskId,
string message = "异步任务已创建")
{
var asyncResponse = new AsyncOperationResponse
{
TaskId = taskId,
StatusUrl = $"/api/task/{taskId}"
};
return controller.CreateSuccessResponse(asyncResponse, message, HttpStatusCode.Accepted);
}
/// <summary>
/// 验证是否为空或空字符串
/// </summary>
/// <param name="value">字符串值</param>
/// <returns>是否为空</returns>
public static bool IsNullOrWhiteSpace(this string value)
{
return string.IsNullOrWhiteSpace(value);
}
/// <summary>
/// 安全获取文件名
/// </summary>
/// <param name="filePath">文件路径</param>
/// <returns>文件名</returns>
public static string SafeGetFileName(this string filePath)
{
try
{
return System.IO.Path.GetFileName(filePath);
}
catch
{
return filePath;
}
}
/// <summary>
/// 任务状态转换为中文描述
/// </summary>
/// <param name="status">任务状态</param>
/// <returns>中文描述</returns>
public static string ToChineseDescription(this TaskStatus status)
{
switch (status)
{
case TaskStatus.Pending:
return "等待中";
case TaskStatus.Running:
return "运行中";
case TaskStatus.Completed:
return "已完成";
case TaskStatus.Failed:
return "失败";
case TaskStatus.Cancelled:
return "已取消";
default:
return "未知状态";
}
}
/// <summary>
/// 统计类型转换为中文描述
/// </summary>
/// <param name="type">统计类型</param>
/// <returns>中文描述</returns>
public static string ToChineseDescription(this StatsType type)
{
switch (type)
{
case StatsType.Wall:
return "墙";
case StatsType.Door:
return "门";
case StatsType.Window:
return "窗";
case StatsType.Floor:
return "楼板";
case StatsType.Ceiling:
return "天花板";
case StatsType.Roof:
return "屋顶";
case StatsType.Column:
return "柱";
case StatsType.Beam:
return "梁";
case StatsType.Furniture:
return "家具";
case StatsType.Room:
return "房间";
default:
return "未知类型";
}
}
/// <summary>
/// 验证 GUID 是否有效
/// </summary>
/// <param name="guid">GUID值</param>
/// <returns>是否有效</returns>
public static bool IsValidGuid(this Guid guid)
{
return guid != Guid.Empty;
}
/// <summary>
/// 安全转换为 DateTimeUTC
/// </summary>
/// <param name="dateTime">本地时间</param>
/// <returns>UTC时间</returns>
public static DateTime ToUtcSafe(this DateTime dateTime)
{
return dateTime.Kind == DateTimeKind.Utc ? dateTime : dateTime.ToUniversalTime();
}
/// <summary>
/// 格式化文件大小
/// </summary>
/// <param name="bytes">字节数</param>
/// <returns>格式化后的文件大小</returns>
public static string FormatFileSize(this long bytes)
{
if (bytes < 1024)
return $"{bytes} B";
if (bytes < 1024 * 1024)
return $"{bytes / 1024:F1} KB";
if (bytes < 1024 * 1024 * 1024)
return $"{bytes / (1024 * 1024):F1} MB";
return $"{bytes / (1024 * 1024 * 1024):F1} GB";
}
}
}