From 428842561f579536201df3a8afb7d93b3d18338c Mon Sep 17 00:00:00 2001 From: xiaochanghai Date: Mon, 9 Jun 2025 15:21:13 +0800 Subject: [PATCH] =?UTF-8?q?=E9=97=AE=E5=8D=B7=E8=AE=BE=E5=AE=9A=20?= =?UTF-8?q?=E5=BC=BA=E5=88=B6=E9=BB=98=E8=AE=A4=E9=9C=80=E8=A6=81=E7=99=BB?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lib/Tiobon.Core.Base.dll | Bin 176128 -> 176128 bytes Lib/Tiobon.Core.dll | Bin 47104 -> 56832 bytes Lib/Tiobon.Core.xml | 229 ++++++++++ Tiobon.Core.Common/Helper/FileHelper.cs | 429 ----------------- Tiobon.Core.Common/Helper/UtilHelper.cs | 431 ------------------ .../Https/HttpPolly/HttpPollyHelper.cs | 1 + Tiobon.Core.Common/LogHelper/LogLock.cs | 1 + Tiobon.Core.Common/Seed/DBSeed.cs | 1 + Tiobon.Core.DataAccess/ReportHelper.cs | 3 +- .../Tiobon.Core.Serilog.csproj | 6 + .../Ghre/Ghre_CertificateRuleServices.cs | 6 +- .../Ghre/Ghre_SurveyServices.cs | 2 + 12 files changed, 245 insertions(+), 864 deletions(-) delete mode 100644 Tiobon.Core.Common/Helper/FileHelper.cs delete mode 100644 Tiobon.Core.Common/Helper/UtilHelper.cs diff --git a/Lib/Tiobon.Core.Base.dll b/Lib/Tiobon.Core.Base.dll index be7cc576ade4dc743034cbd6cf2aff4b88434f94..f7365b8dbdfb4c4809cc7ef05742d5c0ebcff911 100644 GIT binary patch delta 274 zcmZp8z}4`8YeEOh(p--xjXhI)7%wp@O^;_}yvVA=FhwP%-IR%OyD1Y>zNbL+9v~g=KP5YFdh! zg`s((iCOCOh9yk8+c)8=$#;Se~zVg*x_ z0#vk83n~gy-|YQw_GbQYgDn~oXSaV^!DPqcpUPmwkjP-cV9a2^V8UR=V8~z&B#jx; vfP4#v6d)@VEN=oN(-@L~*n+{5AsNU@1+r6sYAwKe62ZDtx7V*_YGeWcT|QN1 delta 274 zcmZp8z}4`8YeEOhbAgy`jXhI)7%wq$O^;_}yvWMMFhwQ5-IR%OyD1Y>zNbJQhriR$ z^@?sYii6A3bFzE3Z}DbY<)~qjWRPZVX>6HjYLt{}Y?NwhZef;eoML2VoNQo{oS0~u zY>;GXlxQ)%VF{D&_RYOaiBc?IQ=%VDmsr6RAn^KJ{zCOtrv7_dQ>GcSGCrSPv4SZ| z0V+D*7AgugPGm4;FanCD v0(nM2(iA9T!C=Oa4CJQ(Ma+P7GEj#JkW2)t2Jw=>x)K>Iw%4y^YGeWcQl3^i diff --git a/Lib/Tiobon.Core.dll b/Lib/Tiobon.Core.dll index 8f8f1a7a6dbb52ed20cc8c2f398def99eac46f14..e9bb827c784dc902197dfe4a9aae27a7edc476e5 100644 GIT binary patch literal 56832 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 U@cR?33zE^0$MwVC|D6W@3A~x^&Hw-a literal 47104 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�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 diff --git a/Lib/Tiobon.Core.xml b/Lib/Tiobon.Core.xml index bc2c1a4e..9d386926 100644 --- a/Lib/Tiobon.Core.xml +++ b/Lib/Tiobon.Core.xml @@ -204,6 +204,235 @@ + + + 取后缀名 + + 文件名 + .gif|.html格式 + + + + 根据文件大小获取指定前缀的可用文件名 + + 文件夹 + 文件前缀 + 文件大小(1m) + 文件后缀(.log) + 可用文件名 + + + + 写文件 + + 文件路径 + 文件内容 + + + + 写文件 + + 文件路径 + 文件内容 + + + + 写文件 + + 文件路径 + 文件内容 + 编码格式 + + + + 读文件 + + 文件路径 + + + + + 读文件 + + 文件路径 + 编码格式 + + + + + 追加文件 + + 文件路径 + 内容 + + + + 拷贝文件 + + 原始文件 + 新文件路径 + + + + 删除文件 + + 路径 + + + + 移动文件 + + 原始路径 + 新路径 + + + + 在当前目录下创建目录 + + 当前目录 + 新目录 + + + + 递归删除文件夹目录及文件 + + + + + + + 指定文件夹下面的所有内容copy到目标文件夹下面 + + 原始路径 + 目标文件夹 + + + + 获取文件根目录 + + + + + + 创建文件夹 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 去除后面多余的零 + + + + + + + 去除后面多余的零 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 获取当前时间的时间戳 + + + + 表主键 diff --git a/Tiobon.Core.Common/Helper/FileHelper.cs b/Tiobon.Core.Common/Helper/FileHelper.cs deleted file mode 100644 index 77d6cf65..00000000 --- a/Tiobon.Core.Common/Helper/FileHelper.cs +++ /dev/null @@ -1,429 +0,0 @@ -using System.Text; - -namespace Tiobon.Core.Common.Helper; - -public class FileHelper : IDisposable -{ - - private bool _alreadyDispose = false; - - #region 构造函数 - public FileHelper() - { - // - // TODO: 在此处添加构造函数逻辑 - // - } - ~FileHelper() - { - Dispose(); ; - } - - protected virtual void Dispose(bool isDisposing) - { - if (_alreadyDispose) return; - _alreadyDispose = true; - } - #endregion - - #region IDisposable 成员 - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - #endregion - - #region 取得文件后缀名 - /**************************************** - * 函数名称:GetPostfixStr - * 功能说明:取得文件后缀名 - * 参 数:filename:文件名称 - * 调用示列: - * string filename = "aaa.aspx"; - * string s = EC.FileObj.GetPostfixStr(filename); - *****************************************/ - /// - /// 取后缀名 - /// - /// 文件名 - /// .gif|.html格式 - public static string GetPostfixStr(string filename) - { - int start = filename.LastIndexOf("."); - int length = filename.Length; - string postfix = filename.Substring(start, length - start); - return postfix; - } - #endregion - - #region 根据文件大小获取指定前缀的可用文件名 - /// - /// 根据文件大小获取指定前缀的可用文件名 - /// - /// 文件夹 - /// 文件前缀 - /// 文件大小(1m) - /// 文件后缀(.log) - /// 可用文件名 - public static string GetAvailableFileWithPrefixOrderSize(string folderPath, string prefix, int size = 1 * 1024 * 1024, string ext = ".log") - { - //var allFiles = new DirectoryInfo(folderPath); - //var selectFiles = allFiles.GetFiles().Where(fi => fi.Name.ToLower().Contains(prefix.ToLower()) && fi.Extension.ToLower() == ext.ToLower() && fi.Length < size).OrderByDescending(d => d.Name).ToList(); - - //if (selectFiles.Count > 0) - //{ - // return selectFiles.FirstOrDefault().FullName; - //} - return Path.Combine(folderPath, $@"{prefix}.log"); - } - public static string GetAvailableFileNameWithPrefixOrderSize(string _contentRoot, string prefix, int size = 1 * 1024 * 1024, string ext = ".log") - { - var folderPath = Path.Combine(_contentRoot, "Log"); - if (!Directory.Exists(folderPath)) - { - Directory.CreateDirectory(folderPath); - } - - var allFiles = new DirectoryInfo(folderPath); - var selectFiles = allFiles.GetFiles().Where(fi => fi.Name.ToLower().Contains(prefix.ToLower()) && fi.Extension.ToLower() == ext.ToLower() && fi.Length < size).OrderByDescending(d => d.Name).ToList(); - - if (selectFiles.Count > 0) - { - return selectFiles.FirstOrDefault().Name.Replace(".log", ""); - } - - return $@"{prefix}_{DateTime.Now.DateToTimeStamp()}"; - } - #endregion - - #region 写文件 - /**************************************** - * 函数名称:WriteFile - * 功能说明:写文件,会覆盖掉以前的内容 - * 参 数:Path:文件路径,Strings:文本内容 - * 调用示列: - * string Path = Server.MapPath("Default2.aspx"); - * string Strings = "这是我写的内容啊"; - * EC.FileObj.WriteFile(Path,Strings); - *****************************************/ - /// - /// 写文件 - /// - /// 文件路径 - /// 文件内容 - public static void WriteFile(string Path, string Strings) - { - if (!File.Exists(Path)) - { - FileStream f = File.Create(Path); - f.Close(); - } - StreamWriter f2 = new StreamWriter(Path, false, System.Text.Encoding.GetEncoding("gb2312")); - f2.Write(Strings); - f2.Close(); - f2.Dispose(); - } - /// - /// 写文件 - /// - /// 文件路径 - /// 文件内容 - public static void WriteFile(string Path, byte[] buf) - { - if (!File.Exists(Path)) - { - FileStream f = File.Create(Path); - f.Close(); - } - FileStream f2 = new FileStream(Path, FileMode.Create, FileAccess.Write); - f2.Write(buf, 0, buf.Length); - f2.Close(); - f2.Dispose(); - } - - /// - /// 写文件 - /// - /// 文件路径 - /// 文件内容 - /// 编码格式 - public static void WriteFile(string Path, string Strings, Encoding encode) - { - if (!File.Exists(Path)) - { - FileStream f = File.Create(Path); - f.Close(); - } - StreamWriter f2 = new StreamWriter(Path, false, encode); - f2.Write(Strings); - f2.Close(); - f2.Dispose(); - } - #endregion - - #region 读文件 - /**************************************** - * 函数名称:ReadFile - * 功能说明:读取文本内容 - * 参 数:Path:文件路径 - * 调用示列: - * string Path = Server.MapPath("Default2.aspx"); - * string s = EC.FileObj.ReadFile(Path); - *****************************************/ - /// - /// 读文件 - /// - /// 文件路径 - /// - public static string ReadFile(string Path) - { - string s = ""; - if (!File.Exists(Path)) - s = "不存在相应的目录"; - else - { - StreamReader f2 = new StreamReader(Path, System.Text.Encoding.GetEncoding("gb2312")); - s = f2.ReadToEnd(); - f2.Close(); - f2.Dispose(); - } - - return s; - } - - /// - /// 读文件 - /// - /// 文件路径 - /// 编码格式 - /// - public static string ReadFile(string Path, Encoding encode) - { - string s = ""; - if (!File.Exists(Path)) - s = "不存在相应的目录"; - else - { - StreamReader f2 = new StreamReader(Path, encode); - s = f2.ReadToEnd(); - f2.Close(); - f2.Dispose(); - } - - return s; - } - #endregion - - #region 追加文件 - /**************************************** - * 函数名称:FileAdd - * 功能说明:追加文件内容 - * 参 数:Path:文件路径,strings:内容 - * 调用示列: - * string Path = Server.MapPath("Default2.aspx"); - * string Strings = "新追加内容"; - * EC.FileObj.FileAdd(Path, Strings); - *****************************************/ - /// - /// 追加文件 - /// - /// 文件路径 - /// 内容 - public static void FileAdd(string Path, string strings) - { - StreamWriter sw = File.AppendText(Path); - sw.Write(strings); - sw.Flush(); - sw.Close(); - } - #endregion - - #region 拷贝文件 - /**************************************** - * 函数名称:FileCoppy - * 功能说明:拷贝文件 - * 参 数:OrignFile:原始文件,NewFile:新文件路径 - * 调用示列: - * string orignFile = Server.MapPath("Default2.aspx"); - * string NewFile = Server.MapPath("Default3.aspx"); - * EC.FileObj.FileCoppy(OrignFile, NewFile); - *****************************************/ - /// - /// 拷贝文件 - /// - /// 原始文件 - /// 新文件路径 - public static void FileCoppy(string orignFile, string NewFile) - { - File.Copy(orignFile, NewFile, true); - } - - #endregion - - #region 删除文件 - /**************************************** - * 函数名称:FileDel - * 功能说明:删除文件 - * 参 数:Path:文件路径 - * 调用示列: - * string Path = Server.MapPath("Default3.aspx"); - * EC.FileObj.FileDel(Path); - *****************************************/ - /// - /// 删除文件 - /// - /// 路径 - public static void FileDel(string Path) - { - File.Delete(Path); - } - #endregion - - #region 移动文件 - /**************************************** - * 函数名称:FileMove - * 功能说明:移动文件 - * 参 数:OrignFile:原始路径,NewFile:新文件路径 - * 调用示列: - * string orignFile = Server.MapPath("../说明.txt"); - * string NewFile = Server.MapPath("http://www.cnTiobons.com/说明.txt"); - * EC.FileObj.FileMove(OrignFile, NewFile); - *****************************************/ - /// - /// 移动文件 - /// - /// 原始路径 - /// 新路径 - public static void FileMove(string orignFile, string NewFile) - { - File.Move(orignFile, NewFile); - } - #endregion - - #region 在当前目录下创建目录 - /**************************************** - * 函数名称:FolderCreate - * 功能说明:在当前目录下创建目录 - * 参 数:OrignFolder:当前目录,NewFloder:新目录 - * 调用示列: - * string orignFolder = Server.MapPath("test/"); - * string NewFloder = "new"; - * EC.FileObj.FolderCreate(OrignFolder, NewFloder); - *****************************************/ - /// - /// 在当前目录下创建目录 - /// - /// 当前目录 - /// 新目录 - public static void FolderCreate(string orignFolder, string NewFloder) - { - Directory.SetCurrentDirectory(orignFolder); - Directory.CreateDirectory(NewFloder); - } - #endregion - - #region 递归删除文件夹目录及文件 - /**************************************** - * 函数名称:DeleteFolder - * 功能说明:递归删除文件夹目录及文件 - * 参 数:dir:文件夹路径 - * 调用示列: - * string dir = Server.MapPath("test/"); - * EC.FileObj.DeleteFolder(dir); - *****************************************/ - /// - /// 递归删除文件夹目录及文件 - /// - /// - /// - public static void DeleteFolder(string dir) - { - if (Directory.Exists(dir)) //如果存在这个文件夹删除之 - { - foreach (string d in Directory.GetFileSystemEntries(dir)) - { - if (File.Exists(d)) - File.Delete(d); //直接删除其中的文件 - else - DeleteFolder(d); //递归删除子文件夹 - } - Directory.Delete(dir); //删除已空文件夹 - } - - } - #endregion - - #region 将指定文件夹下面的所有内容copy到目标文件夹下面 果目标文件夹为只读属性就会报错。 - /**************************************** - * 函数名称:CopyDir - * 功能说明:将指定文件夹下面的所有内容copy到目标文件夹下面 果目标文件夹为只读属性就会报错。 - * 参 数:srcPath:原始路径,aimPath:目标文件夹 - * 调用示列: - * string srcPath = Server.MapPath("test/"); - * string aimPath = Server.MapPath("test1/"); - * EC.FileObj.CopyDir(srcPath,aimPath); - *****************************************/ - /// - /// 指定文件夹下面的所有内容copy到目标文件夹下面 - /// - /// 原始路径 - /// 目标文件夹 - public static void CopyDir(string srcPath, string aimPath) - { - try - { - // 检查目标目录是否以目录分割字符结束如果不是则添加之 - if (aimPath[aimPath.Length - 1] != Path.DirectorySeparatorChar) - aimPath += Path.DirectorySeparatorChar; - // 判断目标目录是否存在如果不存在则新建之 - if (!Directory.Exists(aimPath)) - Directory.CreateDirectory(aimPath); - // 得到源目录的文件列表,该里面是包含文件以及目录路径的一个数组 - //如果你指向copy目标文件下面的文件而不包含目录请使用下面的方法 - //string[] fileList = Directory.GetFiles(srcPath); - string[] fileList = Directory.GetFileSystemEntries(srcPath); - //遍历所有的文件和目录 - foreach (string file in fileList) - { - //先当作目录处理如果存在这个目录就递归Copy该目录下面的文件 - - if (Directory.Exists(file)) - CopyDir(file, aimPath + Path.GetFileName(file)); - //否则直接Copy文件 - else - File.Copy(file, aimPath + Path.GetFileName(file), true); - } - - } - catch (Exception ee) - { - throw new Exception(ee.ToString()); - } - } - #endregion - - #region 获取文件根目录 - /// - /// 获取文件根目录 - /// - /// - public static string GetPhysicsPath() => $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot"; - - #endregion - - #region 创建文件夹 - /// - /// 创建文件夹 - /// - /// - public static void CreateDirectory(string path) - { - var physicsPath = GetPhysicsPath(); - if (!Directory.Exists(physicsPath + path)) - Directory.CreateDirectory(physicsPath + path); - } - #endregion -} diff --git a/Tiobon.Core.Common/Helper/UtilHelper.cs b/Tiobon.Core.Common/Helper/UtilHelper.cs deleted file mode 100644 index ffd47b47..00000000 --- a/Tiobon.Core.Common/Helper/UtilHelper.cs +++ /dev/null @@ -1,431 +0,0 @@ -using Newtonsoft.Json; -using SqlSugar; - -namespace Tiobon.Core; - -/// -/// -/// -public static class UtilHelper -{ - /// - /// - /// - /// - /// - public static int ObjToInt(this object thisValue) - { - int reval = 0; - if (thisValue == null) return 0; - if (thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval)) - { - return reval; - } - - return reval; - } - - /// - /// - /// - /// - /// - /// - public static int ObjToInt(this object thisValue, int errorValue) - { - int reval = 0; - if (thisValue != null && thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval)) - { - return reval; - } - - return errorValue; - } - - public static long ObjToLong(this object thisValue) - { - long reval = 0; - if (thisValue == null) return 0; - if (thisValue != DBNull.Value && long.TryParse(thisValue.ToString(), out reval)) - { - return reval; - } - - return reval; - } - - /// - /// - /// - /// - /// - public static double ObjToMoney(this object thisValue) - { - double reval = 0; - if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval)) - { - return reval; - } - - return 0; - } - - /// - /// - /// - /// - /// - /// - public static double ObjToMoney(this object thisValue, double errorValue) - { - double reval = 0; - if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval)) - { - return reval; - } - - return errorValue; - } - - /// - /// - /// - /// - /// - public static string ObjToString(this object thisValue) - { - if (thisValue != null) return thisValue.ToString().Trim(); - return ""; - } - - /// - /// - /// - /// - /// - public static bool IsNotEmptyOrNull(this object thisValue) - { - return ObjToString(thisValue) != "" && ObjToString(thisValue) != "undefined" && - ObjToString(thisValue) != "null"; - } - - /// - /// - /// - /// - /// - /// - public static string ObjToString(this object thisValue, string errorValue) - { - if (thisValue != null) return thisValue.ToString().Trim(); - return errorValue; - } - - public static bool IsNullOrEmpty(this object thisValue) => thisValue == null || thisValue == DBNull.Value || - string.IsNullOrWhiteSpace(thisValue.ToString()); - - /// - /// - /// - /// - /// - public static Decimal ObjToDecimal(this object thisValue) - { - Decimal reval = 0; - if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval)) - { - return reval; - } - - return 0; - } - - /// - /// - /// - /// - /// - /// - public static Decimal ObjToDecimal(this object thisValue, decimal errorValue) - { - Decimal reval = 0; - if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval)) - { - return reval; - } - - return errorValue; - } - - - - #region 去除后面多余的零 - /// - /// 去除后面多余的零 - /// - /// - /// - public static string RemoveZero(this decimal? dValue) - { - if (dValue.IsNullOrEmpty()) - return null; - return RemoveZero(dValue.Value); - } - ///// - ///// 去除后面多余的零 - ///// - ///// - ///// - //public static string RemoveZero(decimal? dValue) - //{ - // if (dValue.IsNullOrEmpty()) - // return null; - // return RemoveZero(dValue.Value); - //} - /// - /// 去除后面多余的零 - /// - /// - /// - public static string RemoveZero(decimal dValue) - { - string sResult = dValue.ToString(); - if (sResult.IndexOf(".") < 0) - return sResult; - int iIndex = sResult.Length - 1; - for (int i = sResult.Length - 1; i >= 0; i--) - { - if (sResult.Substring(i, 1) != "0") - { - iIndex = i; - break; - } - } - sResult = sResult.Substring(0, iIndex + 1); - if (sResult.EndsWith(".")) - sResult = sResult.Substring(0, sResult.Length - 1); - return sResult; - } - - public static string TrimDecimalString(this decimal? value1, int reservedDigit) - { - try - { - var value = value1.RemoveZero(); - string result = string.Empty; - if (!string.IsNullOrEmpty(value)) - { - Decimal tmp = Decimal.Parse(value); - if (reservedDigit == -1) - result = string.Format("{0:#0.##########}", tmp); - else - { - result = String.Format("{0:N" + reservedDigit.ToString() + "}", tmp); - result = result.Replace(",", ""); - } - } - return result; - } - catch (Exception) { return null; } - } - public static decimal? TrimDecimal(this decimal? value1, int reservedDigit) - { - try - { - var value = value1.TrimDecimalString(reservedDigit); - string result = string.Empty; - if (!string.IsNullOrEmpty(value)) - { - Decimal tmp = Decimal.Parse(value); - if (reservedDigit == -1) - result = string.Format("{0:#0.##########}", tmp); - else - { - result = String.Format("{0:N" + reservedDigit.ToString() + "}", tmp); - result = result.Replace(",", ""); - } - } - return Convert.ToDecimal(result); - } - catch (Exception) { return null; } - } - #endregion - - /// - /// - /// - /// - /// - public static DateTime ObjToDate(this object thisValue) - { - DateTime reval = DateTime.MinValue; - if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval)) - { - reval = Convert.ToDateTime(thisValue); - } - else - { - //时间戳转为时间 - var seconds = ObjToLong(thisValue); - if (seconds > 0) - { - var startTime = TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1), TimeZoneInfo.Local); - reval = startTime.AddSeconds(Convert.ToDouble(thisValue)); - } - } - - return reval; - } - - /// - /// - /// - /// - /// - /// - public static DateTime ObjToDate(this object thisValue, DateTime errorValue) - { - DateTime reval = DateTime.MinValue; - if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval)) - { - return reval; - } - - return errorValue; - } - - /// - /// - /// - /// - /// - public static bool ObjToBool(this object thisValue) - { - bool reval = false; - if (thisValue != null && thisValue != DBNull.Value && bool.TryParse(thisValue.ToString(), out reval)) - { - return reval; - } - - return reval; - } - - - /// - /// 获取当前时间的时间戳 - /// - /// - /// - public static string DateToTimeStamp(this DateTime thisValue) - { - TimeSpan ts = thisValue - new DateTime(1970, 1, 1, 0, 0, 0, 0); - return Convert.ToInt64(ts.TotalSeconds).ToString(); - } - - public static object ChangeType(this object value, Type type) - { - if (value == null && type.IsGenericType) return Activator.CreateInstance(type); - if (value == null) return null; - if (type == value.GetType()) return value; - if (type.IsEnum) - { - if (value is string) - return Enum.Parse(type, value as string); - else - return Enum.ToObject(type, value); - } - - if (!type.IsInterface && type.IsGenericType) - { - Type innerType = type.GetGenericArguments()[0]; - object innerValue = ChangeType(value, innerType); - return Activator.CreateInstance(type, new object[] { innerValue }); - } - - if (value is string && type == typeof(Guid)) return new Guid(value as string); - if (value is string && type == typeof(Version)) return new Version(value as string); - if (!(value is IConvertible)) return value; - return Convert.ChangeType(value, type); - } - - public static object ChangeTypeList(this object value, Type type) - { - if (value == null) return default; - - var gt = typeof(List<>).MakeGenericType(type); - dynamic lis = Activator.CreateInstance(gt); - - var addMethod = gt.GetMethod("Add"); - string values = value.ToString(); - if (values != null && values.StartsWith("(") && values.EndsWith(")")) - { - string[] splits; - if (values.Contains("\",\"")) - { - splits = values.Remove(values.Length - 2, 2) - .Remove(0, 2) - .Split("\",\""); - } - else - { - splits = values.Remove(0, 1) - .Remove(values.Length - 2, 1) - .Split(","); - } - - foreach (var split in splits) - { - var str = split; - if (split.StartsWith("\"") && split.EndsWith("\"")) - { - str = split.Remove(0, 1) - .Remove(split.Length - 2, 1); - } - - addMethod.Invoke(lis, new object[] { ChangeType(str, type) }); - } - } - - return lis; - } - - public static string ToJson(this object value) - { - return JsonConvert.SerializeObject(value); - } - - public static bool AnyNoException(this ICollection source) - { - if (source == null) return false; - - return source.Any() && source.All(s => s != null); - } - - public static bool IsNull(this long? thisValue) - { - return thisValue is null; - } - public static bool IsNull(this int? thisValue) - { - return thisValue is null; - } - public static bool IsNull(this decimal? thisValue) - { - return thisValue is null; - } - public static bool IsNull(this string thisValue) - { - return string.IsNullOrWhiteSpace(thisValue); - } - public static bool IsNull(this DateTime? thisValue) - { - return thisValue is null; - } - public static bool IsNull(this T entity) where T : class - { - return entity == null; - } - - public static long GetSysId() => SnowFlakeSingle.instance.getID(); - -} \ No newline at end of file diff --git a/Tiobon.Core.Common/Https/HttpPolly/HttpPollyHelper.cs b/Tiobon.Core.Common/Https/HttpPolly/HttpPollyHelper.cs index 552db3bb..00f6edeb 100644 --- a/Tiobon.Core.Common/Https/HttpPolly/HttpPollyHelper.cs +++ b/Tiobon.Core.Common/Https/HttpPolly/HttpPollyHelper.cs @@ -1,6 +1,7 @@ using Newtonsoft.Json; using System.Text; using Tiobon.Core.Common.Helper; +using Tiobon.Core.Helper; using Tiobon.Core.Model; namespace Tiobon.Core.Common.Https.HttpPolly; diff --git a/Tiobon.Core.Common/LogHelper/LogLock.cs b/Tiobon.Core.Common/LogHelper/LogLock.cs index 36d4b2a9..128436c7 100644 --- a/Tiobon.Core.Common/LogHelper/LogLock.cs +++ b/Tiobon.Core.Common/LogHelper/LogLock.cs @@ -4,6 +4,7 @@ using Serilog; using Tiobon.Core.Common.Helper; using Tiobon.Core.Model; using Tiobon.Core.Common.DB.Dapper; +using Tiobon.Core.Helper; namespace Tiobon.Core.Common.LogHelper; diff --git a/Tiobon.Core.Common/Seed/DBSeed.cs b/Tiobon.Core.Common/Seed/DBSeed.cs index 49c3668f..c6cc06d3 100644 --- a/Tiobon.Core.Common/Seed/DBSeed.cs +++ b/Tiobon.Core.Common/Seed/DBSeed.cs @@ -9,6 +9,7 @@ using System.Diagnostics; using System.Reflection; using System.Text; using Tiobon.Core.Common.Const; +using Tiobon.Core.Helper; namespace Tiobon.Core.Common.Seed; diff --git a/Tiobon.Core.DataAccess/ReportHelper.cs b/Tiobon.Core.DataAccess/ReportHelper.cs index 93be04a3..b4cf81c5 100644 --- a/Tiobon.Core.DataAccess/ReportHelper.cs +++ b/Tiobon.Core.DataAccess/ReportHelper.cs @@ -21,6 +21,7 @@ using System.Threading.Tasks; using Tiobon.Core.Common; using Tiobon.Core.Common.Extensions; using Tiobon.Core.Common.Helper; +using Tiobon.Core.Helper; using Tiobon.Core.Model.Entity; using Tiobon.Core.Model.Models; @@ -834,7 +835,7 @@ public static class ReportHelper { var dict = new Dictionary { - { "Id", UtilHelper.GetSysId() }, + { "Id", SnowFlakeSingle.instance.getID() }, { "CreateBy", App.User.ID }, { "CreateTime", DateTime.Now } }; diff --git a/Tiobon.Core.Serilog/Tiobon.Core.Serilog.csproj b/Tiobon.Core.Serilog/Tiobon.Core.Serilog.csproj index 2694d813..534f7761 100644 --- a/Tiobon.Core.Serilog/Tiobon.Core.Serilog.csproj +++ b/Tiobon.Core.Serilog/Tiobon.Core.Serilog.csproj @@ -10,4 +10,10 @@ + + + ..\Lib\Tiobon.Core.dll + + + diff --git a/Tiobon.Core.Services/Ghre/Ghre_CertificateRuleServices.cs b/Tiobon.Core.Services/Ghre/Ghre_CertificateRuleServices.cs index b077e7d3..e80b310b 100644 --- a/Tiobon.Core.Services/Ghre/Ghre_CertificateRuleServices.cs +++ b/Tiobon.Core.Services/Ghre/Ghre_CertificateRuleServices.cs @@ -128,7 +128,7 @@ public class Ghre_CertificateRuleServices : BaseServices Add(InsertGhre_SurveyInput entity) { + entity.IsRequireLogin = true; var result = await base.Add(entity); return result; @@ -40,6 +41,7 @@ public class Ghre_SurveyServices : BaseServices Update(long Id, EditGhre_SurveyInput editModel) { + editModel.IsRequireLogin = true; var result = await base.Update(Id, editModel, null, ["Status"]); return result; }