| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527 | using NPOI.SS.Formula.Functions;using OASystem.Domain.ViewModels.Financial;using OASystem.Domain.ViewModels.Groups;using System.Globalization;using System.Reflection;using System.Reflection.Metadata;namespace OASystem.Infrastructure.Tools;/// <summary>/// 工具类/// </summary>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<T>(this string json)    {        return JsonSerializer.Deserialize<T>(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>(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<T>(List<T> 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    /// <summary>    /// 是否为ip    /// </summary>    /// <param name="ip"></param>    /// <returns></returns>    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 随机数    /// <summary>    /// 根据自定义随机包含的字符获取指定长度的随机字符    /// </summary>    /// <param name="length">随机字符长度</param>    /// <returns>随机字符</returns>    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();    }    /// <summary>    /// 根据自定义随机包含的字符获取指定长度的随机字符    /// </summary>    /// <param name="length">随机字符长度</param>    /// <returns>随机字符</returns>    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();    }    /// <summary>    /// 根据自定义随机包含的字符获取指定长度的随机字母(含大小写)    /// </summary>    /// <param name="length">随机字符长度</param>    /// <returns>随机字符</returns>    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();    }    /// <summary>    /// 生成不重复随机数字    /// 操作者:037    /// 2021-07-26 15:39    /// </summary>    /// <param name="CodeCount">输入字符串长度</param>    /// <returns>字符串</returns>    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 截取    /// <summary>    ///     /// </summary>    /// <param name="d"></param>    /// <param name="n"></param>    /// <returns></returns>    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 保留两位小数    /// <summary>    /// decimal 保留两位小数 不四舍五入    /// </summary>    /// <param name="number"></param>    /// <returns></returns>    public static decimal DecimalsKeepTwo(this decimal myDecimal)    {        var subDecimal = Math.Floor(myDecimal * 100) / 100;//保留两位小数,直接截取        return subDecimal;    }    #endregion    #region 团组模块 - 汇率相关存储解析    /// <summary>    /// 团组模块 - 汇率相关 To List    /// </summary>    /// <param name="rateStr"></param>    /// <returns></returns>    public static List<CurrencyInfo> GetCurrencyChinaToList(string? rateStr)    {        List<CurrencyInfo> currencyInfos = new List<CurrencyInfo>();        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;    }    /// <summary>    /// 团组模块 - 汇率相关存储解析 To String    /// </summary>    /// <param name="rates"></param>    /// <returns></returns>    public static string  GetCurrencyChinaToString(List<CurrencyInfo> 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 验证身份证号码    /// <summary>    /// 正则表达式    /// 验证身份证号码    /// </summary>    /// <param name="idNumber"></param>    /// <returns></returns>    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);    }    /// <summary>    /// 通过身份证提取生日    /// </summary>    /// <param name="identityCard"></param>    /// <returns></returns>    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;    }    /// <summary>    /// 通过身份证判断性别    /// </summary>    /// <param name="idNumber"></param>    /// <returns>0 男1 女 -1 未设置</returns>    /// <exception cref="ArgumentException"></exception>    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格式日期格式化    /// <summary>    /// string格式日期格式化    /// </summary>    /// <param name="dateStr"></param>    /// <param name="format">    /// 格式化标准    /// yyyy-MM-dd  yyyy/MM/dd    /// </param>    /// <returns></returns>    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    /// <summary>    /// List to DataTable    /// 集合转换成datatable    /// </summary>    /// <typeparam name="T"></typeparam>    /// <param name="aIList"></param>    /// <returns></returns>    public static DataTable GetDataTableFromIList<T>(List<T> 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;    }}
 |