// // Copyright (c) 2019 openauth.net.cn. All rights reserved. // // www.cnblogs.com/yubaolee // 2019-03-05 // 流程中的连线 using System.Collections.Generic; using System.Linq; using Infrastructure; using Infrastructure.Extensions; using Newtonsoft.Json.Linq; namespace OpenAuth.App.Flow { /// /// 流程连线 /// public class FlowLine { public string id { get; set; } public string label { get; set; } public string type { get; set; } public string from { get; set; } public string to { get; set; } public string name { get; set; } public bool dash { get; set; } /// 分支条件 public List Compares { get; set; } public bool Compare(JObject frmDataJson) { bool result = true; foreach (var compare in Compares) { object objVal = frmDataJson.GetValue(compare.FieldName.ToLower()); string fieldVal = null; List fieldVals = new List(); if(compare.FieldType == "checkbox") { if (objVal is JArray jArray) { var tempvals = jArray.ToObject>(); if (tempvals != null && tempvals.Any()) { fieldVals.AddRange(tempvals); } } } else { fieldVal = objVal?.ToString(); } // 判断是否为空值操作符 if (compare.Operation == DataCompare.IsNull || compare.Operation == DataCompare.IsNotNull) { var fieldExists = objVal != null; var fieldEmpty = !fieldExists || string.IsNullOrWhiteSpace(objVal.ToString()); if (compare.Operation == DataCompare.IsNull) { result &= fieldEmpty; } else { result &= !fieldEmpty; } continue; } // 确保字段存在且不为空 if (objVal == null) { result = false; continue; } // checkbox类型特殊处理 if (compare.FieldType == "checkbox") { // 针对checkbox的IN和NOT IN操作 if (compare.Operation == DataCompare.In || compare.Operation == DataCompare.NotIn) { if (compare.ValueList == null || compare.ValueList.Length == 0) { result = false; continue; } // 检查是否有交集 bool hasIntersection = fieldVals.Any(v => compare.ValueList.Contains(v)); result &= compare.Operation == DataCompare.In ? hasIntersection : !hasIntersection; continue; } // 针对checkbox的相等和不等操作 if (compare.Operation == DataCompare.Equal) { result &= fieldVals.Contains(compare.Value); continue; } else if (compare.Operation == DataCompare.NotEqual) { result &= !fieldVals.Contains(compare.Value); continue; } // 其他操作不适用于checkbox,默认为false result = false; continue; } // 以下是非checkbox类型的处理逻辑 // 范围操作符处理 if (compare.Operation == DataCompare.In || compare.Operation == DataCompare.NotIn) { if (compare.ValueList == null || compare.ValueList.Length == 0) { result = false; continue; } bool inList = compare.ValueList.Contains(fieldVal); result &= compare.Operation == DataCompare.In ? inList : !inList; continue; } // Between操作符处理 if (compare.Operation == DataCompare.Between) { if (compare.ValueRange == null || compare.ValueRange.Length != 2) { result = false; continue; } bool isDecimal = decimal.TryParse(fieldVal, out decimal fieldDecimal); if (isDecimal) { decimal min = decimal.Parse(compare.ValueRange[0]); decimal max = decimal.Parse(compare.ValueRange[1]); result &= fieldDecimal >= min && fieldDecimal <= max; } else { string min = compare.ValueRange[0]; string max = compare.ValueRange[1]; result &= string.Compare(fieldVal, min, false) >= 0 && string.Compare(fieldVal, max, false) <= 0; } continue; } // 文本特殊操作符处理 if (compare.Operation == DataCompare.Like || compare.Operation == DataCompare.NotLike || compare.Operation == DataCompare.StartWith || compare.Operation == DataCompare.EndWith) { switch (compare.Operation) { case DataCompare.Like: result &= fieldVal.Contains(compare.Value); break; case DataCompare.NotLike: result &= !fieldVal.Contains(compare.Value); break; case DataCompare.StartWith: result &= fieldVal.StartsWith(compare.Value); break; case DataCompare.EndWith: result &= fieldVal.EndsWith(compare.Value); break; } continue; } bool isDecimalValue = decimal.TryParse(compare.Value, out decimal value); if (isDecimalValue) //如果是数字或小数 { decimal frmvalue = decimal.Parse(fieldVal); switch (compare.Operation) { case DataCompare.Equal: result &= frmvalue == value; break; case DataCompare.Larger: result &= frmvalue > value; break; case DataCompare.Less: result &= frmvalue < value; break; case DataCompare.LargerEqual: result &= frmvalue >= value; break; case DataCompare.LessEqual: result &= frmvalue <= value; break; case DataCompare.NotEqual: result &= frmvalue != value; break; } } else //如果只是字符串 { switch (compare.Operation) { case DataCompare.Equal: result &= compare.Value == fieldVal; break; case DataCompare.Larger: result &= string.Compare(fieldVal, compare.Value, false) > 0; break; case DataCompare.Less: result &= string.Compare(fieldVal, compare.Value, false) < 0; break; case DataCompare.LargerEqual: result &= string.Compare(fieldVal, compare.Value, false) >= 0; break; case DataCompare.LessEqual: result &= string.Compare(fieldVal, compare.Value, false) <= 0; break; case DataCompare.NotEqual: result &= compare.Value != fieldVal; break; } } } return result; } } /// /// 分支条件 /// public class DataCompare { // 基本比较操作符 public const string Larger = ">"; public const string Less = "<"; public const string LargerEqual = ">="; public const string LessEqual = "<="; public const string NotEqual = "!="; public const string Equal = "="; // 文本操作符 public const string Like = "LIKE"; public const string NotLike = "NOT LIKE"; public const string StartWith = "START_WITH"; public const string EndWith = "END_WITH"; // 范围操作符 public const string In = "IN"; public const string NotIn = "NOT IN"; public const string Between = "BETWEEN"; // 空值操作符 public const string IsNull = "IS NULL"; public const string IsNotNull = "IS NOT NULL"; /// 操作类型比如大于/等于/小于 public string Operation { get; set; } /// form种的字段名称 public string FieldName { get; set; } /// 字段类型:"form":为表单中的字段,后期扩展系统表等. public string FieldType { get; set; } /// 比较的值 public string Value { get; set; } /// 值范围BETWEEN public string[] ValueRange { get; set; } /// IN 和 NOT IN 操作符 public string[] ValueList { get; set; } } }