From 595df5dac0a782bfdadab766b4dd62d326b0a383 Mon Sep 17 00:00:00 2001
From: 小飞侠 <8277136+liaoxujun@user.noreply.gitee.com>
Date: 星期二, 21 十月 2025 14:53:04 +0800
Subject: [PATCH] 增加川印设备维修回写
---
cylsg/cylsg.utility/CommonHelper.cs | 171 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 168 insertions(+), 3 deletions(-)
diff --git a/cylsg/cylsg.utility/CommonHelper.cs b/cylsg/cylsg.utility/CommonHelper.cs
index 978d033..9ad189f 100644
--- a/cylsg/cylsg.utility/CommonHelper.cs
+++ b/cylsg/cylsg.utility/CommonHelper.cs
@@ -1,15 +1,22 @@
-锘縰sing System;
+锘縰sing cylsg.utility.Extend;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Linq;
+using System.Linq.Expressions;
+using System.Net.Http.Json;
using System.Reflection;
using System.Runtime.Loader;
using System.Security.Cryptography;
using System.Text;
+using System.Text.Json.Serialization;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
+using static cylsg.utility.untilityModels;
namespace cylsg.utility
{
@@ -818,12 +825,165 @@
#endregion
+ /// <summary>
+ /// 鏍规嵁json瀛楃绌垮鐞�
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <param name="jsonString"></param>
+ /// <param name="parameter"></param>
+ /// <returns></returns>
+ private static Expression<Func<T, bool>> CreateWhereExpressionRecursive<T>(string jsonString, ParameterExpression parameter)
+ {
+ var conditions = new List<Expression>();
+
+ JObject jsonObject = JObject.Parse(jsonString);
+
+ foreach (var property in jsonObject.Properties())
+ {
+ var propertyName = property.Name;
+ var propertyValue = property.Value.ToString();
+ if (propertyValue == "") //绌哄�间笉澶勭悊
+ continue;
+ var propertyInfo = typeof(T).GetProperty(propertyName);
+
+ if (propertyInfo == null)
+ {
+ propertyInfo = typeof(T).GetProperty(propertyName.FirstToCapitalize());
+ if (propertyInfo == null)
+ continue; // 濡傛灉灞炴�т笉瀛樺湪锛岃烦杩�
+ }
+
+ var propertyType = propertyInfo.PropertyType;
+ var TypeName = propertyType.GenericTypeArguments.Length > 0 ? propertyType.GenericTypeArguments[0].Name + "?" : propertyType.Name;
+ if (propertyType.IsClass && TypeName != "String")
+ {
+ // 閫掑綊澶勭悊宓屽妯″瀷
+ var nestedParameter = Expression.Parameter(propertyType, propertyName);
+ var nestedJsonString = property.Value.ToString();
+
+ // 浣跨敤 MakeGenericType 鍔ㄦ�佸垱寤烘硾鍨嬫柟娉�
+ var genericMethod = typeof(CommonHelper).GetMethod("CreateWhereExpressionRecursive", BindingFlags.Static | BindingFlags.NonPublic)
+ .MakeGenericMethod(propertyType);
+
+ // 璋冪敤娉涘瀷鏂规硶骞惰幏鍙栬繑鍥炵殑琛ㄨ揪寮�
+ var nestedConditions = (Expression<Func<object, bool>>)genericMethod.Invoke(null, new object[] { nestedJsonString, nestedParameter });
+
+ var propExpr = Expression.Property(parameter, propertyName);
+ var lambda = Expression.Lambda(nestedConditions.Body, nestedParameter);
+ var invoke = Expression.Invoke(lambda, propExpr);
+ conditions.Add(invoke);
+ }
+ else if (propertyType == typeof(string))
+ {
+ var propExpr = Expression.Property(parameter, propertyName);
+ var constant = Expression.Constant(propertyValue);
+
+ var containsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) });
+ var containsExpression = Expression.Call(propExpr, containsMethod, constant);
+ conditions.Add(containsExpression);
+ }
+ else if (TypeName.Contains( "DateTime")) //鍏煎DateTime锛�
+ {
+ var dateRange = propertyValue.Split('~');
+ if (dateRange.Length == 2)
+ {
+ var startDate = DateTime.Parse(dateRange[0]);
+ var endDate = DateTime.Parse(dateRange[1]);
+
+ var propExpr = Expression.Property(parameter, propertyName);
+ var startConstant = Expression.Constant(startDate);
+ var endConstant = Expression.Constant(endDate);
+ if (TypeName == "DateTime?")
+ // 灏嗗父閲忚〃杈惧紡杞崲涓� Nullable<DateTime>
+ {
+ var startNullableConstant = Expression.Convert(startConstant, typeof(DateTime?));
+ var endNullableConstant = Expression.Convert(endConstant, typeof(DateTime?));
+
+
+ var greaterThanOrEqual = Expression.GreaterThanOrEqual(propExpr, startNullableConstant);
+ var lessThanOrEqual = Expression.LessThanOrEqual(propExpr, endNullableConstant);
+
+
+ var andExpression = Expression.AndAlso(greaterThanOrEqual, lessThanOrEqual);
+ conditions.Add(andExpression);
+ }
+ else
+ {
+
+ var greaterThanOrEqual = Expression.GreaterThanOrEqual(propExpr, startConstant);
+ var lessThanOrEqual = Expression.LessThanOrEqual(propExpr, endConstant);
+
+
+ var andExpression = Expression.AndAlso(greaterThanOrEqual, lessThanOrEqual);
+ conditions.Add(andExpression);
+
+ }
+ }
+ else if (DateTime.TryParse(propertyValue, out var dateTime))
+ {
+ var propExpr = Expression.Property(parameter, propertyName);
+ var constant = Expression.Constant(dateTime);
+ var equalExpression = Expression.Equal(propExpr, constant);
+ conditions.Add(equalExpression);
+ }
+ }
+ else
+ {
+ var propExpr = Expression.Property(parameter, propertyName);
+ var constant = Expression.Constant(Convert.ChangeType(propertyValue, propertyType));
+ var equalExpression = Expression.Equal(propExpr, constant);
+ conditions.Add(equalExpression);
+ }
+ }
+
+ var body = conditions.Count > 1 ? conditions.Aggregate(Expression.AndAlso) : conditions.FirstOrDefault();
+ return Expression.Lambda<Func<T, bool>>(body ?? Expression.Constant(true), parameter);
+ }
+
+ /// <summary>
+ /// json鏍煎紡鍖栦负琛ㄨ揪寮忔爲
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <param name="jsonString"></param>
+ /// <returns></returns>
+ public static Expression<Func<T, bool>> FormatWhereExpression<T>(string jsonString)
+ {
+ var parameter = Expression.Parameter(typeof(T), "x");
+ return CreateWhereExpressionRecursive<T>(jsonString, parameter);
+ }
+
+ /// <summary>
+ /// 鏇村叿灞炴�у悕绉扮敓鎴愯〃杈惧紡鏍戯紝濡倄.id
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <param name="propertyName"></param>
+ /// <returns></returns>
+ public static Expression<Func<T, object>> FormatPropertyExpression<T>(string propertyName)
+ {
+ // 鑾峰彇鍙傛暟琛ㄨ揪寮�
+ var parameter = Expression.Parameter(typeof(T), "x");
+
+ // 鑾峰彇灞炴�ц〃杈惧紡
+ var propertyAccess = Expression.PropertyOrField(parameter, propertyName);
+ if (propertyAccess == null)
+ {
+ ///棣栧瓧姣嶈浆澶у啓
+ propertyAccess = Expression.PropertyOrField(parameter, propertyName.FirstToCapitalize());
+ }
+
+
+ // 鍒涘缓 Lambda 琛ㄨ揪寮忥紝骞跺湪杩斿洖鍊间腑杩涜绫诲瀷杞崲
+ return Expression.Lambda<Func<T, object>>(
+ Expression.Convert(propertyAccess, typeof(object)),
+ parameter);
+ }
+
+
+ }
-
- }
/// <summary>
/// 鏋氫妇椤瑰睘鎬�
@@ -847,4 +1007,9 @@
[Description("鏋氫妇椤瑰睘鎬�")]
public string? Description { get; set; }
}
+
+
+
+
+
}
--
Gitblit v1.9.1