You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

399 lines
12 KiB
C#

using System.ComponentModel;
using System.Reflection;
using DS.Module.Core.Data;
using DS.Module.Core.Extensions;
using Microsoft.AspNetCore.Http;
using SqlSugar;
namespace DS.Module.Core;
/// <summary>
/// 业务操作结果信息类,对操作结果进行封装
/// </summary>
public class DataResult : DataResult<object>
{
static DataResult()
{
Success = new DataResult(ResultCode.Success);
NoChanged = new DataResult(ResultCode.NoChanged);
}
/// <summary>
/// 初始化一个<see cref="DataResult"/>类型的新实例
/// </summary>
public DataResult() : this(ResultCode.NoChanged)
{
}
/// <summary>
/// 初始化一个<see cref="DataResult"/>类型的新实例
/// </summary>
public DataResult(ResultCode resultType) : this(resultType, null, null)
{
}
/// <summary>
/// 初始化一个<see cref="DataResult"/>类型的新实例
/// </summary>
public DataResult(ResultCode resultType, string message, string multiCode = "") : this(resultType, message, null, multiCode)
{
}
/// <summary>
/// 初始化一个<see cref="DataResult"/>类型的新实例
/// </summary>
public DataResult(ResultCode type, string message, object data, string multiCode = "") : base(type, message, data, multiCode)
{
}
/// <summary>
/// 获取 成功的操作结果
/// </summary>
public static DataResult Success { get; private set; }
/// <summary>
/// 获取 未变更的操作结果
/// </summary>
public new static DataResult NoChanged { get; private set; }
/// <summary>
/// 将<see cref="DataResult{TData}"/>转换为<see cref="DataResult"/>
/// </summary>
/// <returns></returns>
public DataResult<T> ToDataResult<T>()
{
T data = default(T);
if (Data is T variable)
{
data = variable;
}
return new DataResult<T>(ResultCode.Success, Message, data);
}
/// <summary>
/// 返回成功的结果
/// </summary>
/// <param name="message">消息</param>
/// <param name="data">结果</param>
/// <returns></returns>
public static DataResult Successed(string message, object data, string multiCode = "")
{
return new DataResult(ResultCode.Success, message, data, multiCode);
}
public static DataResult Successed(string message, string multiCode = "")
{
return new DataResult(ResultCode.Success, message, multiCode);
}
public static DataResult SuccessedWithDesc(string fieldName)
{
var fieldInfo = typeof(MultiLanguageConst).GetField(fieldName) ?? throw new ArgumentException($"不存在的常量:{fieldName}", fieldName);
var attribute = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
var desc = attribute?.Description ?? string.Empty;
var value = fieldInfo.GetValue(null) as string ?? string.Empty;
return Successed(desc, value);
}
/// <summary>
/// 其他操作
/// </summary>
/// <param name="message"></param>
/// <param name="multiCode"></param>
/// <returns></returns>
public static DataResult Other(string message, string multiCode = "")
{
return new DataResult(ResultCode.Other, message, null, multiCode);
}
/// <summary>
/// 返回失败的结果
/// </summary>
/// <param name="message">消息</param>
/// <param name="multiCode"></param>
/// <returns></returns>
public static DataResult Failed(string message, string multiCode = "")
{
return new DataResult(ResultCode.Error, message, multiCode);
}
/// <summary>
/// 返回失败的结果-带占位符
/// </summary>
/// <param name="db">数据库db</param>
/// <param name="accessor">IHttpContextAccessor</param>
/// <param name="multiCode">多语言代码</param>
/// <param name="placeholde1">占位符1</param>
/// <param name="placeholde2">占位符2</param>
/// <param name="placeholde3">占位符3</param>
/// <param name="placeholde4">占位符4</param>
/// <param name="placeholde5">占位符5</param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public static DataResult FailedWithPlaceholder(ISqlSugarClient db, IHttpContextAccessor accessor, string multiCode, string placeholde1 = "", string placeholde2 = "", string placeholde3 = "", string placeholde4 = "", string placeholde5 = "")
{
var desc = string.Empty;
var language = accessor.HttpContext.Request.Headers["LanguageType"].FirstOrDefault();
if (language.IsNullOrEmpty())
{
language = "CN";
}
language = language.ToUpper();
var result = string.Empty;
var setInfo = db.Queryable<SysLanguageSet>().Where(x => x.MultiCode == multiCode && x.LanguageType == language && x.IsPlaceholder == true)
.First();
if (setInfo.IsNotNull())
{
desc = setInfo.Content;
}
else
{
if (language == "CN")
{
var fieldInfo = typeof(MultiLanguageConst).GetField(nameof(multiCode));
var attribute = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
desc = attribute?.Description ?? string.Empty;
}
else
{
throw new Exception($"未设置多语言:" + language + "下的消息提示代码:" + multiCode);
}
}
return new DataResult(ResultCode.Error, string.Format(desc, placeholde1, placeholde2, placeholde3, placeholde4, placeholde5), multiCode);
}
/// <summary>
/// 返回失败的结果
/// </summary>
/// <param name="fieldName">类<see cref="MultiLanguageConst"/>中配置的字符串常量名</param>
/// <returns></returns>
public static DataResult FailedWithDesc(string fieldName)
{
var fieldInfo = typeof(MultiLanguageConst).GetField(fieldName) ?? throw new ArgumentException($"不存在的常量:{fieldName}", fieldName);
var attribute = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
var desc = attribute?.Description ?? string.Empty;
var value = fieldInfo.GetValue(null) as string ?? string.Empty;
return Failed(desc, value);
}
}
public class DataResult<TData> : IDataResult<ResultCode, TData>
{
static DataResult()
{
NoChanged = new DataResult<TData>(ResultCode.NoChanged);
}
/// <summary>
/// 初始化一个<see cref="DataResult"/>类型的新实例
/// </summary>
public DataResult() : this(ResultCode.NoChanged)
{
}
/// <summary>
/// 初始化一个<see cref="DataResult{TData}"/>类型的新实例
/// </summary>
public DataResult(ResultCode resultType) : this(resultType, null, default(TData))
{
}
/// <summary>
/// 初始化一个<see cref="DataResult{TData}"/>类型的新实例
/// </summary>
public DataResult(ResultCode resultType, string message) : this(resultType, message, default(TData))
{
}
/// <summary>
/// 初始化一个<see cref="DataResult{TResultType,TData}"/>类型的新实例
/// </summary>
public DataResult(ResultCode type, string message, TData? data, string multiCode = "", int count = 0)
{
if (message == null)
{
message = (type as Enum)?.EnumDescription();
}
Code = type;
MultiCode = multiCode;
_message = message;
Data = data;
Count = count;
}
public DataResult(ResultCode type, string message, string multiCode = "")
{
if (message == null)
{
message = (type as Enum)?.EnumDescription();
}
Code = type;
MultiCode = multiCode;
_message = message;
}
/// <summary>
/// 结果码
/// </summary>
public ResultCode Code { get; set; }
private string _message;
/// <summary>
/// 多语言代码
/// </summary>
public string MultiCode { get; set; }
/// <summary>
/// 总记录数
/// </summary>
public int Count { get; set; }
/// <summary>
/// 获取 未变更的操作结果
/// </summary>
public virtual string Message
{
get => _message ?? Code.EnumDescription();
set => _message = value;
}
/// <summary>
/// 获取 未变更的操作结果
/// </summary>
public static DataResult<TData> NoChanged { get; private set; }
/// <summary>
/// 获取 是否成功
/// </summary>
public bool Succeeded => Code == ResultCode.Success;
/// <summary>
/// 数据
/// </summary>
public TData? Data { get; set; }
/// <summary>
/// 附加数据
/// </summary>
public Dictionary<string, object>? AdditionalData { get; set; }
/// <summary>
/// 返回成功的结果
/// </summary>
/// <param name="message">消息</param>
/// <param name="data">结果</param>
/// <param name="multiCode"></param>
/// <returns></returns>
public static DataResult<TData> Success(string message, TData data, string multiCode = "")
{
return new DataResult<TData>(ResultCode.Success, message, data, multiCode);
}
/// <summary>
/// 返回成功的结果
/// </summary>
/// <param name="message"></param>
/// <param name="multiCode"></param>
/// <returns></returns>
public static DataResult<TData> SuccessMsg(string message, string multiCode = "")
{
return new DataResult<TData>(ResultCode.Success, message, default(TData), multiCode);
}
/// <summary>
/// 返回成功的结果
/// </summary>
/// <param name="data">结果</param>
/// <param name="multiCode"></param>
/// <returns></returns>
public static DataResult<TData> Success(TData data, string multiCode = "")
{
return new DataResult<TData>(ResultCode.Success, string.Empty, data, multiCode);
}
/// <summary>
///
/// </summary>
/// <param name="message"></param>
/// <param name="multiCode"></param>
/// <returns></returns>
public static DataResult<TData> Failed(string message, string multiCode = "")
{
return new DataResult<TData>(ResultCode.Error, message, multiCode);
}
/// <summary>
/// 返回失败的结果
/// </summary>
/// <param name="fieldName">类<see cref="MultiLanguageConst"/>中配置的字符串常量名</param>
/// <returns></returns>
public static DataResult<TData> FailedWithDesc(string fieldName)
{
var fieldInfo = typeof(MultiLanguageConst).GetField(fieldName) ?? throw new ArgumentException($"不存在的常量:{fieldName}", fieldName);
var attribute = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
var desc = attribute?.Description ?? string.Empty;
var value = fieldInfo.GetValue(null) as string ?? string.Empty;
return Failed(desc, value);
}
/// <summary>
///
/// </summary>
/// <param name="message"></param>
/// <param name="multiCode"></param>
/// <returns></returns>
public static DataResult<TData> FailedData(TData data, string message = "", string multiCode = "")
{
return new DataResult<TData>(ResultCode.Error, message, data, multiCode);
}
///// <summary>
/////
///// </summary>
///// <param name="message"></param>
///// <param name="ResultCode"></param>
///// <param name="multiCode"></param>
///// <returns></returns>
//public static DataResult<TData> Failed(string message, ResultCode ResultCode = ResultCode.Error,string multiCode ="")
//{
// return new DataResult<TData>(ResultCode, message,multiCode);
//}
/// <summary>
///
/// </summary>
/// <param name="count"></param>
/// <param name="data"></param>
/// <param name="multiCode">多语言代码</param>
/// <returns></returns>
public static DataResult<TData> PageList(int count, TData data, string multiCode = "")
{
return new DataResult<TData>(ResultCode.Success, string.Empty, data, multiCode, count);
}
/// <summary>
///
/// </summary>
/// <param name="message"></param>
/// <param name="multiCode"></param>
/// <returns></returns>
public static DataResult<TData> Error(string message, string multiCode = "")
{
return new DataResult<TData>(ResultCode.Error, message, default(TData), multiCode);
}
/// <summary>
/// 异常的DataResult
/// </summary>
public static DataResult<TData> Exception()
{
return new DataResult<TData>(ResultCode.Error, "程序异常,请联系管理员!", MultiLanguageConst.ProgramException);
}
}