fix conditions logic

This commit is contained in:
2026-09-11 23:52:11 +03:30
parent 8eb465c0e7
commit a48deb95da
19 changed files with 2545 additions and 453 deletions

View File

@@ -63,37 +63,74 @@ public sealed class DeviceRelay
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }
/// <summary>قوانین روشن/خاموش شدن رله</summary>
public ICollection<RelayRule> Rules { get; set; } = new List<RelayRule>();
/// <summary>گروه‌های شرط روشن/خاموش شدن رله (گروه‌ها با OR ترکیب می‌شوند)</summary>
public ICollection<RelayRuleGroup> RuleGroups { get; set; } = new List<RelayRuleGroup>();
}
/// <summary>
/// یک قانون برای روشن یا خاموش کردن رله بر اساس سنسورها
/// یک گروه شرط برای روشن یا خاموش کردن رله.
/// داخل هر گروه شرایط با AND ترکیب می‌شوند؛ گروه‌های هم‌عمل با OR.
/// </summary>
public sealed class RelayRule
public sealed class RelayRuleGroup
{
public int Id { get; set; }
public int DeviceRelayId { get; set; }
public DeviceRelay DeviceRelay { get; set; } = null!;
/// <summary>اقدام: روشن یا خاموش کردن رله</summary>
public RelayAction Action { get; set; } = RelayAction.On;
/// <summary>برچسب اختیاری گروه (مثلاً «ایمنی»، «خنک‌سازی») برای استفاده در لاگ/اعلان</summary>
public string? Label { get; set; }
/// <summary>ترتیب گروه‌ها</summary>
public int Order { get; set; }
/// <summary>شرایط داخل این گروه (AND)</summary>
public ICollection<RelayRuleCondition> Conditions { get; set; } = new List<RelayRuleCondition>();
}
/// <summary>
/// نوع یک شرط رله: سنسوری یا زمانی
/// </summary>
public enum RelayConditionType
{
Sensor = 0,
Time = 1
}
/// <summary>
/// یک شرط واحد داخل گروه (سنسوری یا بازه زمانی)
/// </summary>
public sealed class RelayRuleCondition
{
public int Id { get; set; }
public int RelayRuleGroupId { get; set; }
public RelayRuleGroup RelayRuleGroup { get; set; } = null!;
/// <summary>نوع شرط: سنسوری یا زمانی</summary>
public RelayConditionType ConditionType { get; set; } = RelayConditionType.Sensor;
// ---- شرط سنسوری ----
/// <summary>نوع سنسور: دما، رطوبت، خاک، گاز، نور</summary>
public SensorType SensorType { get; set; }
public SensorType? SensorType { get; set; }
/// <summary>نوع مقایسه: بزرگتر، کوچکتر، بین، خارج از محدوده</summary>
public ComparisonType ComparisonType { get; set; }
public ComparisonType? ComparisonType { get; set; }
/// <summary>مقدار عددی اول</summary>
public decimal Value1 { get; set; }
public decimal? Value1 { get; set; }
/// <summary>مقدار عددی دوم (برای بین و خارج از محدوده)</summary>
public decimal? Value2 { get; set; }
/// <summary>اقدام: روشن یا خاموش کردن رله</summary>
public RelayAction Action { get; set; } = RelayAction.On;
// ---- شرط زمانی ----
/// <summary>شروع بازه به دقیقه از نیمه‌شب (۰ تا ۱۴۳۹)</summary>
public int? StartMinutes { get; set; }
/// <summary>زمان اعمال: روز، شب، همیشه</summary>
public AlertTimeType TimeType { get; set; } = AlertTimeType.Always;
/// <summary>پایان بازه به دقیقه از نیمه‌شب (۰ تا ۱۴۳۹) — اگر کوچک‌تر از شروع باشد یعنی از نیمه‌شب عبور می‌کند</summary>
public int? EndMinutes { get; set; }
/// <summary>ترتیب قوانین</summary>
/// <summary>ترتیب شرایط داخل گروه</summary>
public int Order { get; set; }
}