using SqlSugar; using System; using System.Collections.Generic; using System.Data; using System.Linq; using VolPro.Core.Configuration; using VolPro.Core.UserManager; using VolPro.Core.Utilities; using VolPro.Entity.DomainModels; namespace VolPro.Core.Generic { public static class GenericDbProviderExtensions { /// /// 设置逻辑删除字段、审批字段默认值为0 /// public static T SetLogicDelDefault(this T provider, Dictionary mainData, List columns) where T : GenericDbProviderBase { string LogicDelField = provider.GetLogicDelField(columns); if (LogicDelField != null) { mainData[LogicDelField] = 0; } return provider; } /// /// 获取逻辑删除字段 /// /// /// /// public static string GetLogicDelField(this T provider, List columns) where T : GenericDbProviderBase { if (!string.IsNullOrEmpty(AppSetting.LogicDelField)) { var logicCol = columns.FirstOrDefault(c => c.ColumnName.Equals(AppSetting.LogicDelField, StringComparison.OrdinalIgnoreCase)); if (logicCol != null) { return logicCol.ColumnName; } } return null; } public static T SetAuditDefault(this T provider, Dictionary mainData, List columns) where T : GenericDbProviderBase { var auditCol = columns.FirstOrDefault(c => c.ColumnName.Equals("AuditStatus", StringComparison.OrdinalIgnoreCase)); if (auditCol != null) { if (!mainData.TryGetValue(auditCol.ColumnName, out object val) || val == null || (val is string s && string.IsNullOrWhiteSpace(s))) { mainData[auditCol.ColumnName] = 0; } } return provider; } /// /// 根据主键类型自动生成主键值(雪花、Guid、string-Guid) /// public static T SetPrimaryKey(this T provider, Dictionary mainData, TableColumnField keyColumn) where T : GenericDbProviderBase { if (keyColumn == null) return provider; string keyName = keyColumn.ColumnName; string type = (keyColumn.ColumnType ?? "").Trim().ToLower(); mainData.TryGetValue(keyName, out object keyVal); bool hasValue = !string.IsNullOrEmpty(keyVal?.ToString()); // bigint/long 雪花ID if ((type == "long" || type == "bigint") && AppSetting.UseSnow) { var worker = new IdWorker(); long id = worker.NextId(); mainData[keyName] = id; return provider; } // Guid 主键,string 主键,且未传值时生成 Guid 字符串 if (type == "guid" || (type == "string" && !hasValue)) { mainData[keyName] = Guid.NewGuid(); return provider; } return provider; } private static List ModifyFields { get; set; } /// /// 获取需要忽略修改人/修改时间字段 /// public static List GetModifyFieldsToIgnore(this T provider) where T : GenericDbProviderBase { if (ModifyFields != null) { return ModifyFields; } var ignore = new HashSet(StringComparer.OrdinalIgnoreCase); if (!string.IsNullOrWhiteSpace(AppSetting.ModifyMember?.UserIdField)) { ignore.Add(AppSetting.ModifyMember.UserIdField); } if (!string.IsNullOrWhiteSpace(AppSetting.ModifyMember?.UserNameField)) { ignore.Add(AppSetting.ModifyMember.UserNameField); } if (!string.IsNullOrWhiteSpace(AppSetting.ModifyMember?.DateField)) { ignore.Add(AppSetting.ModifyMember.DateField); } ModifyFields = ignore.ToList(); return ModifyFields; } private static HashSet AddFields { get; set; } /// /// 获取需要忽略写入人 /// public static HashSet GetAddFieldsToIgnore(this T provider) where T : GenericDbProviderBase { if (AddFields != null) { return AddFields; } var ignore = new HashSet(StringComparer.OrdinalIgnoreCase); if (!string.IsNullOrWhiteSpace(AppSetting.CreateMember?.UserIdField)) { ignore.Add(AppSetting.CreateMember.UserIdField); } if (!string.IsNullOrWhiteSpace(AppSetting.CreateMember?.UserNameField)) { ignore.Add(AppSetting.CreateMember.UserNameField); } if (!string.IsNullOrWhiteSpace(AppSetting.CreateMember?.DateField)) { ignore.Add(AppSetting.CreateMember.DateField); } AddFields = ignore; return AddFields; } private static HashSet AddAndModifyFields { get; set; } public static HashSet GetAddAndModifyFieldsToIgnore(this T provider) where T : GenericDbProviderBase { if (AddAndModifyFields == null) { AddAndModifyFields = new HashSet(StringComparer.OrdinalIgnoreCase); GetAddFieldsToIgnore(provider).ToList().ForEach(x => AddAndModifyFields.Add(x)); GetModifyFieldsToIgnore(provider).ToList().ForEach(x => AddAndModifyFields.Add(x)); } return AddAndModifyFields; } /// /// 判断字段类型是否为整型(int/long/bigint) /// public static bool IsIntOrLong(this T provider, string columnType) where T : GenericDbProviderBase { string type = (columnType ?? "").Trim().ToLower(); return type == "int" || type == "long" || type == "bigint"; } /// /// 是否自增主键 /// /// /// /// /// public static bool IsIdentity(this T provider, string columnType) where T : GenericDbProviderBase { string type = (columnType ?? "").Trim().ToLower(); if (type == "int") { return true; } return (type == "long" || type == "bigint") && !AppSetting.UseSnow; } // GetDbType / IsZero 已移动到 GenericDbValidationExtensions.cs private static void AddWhereSugarParameter(List parameters, string name, object value, TableColumnField col) { var par = new SugarParameter(name, value); var dbType = GenericDbValidationExtensions.EffectiveDapperDbType(value, col); if (dbType != null) { par.DbType = (System.Data.DbType)dbType; } parameters.Add(par); } /// /// 构造查询条件 where 语句 /// public static T BuildWhere(this T provider, List filters, List columns, List whereList, List parameters, string LeftQuote, string RightQuote) where T : GenericDbProviderBase { if (filters == null || filters.Count == 0) return provider; int index = 0; foreach (var f in filters) { if (string.IsNullOrEmpty(f?.Name)) continue; var col = columns.FirstOrDefault(c => c.ColumnName.Equals(f.Name, StringComparison.OrdinalIgnoreCase)); if (col == null) continue; string op = (f.DisplayType ?? "").ToLower(); if (op == "isnull") { whereList.Add($"{LeftQuote}{col.ColumnName}{RightQuote} IS NULL"); continue; } if (op == "isnotnull") { whereList.Add($"{LeftQuote}{col.ColumnName}{RightQuote} IS NOT NULL"); continue; } if (string.IsNullOrEmpty(f.Value)) continue; object ConvertValue(string val) { string type = (col.ColumnType ?? "").ToLower(); if (type == "long" || type == "bigint" || type == "int64") { if (long.TryParse(val, out var lv)) return lv; return null; } if (type.Contains("int")) { if (int.TryParse(val,out var iv)) return iv; return null; } if (type == "guid" || type == "uniqueidentifier") { if (Guid.TryParse(val, out var gv)) return gv; return null; } if (type.Contains("decimal") || type.Contains("numeric") || type.Contains("money")) { if (decimal.TryParse(val, out var dv)) return dv; return null; } if (type.Contains("float") || type.Contains("double")) { if (double.TryParse(val, out var fv)) return fv; return null; } if (type.Contains("date") || type.Contains("time")) { if (DateTime.TryParse(val, out var dt)) return dt; return null; } if (type.Contains("bit") || type.Contains("bool")) { if (val == "1" || val.Equals("true", StringComparison.OrdinalIgnoreCase)) return true; if (val == "0" || val.Equals("false", StringComparison.OrdinalIgnoreCase)) return false; } return val; } bool isIn = op == "in" || op == "selectlist" || op == "checkbox" || op == "notin"; if (isIn) { var arr = f.Value.Split(',', StringSplitOptions.RemoveEmptyEntries) .Select(v => v.Trim()) .ToArray(); if (arr.Length == 0) continue; var paramNames = new List(); foreach (var v in arr) { var cv = ConvertValue(v); if (cv == null) continue; string name = $"@p{index++}"; string placeholder = name; paramNames.Add(placeholder); AddWhereSugarParameter(parameters, name, cv, col); } if (paramNames.Count == 0) continue; string inSql = string.Join(",", paramNames); whereList.Add($"{LeftQuote}{col.ColumnName}{RightQuote} {(op == "notin" ? "NOT IN" : "IN")} ({inSql})"); continue; } // LIKE / 模糊查询,统一在这里处理,保证三种数据库(PgSql/MySql/SqlServer)都能正常工作 bool isLikeOp = op == "like" || op == "contains" || op == "startwith" || op == "likestart" || op == "endwith" || op == "likeend"; if (isLikeOp) { string raw = f.Value; string pattern; switch (op) { case "startwith": case "likestart": pattern = raw + "%"; break; case "endwith": case "likeend": pattern = "%" + raw; break; case "like": case "contains": default: pattern = "%" + raw + "%"; break; } string nameLike = $"p{index++}"; string placeholderLike = $"@{nameLike}"; AddWhereSugarParameter(parameters, placeholderLike, pattern, col); whereList.Add($"{LeftQuote}{col.ColumnName}{RightQuote} LIKE {placeholderLike}"); continue; } var valObj = ConvertValue(f.Value); if (valObj == null) continue; string name1 = $"p{index++}"; string placeholder1 = $"@{name1}"; AddWhereSugarParameter(parameters, placeholder1, valObj, col); switch (op) { case "gt": case ">": whereList.Add($"{LeftQuote}{col.ColumnName}{RightQuote} > {placeholder1}"); break; case ">=": case "thanorequal": whereList.Add($"{LeftQuote}{col.ColumnName}{RightQuote} >= {placeholder1}"); break; case "lt": case "<": whereList.Add($"{LeftQuote}{col.ColumnName}{RightQuote} < {placeholder1}"); break; case "<=": case "lessorequal": whereList.Add($"{LeftQuote}{col.ColumnName}{RightQuote} <= {placeholder1}"); break; case "neq": case "!=": case "<>": whereList.Add($"{LeftQuote}{col.ColumnName}{RightQuote} <> {placeholder1}"); break; case "eq": case "==": case "=": default: whereList.Add($"{LeftQuote}{col.ColumnName}{RightQuote} = {placeholder1}"); break; } } return provider; } /// /// 列是否为 Guid / uniqueidentifier 语义 /// internal static bool IsGuidColumn(TableColumnField col) { if (col == null) return false; if (col.GetDbType() == System.Data.DbType.Guid) return true; string t = (col.ColumnType ?? "").Trim().ToLowerInvariant(); return t == "guid" || t == "uniqueidentifier"; } } }