using NPOI.SS.Formula.Functions;
using OASystem.Domain.ViewModels.Financial;
using OASystem.Domain.ViewModels.Groups;
using System.Collections;
using System.Globalization;
using System.Reflection;
using System.Reflection.Metadata;
using System.Security.Cryptography;
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();
}
///
/// 根据自定义随机包含的字符获取指定长度的随机字母(含大小写)
///
/// 随机字符长度
/// 随机字符
public static string GetRandomLetter(int length)
{
string a = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjklmnpqrstuvwxyz";
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();
}
///
/// 生成不重复随机数字
/// 操作者:037
/// 2021-07-26 15:39
///
/// 输入字符串长度
/// 字符串
public static string GetRandomNumber(int len)
{
string allChar = "0,1,2,3,4,5,6,7,8,9";
string[] allCharArray = allChar.Split(',');
string RandomCode = "";
int temp = -1;
Random rand = new Random();
for (int i = 0; i < len; i++)
{
if (temp != -1)
{
rand = new Random(temp * i * ((int)DateTime.Now.Ticks));
}
int t = rand.Next(allCharArray.Length - 1);
while (temp == t)
{
t = rand.Next(allCharArray.Length - 1);
}
temp = t;
RandomCode += allCharArray[t];
}
return RandomCode;
}
#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 decimal 保留两位小数
///
/// decimal 保留两位小数 不四舍五入
///
///
///
public static decimal DecimalsKeepTwo(this decimal myDecimal)
{
var subDecimal = Math.Floor(myDecimal * 100) / 100;//保留两位小数,直接截取
return subDecimal;
}
#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;
if (rates.Count == 1 )
{
var rate = rates[0];
return string.Format("{0}({1}):{2}|", rate.CurrencyName, rate.CurrencyCode, rate.Rate);
}
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 IsValidChineseId(this string idNumber)
{
string pattern = @"^[1-9]\d{5}(18|19|20|21|22)?\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|[Xx])$";
Regex regex = new Regex(pattern);
return regex.IsMatch(idNumber);
}
///
/// 通过身份证提取生日
///
///
///
public static DateTime? GetBirthDateFromIdentityCard(string identityCard)
{
// 身份证号码正则表达式验证,支持18位身份证号码
if (!Regex.IsMatch(identityCard, @"^\d{17}(\d|X|x)$"))
{
return null;
}
// 获取出生日期(8位数字)
string birthDateString = identityCard.Substring(6, 8);
// 尝试将出生日期字符串转换为DateTime类型
if (DateTime.TryParse(birthDateString, out DateTime birthDate))
{
return birthDate;
}
return null;
}
///
/// 通过身份证判断性别
///
///
/// 0 男1 女 -1 未设置
///
public static int GetGenderFromIdentityCard(string idNumber)
{
if (string.IsNullOrEmpty(idNumber) || idNumber.Length != 18)
return -1;
char genderChar = idNumber[16];
return int.Parse(genderChar.ToString()) % 2 == 0 ? 1 :0;
}
#endregion
#region string格式日期格式化
///
/// string格式日期格式化
///
///
///
/// 格式化标准
/// yyyy-MM-dd yyyy/MM/dd
///
///
public static string DateFormat(this string dateStr, string format)
{
if (!string.IsNullOrEmpty(dateStr))
{
if (!string.IsNullOrEmpty(format))
{
DateTime result;
if (DateTime.TryParse(dateStr, out result))
{
return result.ToString(format);
}
}
}
return "";
}
#endregion
///
/// List to DataTable
/// 集合转换成datatable
///
///
///
///
public static DataTable GetDataTableFromIList(List aIList)
{
DataTable _returnTable = new DataTable();
if (aIList != null && aIList.Count > 0)
{
object _baseObj = aIList[0];
Type objectType = _baseObj.GetType();
PropertyInfo[] properties = objectType.GetProperties();
DataColumn _col;
foreach (PropertyInfo property in properties)
{
_col = new DataColumn();
_col.ColumnName = (string)property.Name;
_col.DataType = property.PropertyType;
_returnTable.Columns.Add(_col);
}
//Adds the rows to the table
DataRow _row;
foreach (object objItem in aIList)
{
_row = _returnTable.NewRow();
foreach (PropertyInfo property in properties)
{
_row[property.Name] = property.GetValue(objItem, null);
}
_returnTable.Rows.Add(_row);
}
}
return _returnTable;
}
///
/// List to DataTable
/// 集合转换成datatable
///
public static DataTable ToDataTableArray(IList list)
{
DataTable result = new DataTable();
if (list.Count > 0)
{
PropertyInfo[] propertys = list[0].GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
try
{
result.Columns.Add(pi.Name, pi.PropertyType);
}
catch (Exception ex)
{
Console.WriteLine($"{pi.Name}:{ex.Message}");
}
}
for (int i = 0; i < list.Count; i++)
{
ArrayList tempList = new ArrayList();
foreach (PropertyInfo pi in propertys)
{
object obj = pi.GetValue(list[i], null);
tempList.Add(obj);
}
object[] array = tempList.ToArray();
result.LoadDataRow(array, true);
}
}
return result;
}
///
///获取指定月份起止日期
///
///
///
///
public static (DateTime StartDate, DateTime EndDate) GetMonthStartAndEndDates(int year, int month)
{
var calendar = new GregorianCalendar();
var daysInMonth = calendar.GetDaysInMonth(year, month);
var startDate = new DateTime(year, month, 1);
var endDate = new DateTime(year, month, daysInMonth);
return (startDate, endDate);
}
}