|  |  | 
 |  |  | using Magicodes.ExporterAndImporter.Core; | 
 |  |  | using AutoMapper.Execution; | 
 |  |  | using Magicodes.ExporterAndImporter.Core; | 
 |  |  | using Magicodes.ExporterAndImporter.Core.Models; | 
 |  |  | using Magicodes.ExporterAndImporter.Excel; | 
 |  |  | using Microsoft.AspNetCore.Http; | 
 |  |  | using Microsoft.AspNetCore.Mvc.RazorPages; | 
 |  |  | using Microsoft.Extensions.Options; | 
 |  |  | using Newtonsoft.Json; | 
 |  |  | using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; | 
 |  |  | using SqlSugar; | 
 |  |  | using System.Drawing.Drawing2D; | 
 |  |  | using System.Dynamic; | 
 |  |  | using System.Linq.Expressions; | 
 |  |  | using System.Reflection; | 
 |  |  | using System.Reflection.Metadata; | 
 |  |  | using WIDESEA_Core.BaseRepository; | 
 |  |  | using WIDESEA_Core.Const; | 
 |  |  | using WIDESEA_Core.DB.Models; | 
 |  |  | using WIDESEA_Core.Enums; | 
 |  |  | using WIDESEA_Core.Helper; | 
 |  |  | using WIDESEA_Core.HostedService; | 
 |  |  | using WIDESEA_Core.Utilities; | 
 |  |  | using static OfficeOpenXml.ExcelErrorValue; | 
 |  |  | using ICacheService = WIDESEA_Core.Caches.ICacheService; | 
 |  |  |  | 
 |  |  | namespace WIDESEA_Core.BaseServices | 
 |  |  | { | 
 |  |  | 
 |  |  |         public virtual PageGridData<TEntity> GetPageData(PageDataOptions options) | 
 |  |  |         { | 
 |  |  |             string wheres = options.ValidatePageOptions(TProperties); | 
 |  |  |  | 
 |  |  |  | 
 |  |  |             //Expression<Func<TEntity, bool>> test = ValidatePageOptions(options, _propertyInfo); | 
 |  |  |  | 
 |  |  |             //è·åæåºå段 | 
 |  |  |             Dictionary<string, OrderByType> orderbyDic = options.GetPageDataSort(TProperties); | 
 |  |  |  | 
 |  |  |             PageGridData<TEntity> pageGridData = new PageGridData<TEntity>(); | 
 |  |  |             pageGridData = BaseDal.QueryPage(wheres, options.Page, options.Rows, orderbyDic); | 
 |  |  |             string dataWheres = GetDataRole(typeof(TEntity)); | 
 |  |  |             if (!string.IsNullOrEmpty(wheres)) | 
 |  |  |             { | 
 |  |  |                 dataWheres += " and "; | 
 |  |  |             } | 
 |  |  |             pageGridData = BaseDal.QueryPage(dataWheres + wheres, options.Page, options.Rows, orderbyDic); | 
 |  |  |             //int count = 0; | 
 |  |  |             //ISugarQueryable<TEntity> sugarQueryable = BaseDal.Db.Queryable<TEntity>().Where(dataWheres); | 
 |  |  |             //ValidatePageOptions(options, _propertyInfo, ref sugarQueryable); | 
 |  |  |             //List<TEntity> rows = sugarQueryable.ToPageList(options.Page, options.Rows, ref count); | 
 |  |  |  | 
 |  |  |             //PageGridData<TEntity> pageGridData = new PageGridData<TEntity>() | 
 |  |  |             //{ | 
 |  |  |             //    Rows = rows, | 
 |  |  |             //    Total = count, | 
 |  |  |             //}; | 
 |  |  |             return pageGridData; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         protected void ValidatePageOptions(PageDataOptions options, PropertyInfo[] entityProperties, ref ISugarQueryable<TEntity> sugarQueryable) | 
 |  |  |         { | 
 |  |  |             string where = string.Empty; | 
 |  |  |             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 = GetWhereExpression(property.Name, results[j].Item3, null, expressionType); | 
 |  |  |                     sugarQueryable = sugarQueryable.Where(expression); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         protected Expression<Func<TEntity, bool>> GetWhereExpression(string propertyName, object propertyValue, ParameterExpression parameter, LinqExpressionType expressionType) | 
 |  |  |         { | 
 |  |  |             Type proType = typeof(TEntity).GetProperty(propertyName).PropertyType; | 
 |  |  |             ConstantExpression constant = proType.ToString() == "System.String" | 
 |  |  |                ? Expression.Constant(propertyValue) : Expression.Constant(propertyValue.ToString().ChangeType(proType)); | 
 |  |  |  | 
 |  |  |             // DateTimeåªéæ©äºæ¥æçæ¶åèªå¨å¨ç»ææ¥æå ä¸å¤©ï¼ä¿®å¤DateTimeç±»åä½¿ç¨æ¥æåºé´æ¥è¯¢æ æ³æ¥è¯¢å°ç»ææ¥æçé®é¢ | 
 |  |  |             if ((proType == typeof(DateTime) || proType == typeof(DateTime?)) && expressionType == LinqExpressionType.LessThanOrEqual && propertyValue.ToString().Length == 10) | 
 |  |  |             { | 
 |  |  |                 constant = Expression.Constant(Convert.ToDateTime(propertyValue.ToString()).AddDays(1)); | 
 |  |  |             } | 
 |  |  |             parameter = parameter ?? Expression.Parameter(typeof(TEntity), "x"); | 
 |  |  |             //å建èç¹ç屿§p=>p.name å±æ§name | 
 |  |  |             MemberExpression memberProperty = Expression.PropertyOrField(parameter, propertyName); | 
 |  |  |             UnaryExpression member = Expression.Convert(memberProperty, constant.Type); | 
 |  |  |             Expression<Func<TEntity, bool>> expression = p => false; | 
 |  |  |             switch (expressionType) | 
 |  |  |             { | 
 |  |  |                 //p=>p.propertyName == propertyValue | 
 |  |  |                 case LinqExpressionType.Equal: | 
 |  |  |                     expression = Expression.Lambda<Func<TEntity, bool>>(Expression.Equal(member, constant), parameter); | 
 |  |  |                     break; | 
 |  |  |                 //p=>p.propertyName != propertyValue | 
 |  |  |                 case LinqExpressionType.NotEqual: | 
 |  |  |                     expression = Expression.Lambda<Func<TEntity, bool>>(Expression.NotEqual(member, constant), parameter); | 
 |  |  |                     break; | 
 |  |  |                 //   p => p.propertyName > propertyValue | 
 |  |  |                 case LinqExpressionType.GreaterThan: | 
 |  |  |                     expression = Expression.Lambda<Func<TEntity, bool>>(Expression.GreaterThan(member, constant), parameter); | 
 |  |  |                     break; | 
 |  |  |                 //   p => p.propertyName < propertyValue | 
 |  |  |                 case LinqExpressionType.LessThan: | 
 |  |  |                     expression = Expression.Lambda<Func<TEntity, bool>>(Expression.LessThan(member, constant), parameter); | 
 |  |  |                     break; | 
 |  |  |                 // p => p.propertyName >= propertyValue | 
 |  |  |                 case LinqExpressionType.ThanOrEqual: | 
 |  |  |                     expression = Expression.Lambda<Func<TEntity, bool>>(Expression.GreaterThanOrEqual(member, constant), parameter); | 
 |  |  |                     break; | 
 |  |  |                 // p => p.propertyName <= propertyValue | 
 |  |  |                 case LinqExpressionType.LessThanOrEqual: | 
 |  |  |                     expression = Expression.Lambda<Func<TEntity, bool>>(Expression.LessThanOrEqual(member, constant), parameter); | 
 |  |  |                     break; | 
 |  |  |                 //   p => p.propertyName.Contains(propertyValue) | 
 |  |  |                 // p => !p.propertyName.Contains(propertyValue) | 
 |  |  |                 case LinqExpressionType.Contains: | 
 |  |  |                 case LinqExpressionType.NotContains: | 
 |  |  |                     MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) }); | 
 |  |  |                     constant = Expression.Constant(propertyValue, typeof(string)); | 
 |  |  |                     if (expressionType == LinqExpressionType.Contains) | 
 |  |  |                     { | 
 |  |  |                         expression = Expression.Lambda<Func<TEntity, bool>>(Expression.Call(member, method, constant), parameter); | 
 |  |  |                     } | 
 |  |  |                     else | 
 |  |  |                     { | 
 |  |  |                         expression = Expression.Lambda<Func<TEntity, bool>>(Expression.Not(Expression.Call(member, method, constant)), parameter); | 
 |  |  |                     } | 
 |  |  |                     break; | 
 |  |  |                 default: | 
 |  |  |                     //  | 
 |  |  |                     expression = p => false; | 
 |  |  |                     break; | 
 |  |  |             } | 
 |  |  |             return expression; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         private string GetDataRole(Type type) | 
 |  |  |         { | 
 |  |  |             try | 
 |  |  |             { | 
 |  |  |                 UserRole? userRole = PermissionDataHostService.UserRoles.FirstOrDefault(x => x.UserId == App.User.UserId); | 
 |  |  |                 if (userRole == null) | 
 |  |  |                     throw new Exception($"æ æé"); | 
 |  |  |  | 
 |  |  |                 if (type.IsAssignableFrom(typeof(BaseWarehouseEntity)) || type.GetProperty(nameof(BaseWarehouseEntity.WarehouseId)) != null) | 
 |  |  |                 { | 
 |  |  |                     if (userRole.WarehouseIds.Count > 0) | 
 |  |  |                     { | 
 |  |  |                         return $"{nameof(BaseWarehouseEntity.WarehouseId)} in ({userRole.WarehouseIds.Serialize().Replace("[", "").Replace("]", "")})"; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     else | 
 |  |  |                         return $"1 != 1"; | 
 |  |  |                 } | 
 |  |  |                 else | 
 |  |  |                 { | 
 |  |  |                     return "1 = 1"; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 //UserRole? userRole = PermissionDataHostService.UserRoles.FirstOrDefault(x => x.UserId == App.User.UserId); | 
 |  |  |                 //if (userRole == null) | 
 |  |  |                 //    throw new Exception($"æ æé"); | 
 |  |  |  | 
 |  |  |                 //if (userRole.AuthorityScope == (int)AuthorityScopeEnum.CurrentRole) | 
 |  |  |                 //{ | 
 |  |  |                 //    List<int> userId = PermissionDataHostService.UserRoles.Where(x => x.RoleId == userRole.RoleId).Select(x => x.UserId).ToList(); | 
 |  |  |                 //    return $"creater in ({userId.Serialize()})"; | 
 |  |  |                 //} | 
 |  |  |                 //else if (userRole.AuthorityScope == (int)AuthorityScopeEnum.OnlySelf) | 
 |  |  |                 //{ | 
 |  |  |                 //    return $"creater = '{userRole.UserName}'"; | 
 |  |  |                 //} | 
 |  |  |                 //else if (userRole.AuthorityScope == (int)AuthorityScopeEnum.None) | 
 |  |  |                 //{ | 
 |  |  |                 //    return $"1 != 1"; | 
 |  |  |                 //} | 
 |  |  |                 //return ""; | 
 |  |  |             } | 
 |  |  |             catch (Exception ex) | 
 |  |  |             { | 
 |  |  |                 throw new Exception($"æ æéï¼{ex.Message}"); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public virtual object GetDetailPage(PageDataOptions pageData) | 
 |  |  |         { | 
 |  |  |             Type t = typeof(TEntity); |