From f43b7df8400f4fcffc9f19dca0888d61e2b33d5f Mon Sep 17 00:00:00 2001
From: dengjunjie <dengjunjie@hnkhzn.com>
Date: 星期三, 12 三月 2025 18:41:52 +0800
Subject: [PATCH] WMS系统添加PDA权限,PDA程序

---
 项目代码/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