using OASystem.Domain.ViewModels.Financial;
using OASystem.Domain.ViewModels.Groups;
using System.Reflection.Metadata;
namespace OASystem.Infrastructure.Tools;
///
/// 工具类
///
public static class CommonFun
{
public static string GUID => Guid.NewGuid().ToString("N");
public static bool IsNull(this string s)
{
return string.IsNullOrWhiteSpace(s);
}
public static bool NotNull(this string s)
{
return !string.IsNullOrWhiteSpace(s);
}
public static int GetRandom(int minNum, int maxNum)
{
var seed = BitConverter.ToInt32(Guid.NewGuid().ToByteArray(), 0);
return new Random(seed).Next(minNum, maxNum);
}
public static string GetSerialNumber(string prefix = "")
{
return prefix + DateTime.Now.ToString("yyyyMMddHHmmssfff") + GetRandom(1000, 9999).ToString();
}
public static string ToJson(this object obj)
{
return JsonSerializer.Serialize(obj);
}
public static T ToObject(this string json)
{
return JsonSerializer.Deserialize(json);
}
public static object GetDefaultVal(string typename)
{
return typename switch
{
"Boolean" => false,
"DateTime" => default(DateTime),
"Date" => default(DateTime),
"Double" => 0.0,
"Single" => 0f,
"Int32" => 0,
"String" => string.Empty,
"Decimal" => 0m,
_ => null,
};
}
public static void CoverNull(T model) where T : class
{
if (model == null)
{
return;
}
var typeFromHandle = typeof(T);
var properties = typeFromHandle.GetProperties();
var array = properties;
for (var i = 0; i < array.Length; i++)
{
var propertyInfo = array[i];
if (propertyInfo.GetValue(model, null) == null)
{
propertyInfo.SetValue(model, GetDefaultVal(propertyInfo.PropertyType.Name), null);
}
}
}
public static void CoverNull(List models) where T : class
{
if (models.Count == 0)
{
return;
}
foreach (var model in models)
{
CoverNull(model);
}
}
public static bool ToBool(this object thisValue, bool errorvalue = false)
{
if (thisValue != null && thisValue != DBNull.Value && bool.TryParse(thisValue.ToString(), out bool reval))
{
return reval;
}
return errorvalue;
}
#region 文件操作
public static FileInfo[] GetFiles(string directoryPath)
{
if (!IsExistDirectory(directoryPath))
{
throw new DirectoryNotFoundException();
}
var root = new DirectoryInfo(directoryPath);
return root.GetFiles();
}
public static bool IsExistDirectory(string directoryPath)
{
return Directory.Exists(directoryPath);
}
public static string ReadFile(string Path)
{
string s;
if (!File.Exists(Path))
s = "不存在相应的目录";
else
{
var f2 = new StreamReader(Path, Encoding.Default);
s = f2.ReadToEnd();
f2.Close();
f2.Dispose();
}
return s;
}
public static void FileMove(string OrignFile, string NewFile)
{
File.Move(OrignFile, NewFile);
}
public static void CreateDir(string dir)
{
if (dir.Length == 0) return;
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
}
#endregion
#region IP
///
/// 是否为ip
///
///
///
public static bool IsIP(string ip)
{
return Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
}
public static string GetIP(HttpRequest request)
{
if (request == null)
{
return "";
}
var ip = request.Headers["X-Real-IP"].FirstOrDefault();
if (ip.IsNull())
{
ip = request.Headers["X-Forwarded-For"].FirstOrDefault();
}
if (ip.IsNull())
{
ip = request.HttpContext?.Connection?.RemoteIpAddress?.ToString();
}
if (ip.IsNull() || !IsIP(ip))
{
ip = "127.0.0.1";
}
return ip;
}
#endregion
#region 随机数
///
/// 根据自定义随机包含的字符获取指定长度的随机字符
///
/// 随机字符长度
/// 随机字符
public static string GetRandomStr(int length)
{
string a = "ABCDEFGHJKLMNPQRSTUVWXYZ012356789";
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++)
{
sb.Append(a[new Random(Guid.NewGuid().GetHashCode()).Next(0, a.Length - 1)]);
}
return sb.ToString();
}
///
/// 根据自定义随机包含的字符获取指定长度的随机字符
///
/// 随机字符长度
/// 随机字符
public static string GetRandomAllStr(int length)
{
string a = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjklmnpqrstuvwxyz012356789";
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++)
{
sb.Append(a[new Random(Guid.NewGuid().GetHashCode()).Next(0, a.Length - 1)]);
}
return sb.ToString();
}
#endregion
#region decimal 截取
///
///
///
///
///
///
public static decimal CutDecimalWithN(decimal d, int n)
{
string strDecimal = d.ToString();
int index = strDecimal.IndexOf(".");
if (index == -1 || strDecimal.Length < index + n + 1)
{
strDecimal = string.Format("{0:F" + n + "}", d);
}
else
{
int length = index;
if (n != 0)
{
length = index + n + 1;
}
strDecimal = strDecimal.Substring(0, length);
}
return Decimal.Parse(strDecimal);
}
public static decimal CutDecimalWithN(decimal? d, int n)
{
if (d == null)
{
return Decimal.MinValue;
}
return CutDecimalWithN(Convert.ToDecimal(d), n);
}
#endregion
#region 团组模块 - 汇率相关存储解析
///
/// 团组模块 - 汇率相关 To List
///
///
///
public static List GetCurrencyChinaToList(string? rateStr)
{
List currencyInfos = new List();
if (string.IsNullOrEmpty(rateStr)) return currencyInfos;
if (rateStr.Contains("|"))
{
string[] currencyArr = rateStr.Split("|");
foreach (string currency in currencyArr)
{
string[] currency1 = currency.Split(":");
string[] currency2 = currency1[0].Split("(");
CurrencyInfo rateInfo = new CurrencyInfo()
{
CurrencyCode = currency2[1].Replace(")", "").TrimEnd(),
CurrencyName = currency2[0],
Rate = decimal.Parse(currency1[1]),
};
currencyInfos.Add(rateInfo);
}
}
return currencyInfos;
}
///
/// 团组模块 - 汇率相关存储解析 To String
///
///
///
public static string GetCurrencyChinaToString(List rates)
{
string rateStr = string.Empty;
if (rates.Count <= 0) return rateStr;
foreach (CurrencyInfo rate in rates)
{
//存储方式: 美元(USD):6.2350|.......|墨西哥比索(MXN):1.0000
rateStr += string.Format("{0}({1}):{2}|", rate.CurrencyName, rate.CurrencyCode, rate.Rate);
}
if (rateStr.Length > 0)
{
rateStr = rateStr.Substring(0, rateStr.Length - 1);
}
return rateStr;
}
#endregion
#region 验证身份证号码
///
/// 正则表达式
/// 验证身份证号码
///
///
///
public static bool ValidateIdNumber(this string idNumber)
{
string pattern = @"^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2]\d|3[0-1])\d{3}(\d|X)$";
Regex regex = new Regex(pattern);
return regex.IsMatch(idNumber);
}
#endregion
}