230 lines
7.9 KiB
C#
230 lines
7.9 KiB
C#
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>
|
||
/// 安全转换为 DateTime(UTC)
|
||
/// </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";
|
||
}
|
||
}
|
||
}
|