using Newtonsoft.Json; using PropertyChanged; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BDU.Models { [AddINotifyPropertyChangedInterface] public class ParameterModel { #region 构造函数 public ParameterModel() { } public ParameterModel(ParameterModel source) { if (source == null) return; ID = source.ID; Name = source.Name; Type = source.Type; Category = source.Category; IsUseVar = source.IsUseVar; IsSave = source.IsSave; VariableName = source.VariableName; VariableID = source.VariableID; IsGlobal = source.IsGlobal; Value = source.Value; LowerLimit = source.LowerLimit; UpperLimit = source.UpperLimit; IsOutputToReport = source.IsOutputToReport; } #endregion public Guid ID { get; set; } = Guid.NewGuid(); public bool IsVisible { get; set; } = true; public string Name { get; set; } public Type? Type { get; set; } = typeof(string); public ParameterCategory Category { get; set; } = ParameterCategory.Temp; public bool IsGlobal { get; set; } public object? Value { get; set; } public object? LowerLimit { get; set; } public object? UpperLimit { get; set; } public bool Result { get; set; } = true; public bool IsUseVar { get; set; } public bool IsSave { get; set; } public string? VariableName { get; set; } public Guid? VariableID { get; set; } /// /// 是否输出到报告(仅对输出参数有效,默认为false) /// public bool IsOutputToReport { get; set; } = false; public enum ParameterCategory { Input, Output, Temp } public object? GetActualValue(Dictionary paraList) { // 用于检测循环引用的哈希集合 HashSet visitedIds = []; ParameterModel current = this; while (current != null) { // 如果没有使用变量,则返回值 if (!current.IsUseVar) { return current.Value; } // 检测循环引用 if (visitedIds.Contains(current.ID)) { return null; } visitedIds.Add(current.ID); // 如果当前参数没有关联变量,则返回其实际值 if (current.VariableID == null) { if (Type != null && Value != null) { try { return Convert.ChangeType(Value, Type); } catch { return Value; } } } // 查找下一个关联参数 ParameterModel? next = paraList[(Guid)current.VariableID!]; if (next == null) { return null; } current = next; } return null; } /// /// 获取方法步骤中的返回值映射的主程序参数 /// /// /// public ParameterModel? GetCurrentParameter(Dictionary paraList) { // 用于检测循环引用的哈希集合 HashSet visitedIds = new HashSet(); ParameterModel current = this; while (current != null) { // 如果没有使用变量,则返回值 if (current.VariableID == null) { return current; } // 检测循环引用 if (visitedIds.Contains(current.ID)) { return null; } visitedIds.Add(current.ID); // 如果当前参数没有关联变量,则返回其实际值 if (current.VariableID == null) { if (Type != null && Value != null) { try { return current; } catch { return null; } } } // 查找下一个关联参数 ParameterModel? next = paraList[(Guid)current.VariableID!]; if (next == null) { return null; } current = next; } return null; } public (bool, string?) GetResult() { if (Type == typeof(string) && (!string.IsNullOrWhiteSpace(LowerLimit?.ToString()) || !string.IsNullOrWhiteSpace(UpperLimit?.ToString()))) { return (true, $"参数 [ {Name}({Type}) ] 不可比较"); } // 当值或限制条件不存在时返回true if (Value == null || (LowerLimit == null && UpperLimit == null)) { return (true, null); } // 检查空字符串情况 if (string.IsNullOrWhiteSpace(Value?.ToString()) || (string.IsNullOrWhiteSpace(LowerLimit?.ToString()) && string.IsNullOrWhiteSpace(UpperLimit?.ToString()))) { return (true, null); } // 尝试将值转换为可比较的类型 try { object? comparableValue = ConvertToComparable(Value); object? comparableLower = LowerLimit != null ? ConvertToComparable(LowerLimit) : null; object? comparableUpper = UpperLimit != null ? ConvertToComparable(UpperLimit) : null; if (comparableValue == null) { return (true, $"参数 [ {Name}({Type}) ] 不可比较"); } bool lowerValid = true; bool upperValid = true; // 处理下限比较 if (comparableLower != null) { lowerValid = CompareValues(comparableValue, comparableLower) >= 0; } // 处理上限比较 if (comparableUpper != null) { upperValid = CompareValues(comparableValue, comparableUpper) <= 0; } return (lowerValid && upperValid, null); } catch (Exception ex) { return (true, $"参数 [ {Name}({Type}) ] 上下限比较失败:{ex.Message}"); } } private static object? ConvertToComparable(object value) { if (value is IConvertible convertible) { // 尝试转换为最适合比较的类型 try { return convertible.ToDouble(null); } catch { } try { return convertible.ToDateTime(null); } catch { } } return null; } private static int CompareValues(object a, object b) { // 优先尝试数值比较 if (a is double aDouble && b is double bDouble) { return aDouble.CompareTo(bDouble); } // 尝试日期比较 if (a is DateTime aDate && b is DateTime bDate) { return aDate.CompareTo(bDate); } return 0; } } }