From 7ca9651f81d7b84f054194d3d46fdbd1d9c8b922 Mon Sep 17 00:00:00 2001 From: dengjunjie <dengjunjie@hnkhzn.com> Date: 星期三, 09 七月 2025 22:55:27 +0800 Subject: [PATCH] 增加质检出入库逻辑 --- 项目代码/WMS/WIDESEA_WMSServer/WIDESEA_Core/Utilities/EntityProperties.cs | 367 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 367 insertions(+), 0 deletions(-) diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_Core/Utilities/EntityProperties.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_Core/Utilities/EntityProperties.cs" new file mode 100644 index 0000000..84bc1c5 --- /dev/null +++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_Core/Utilities/EntityProperties.cs" @@ -0,0 +1,367 @@ +锘縰sing SqlSugar; +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using WIDESEA_Core.Const; +using WIDESEA_Core.Enums; +using WIDESEA_Core.Helper; + +namespace WIDESEA_Core.Utilities +{ + public static class EntityProperties + { + /// <summary> + /// 楠岃瘉鏁版嵁搴撳瓧娈电被鍨嬩笌鍊兼槸鍚︽纭紝 + /// </summary> + /// <param name="value">鍊�</param> + /// <param name="propertyInfo">瑕侀獙璇佺殑绫荤殑灞炴�э紝鑻ヤ笉涓簄ull锛屽垯浼氬垽鏂瓧绗︿覆鐨勯暱搴︽槸鍚︽纭�</param> + /// <returns>(bool, string, object)bool鎴愬惁鏍¢獙鎴愬姛,string鏍¢獙澶辫触淇℃伅,object,褰撳墠鏍¢獙鐨勫��</returns> + public static (bool, string, object) ValidationVal(this PropertyInfo propertyInfo, object value) + { + string dbType = ""; + SugarColumn sugarColumn = null; + if (propertyInfo != null) + { + sugarColumn = propertyInfo.GetCustomAttribute<SugarColumn>(); + dbType = propertyInfo.PropertyType != null ? propertyInfo.GetProperWithDbType() : SqlDbTypeName.NVarChar; + } + dbType = dbType.ToLower(); + string val = value?.ToString(); + //楠岃瘉闀垮害 + string reslutMsg = string.Empty; + if (dbType == SqlDbTypeName.Int) + { + if (!value.IsInt()) + reslutMsg = "鍙兘涓烘湁鏁堟暣鏁�"; + } //2021.10.12澧炲姞灞炴�ф牎楠宭ong绫诲瀷鐨勬敮鎸� + else if (dbType == SqlDbTypeName.BigInt) + { + if (!long.TryParse(val, out _)) + { + reslutMsg = "鍙兘涓烘湁鏁堟暣鏁�"; + } + } + else if (dbType == SqlDbTypeName.DateTime + || dbType == SqlDbTypeName.Date + || dbType == SqlDbTypeName.SmallDateTime + || dbType == SqlDbTypeName.SmallDate + ) + { + if (!value.IsDate()) + reslutMsg = "蹇呴』涓烘棩鏈熸牸寮�"; + } + else if (dbType == SqlDbTypeName.Float || dbType == SqlDbTypeName.Decimal || dbType == SqlDbTypeName.Double) + { + + if (!val.IsNumber(null)) + { + reslutMsg = "涓嶆槸鏈夋晥鏁板瓧"; + } + } + else if (dbType == SqlDbTypeName.UniqueIdentifier) + { + if (!val.IsGuid()) + { + reslutMsg = propertyInfo.Name + "Guid涓嶆纭�"; + } + } + else if (propertyInfo != null + && (dbType == SqlDbTypeName.VarChar + || dbType == SqlDbTypeName.NVarChar + || dbType == SqlDbTypeName.NChar + || dbType == SqlDbTypeName.Char + || dbType == SqlDbTypeName.Text)) + { + + //榛樿nvarchar(max) 銆乼ext 闀垮害涓嶈兘瓒呰繃20000 + if (val.Length > 200000) + { + reslutMsg = $"瀛楃闀垮害鏈�澶氥��200000銆�"; + } + else + { + + int length = sugarColumn.Length; + if (length == 0) { return (true, null, null); } + //鍒ゆ柇鍙屽瓧鑺備笌鍗曞瓧娈� + else if (length < 8000 && + ((dbType.Substring(0, 1) != "n" + && Encoding.UTF8.GetBytes(val.ToCharArray()).Length > length) + || val.Length > length) + ) + { + reslutMsg = $"鏈�澶氬彧鑳姐�恵length}銆戜釜瀛楃銆�"; + } + } + } + if (!string.IsNullOrEmpty(reslutMsg) && propertyInfo != null) + { + reslutMsg = sugarColumn.ColumnDescription + reslutMsg; + } + return (reslutMsg == "" ? true : false, reslutMsg, value); + } + + public static List<(bool, string, object)> ValidationValueForDbType(this PropertyInfo propertyInfo, params object[] values) + { + List<(bool, string, object)> result = new List<(bool, string, object)>(); + foreach (object value in values) + { + result.Add(propertyInfo.ValidationVal(value)); + } + return result; + } + + private static readonly Dictionary<Type, string> ProperWithDbType = new Dictionary<Type, string>() { + { typeof(string),SqlDbTypeName.NVarChar }, + { typeof(DateTime),SqlDbTypeName.DateTime}, + {typeof(long),SqlDbTypeName.BigInt }, + {typeof(int),SqlDbTypeName.Int}, + { typeof(decimal),SqlDbTypeName.Decimal }, + { typeof(float),SqlDbTypeName.Float }, + { typeof(double),SqlDbTypeName.Double }, + { typeof(byte),SqlDbTypeName.Int },//绫诲瀷寰呭畬 + { typeof(Guid),SqlDbTypeName.UniqueIdentifier} + }; + + public static string GetProperWithDbType(this PropertyInfo propertyInfo) + { + bool result = ProperWithDbType.TryGetValue(propertyInfo.PropertyType, out string value); + if (result) + { + return value; + } + return SqlDbTypeName.NVarChar; + } + + /// <summary> + /// 鍒ゆ柇hash鐨勫垪鏄惁涓哄搴旂殑瀹炰綋锛屽苟涓斿�兼槸鍚︽湁鏁� + /// </summary> + /// <param name="typeinfo"></param> + /// <param name="dic"></param> + /// <param name="removeNotContains">绉婚櫎涓嶅瓨鍦ㄥ瓧娈�</param> + /// <param name="removerKey">绉婚櫎涓婚敭</param> + /// <returns></returns> + public static string ValidateDicInEntity(this Type typeinfo, Dictionary<string, object> dic, bool removerKey, PropertyInfo[] propertyInfo, string[]? ignoreFields = null) + { + if (dic == null || dic.Count == 0) { return "鍙傛暟鏃犳晥"; } + + // 涓嶅瓨鍦ㄧ殑瀛楁鐩存帴绉婚櫎 + dic.Where(x => !propertyInfo.Any(p => p.Name == x.Key.FirstLetterToUpper())).Select(s => s.Key).ToList().ForEach(f => + { + dic.Remove(f); + }); + + string keyName = typeinfo.GetKeyName(); + //绉婚櫎涓婚敭 + if (removerKey) + dic.Remove(keyName); + //else + //{ + // if (!dic.ContainsKey(keyName)) + // return "璇蜂紶鍏ヤ富閿弬鏁�"; + //} + + foreach (PropertyInfo property in propertyInfo) + { + SugarColumn? sugarColumn = property.GetCustomAttribute<SugarColumn>(); + if (sugarColumn == null) + { + Navigate? navigate = property.GetCustomAttribute<Navigate>(); + if(navigate != null) + { + continue; + } + return "璇烽厤缃甋ugarColumn灞炴��"; + } + + //蹇界暐涓庝富閿殑瀛楁涓嶅仛楠岃瘉 + if (property.Name == keyName.FirstLetterToUpper() || (ignoreFields != null && ignoreFields.Contains(property.Name)) || sugarColumn.IsOnlyIgnoreInsert || sugarColumn.IsOnlyIgnoreUpdate || sugarColumn.IsIgnore) + continue; + + //涓嶅湪缂栬緫涓殑鍒楋紝鏄惁涔熻蹇呭~ + if (!dic.ContainsKey(property.Name.FirstLetterToLower()) /*&& !dic.ContainsKey(property.Name.FirstLetterToUpper())*/) + { + if (!sugarColumn.IsNullable) + { + if (sugarColumn.DefaultValue == null) + return sugarColumn.ColumnDescription + "涓哄繀椤绘彁浜ら」"; + continue; + } + continue; + } + if(dic[property.Name.FirstLetterToLower()] != null) + { + string str = dic[property.Name.FirstLetterToLower()].ToString(); + //灏嗘墍鏈夌┖鍊艰缃负null + if (str == string.Empty) + dic[property.Name.FirstLetterToLower()] = null; + } + + } + return string.Empty; + } + + public static string ValidateDicInEntity(this Type typeinfo, List<Dictionary<string, object>> dicList, bool removerKey, string[] ignoreFields = null) + { + PropertyInfo[] propertyInfo = typeinfo.GetProperties(); + string reslutMsg = string.Empty; + foreach (Dictionary<string, object> dic in dicList) + { + reslutMsg = typeinfo.ValidateDicInEntity(dic, removerKey, propertyInfo, ignoreFields); + if (!string.IsNullOrEmpty(reslutMsg)) + return reslutMsg; + } + return reslutMsg; + } + + public static string GetKeyName(this Type typeinfo) + { + return typeinfo.GetProperties().GetKeyName(); + } + + public static string GetKeyName(this PropertyInfo[] properties) + { + foreach (PropertyInfo property in properties) + { + SugarColumn? sugarColumn = property.GetCustomAttribute<SugarColumn>(); + if (sugarColumn != null) + { + if (sugarColumn.IsPrimaryKey) + return property.Name; + } + } + return null; + } + + public static PropertyInfo GetKeyProperty(this Type typeinfo) + { + PropertyInfo[] properties = typeinfo.GetProperties(); + foreach (PropertyInfo property in properties) + { + SugarColumn sugarColumn = property.GetCustomAttribute<SugarColumn>(); + if (sugarColumn?.IsPrimaryKey ?? false) + { + return property; + } + } + return null; + } + + public static Type GetDetailType(this Type typeinfo) + { + PropertyInfo[] properties = typeinfo.GetProperties(); + foreach (PropertyInfo property in properties) + { + Navigate? navigate = property.GetCustomAttribute<Navigate>(); + if (navigate is not null) + { + if (navigate.GetNavigateType() == NavigateType.OneToOne) + return property.PropertyType; + else + return property.PropertyType.GenericTypeArguments[0]; + } + } + return null; + } + + public static string GetMainIdByDetail(this Type typeinfo) + { + PropertyInfo[] properties = typeinfo.GetProperties(); + foreach (PropertyInfo property in properties) + { + Navigate? navigate = property.GetCustomAttribute<Navigate>(); + if (navigate is not null) + { + return navigate.GetName(); + } + } + return null; + } + + public static void SetDetailId<T>(this Type typeinfo, T enetiy, object id, string name) + { + PropertyInfo property = typeinfo.GetProperty(name); + if (property != null) + { + property.SetValue(enetiy, id); + } + } + + public static PropertyInfo? GetNavigatePro(this Type typeinfo) + { + PropertyInfo[] properties = typeinfo.GetProperties(); + foreach (PropertyInfo property in properties) + { + Navigate? navigate = property.GetCustomAttribute<Navigate>(); + if (navigate is not null) + { + return property; + } + } + return null; + } + + public static object GetPropertyValue<T>(this Type typeinfo, T data, string propertyName) + { + if (typeinfo != typeof(T)) + return null; + + PropertyInfo? property = typeinfo.GetProperty(propertyName); + if (property != null) + { + return property.GetValue(data); + } + return null; + } + + public static void ValidatePageOptions<TEntity>(PageDataOptions options, ref ISugarQueryable<TEntity> sugarQueryable) + { + string where = string.Empty; + PropertyInfo[] entityProperties = typeof(TEntity).GetProperties(); + List<SearchParameters> searchParametersList = new List<SearchParameters>(); + if (options.Filter != null && options.Filter.Count > 0) + { + searchParametersList.AddRange(options.Filter); + } + else if (!string.IsNullOrEmpty(options.Wheres)) + { + try + { + searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>(); + options.Filter = searchParametersList; + } + catch { } + } + for (int i = 0; i < searchParametersList.Count; i++) + { + if (string.IsNullOrEmpty(searchParametersList[i].Value)) + { + continue; + } + + PropertyInfo? property = entityProperties.Where(c => c.Name.ToUpper() == searchParametersList[i].Name.ToUpper()).FirstOrDefault(); + + if (property == null) continue; + + List<(bool, string, object)> results = property.ValidationValueForDbType(searchParametersList[i].Value.Split(',')).ToList(); + if (results == null || results.Count() == 0) + { + continue; + } + for (int j = 0; j < results.Count(); j++) + { + LinqExpressionType expressionType = searchParametersList[i].DisplayType.GetLinqCondition(); + Expression<Func<TEntity, bool>> expression = property.GetWhereExpression<TEntity>(results[j].Item3, null, expressionType); + sugarQueryable = sugarQueryable.Where(expression); + } + } + } + } +} -- Gitblit v1.9.3