Skip to content

条件限制管理器

条件管理是针对业务需求中有不同条件限制的统一管理类。 比如星期一到星期五有效,星期六合星期天无效,再比如针对某些机台有效,其他机台无效等。

已内置条件

当前内置条件有:

  • 时间范围条件:DateTimeRangeCondition
  • 设备限制条件:DeviceCondition
  • 等级限制条件:MemberLevelCondition
  • 每月指定日期限制条件:MonthDaysCondition
  • 每周指定日期限制条件:WeekDaysCondition

新增自定义条件

例如时间范围条件:新增“上下文”,“设置”和“条件”三个类,然后新增一个条件提供者(IConditionProvider)。

c#
namespace JingJian.Extensions.Condition.DateTimeRanges
{
    /// <summary>
    /// 时间范围条件上下文
    /// </summary>
    public class DateTimeRangeConditionContext : IConditionContext
    {
        public DateTime Now { get; set; } = DateTime.Now;
    }

    /// <summary>
    /// 时间范围条件设置
    /// </summary>
    public class DateTimeRangeConditionSetting
    {
        /// <summary>
        /// 开始时间
        /// </summary>
        [ConditionSettingField(Name = "开始时间", Desc = "大于等于开始时间则有效")]
        public DateTime StartTime { get; set; }

        /// <summary>
        /// 结束时间
        /// </summary>
        [ConditionSettingField(Name = "结束时间", Desc = "小于等于结束时间则有效")]
        public DateTime EndTime { get; set; }

        /// <summary>
        /// 另外包含的日期
        /// </summary>
        [ConditionSettingField(Name = "包含的日期")]
        public List<DateTime> IncludeDates { get; set; } = new();

        /// <summary>
        /// 排除的日期
        /// </summary>
        [ConditionSettingField(Name = "排除的日期")]
        public List<DateTime> ExcludeDates { get; set; } = new();
    }

    /// <summary>
    /// 时间范围条件
    /// </summary>
    public class DateTimeRangeCondition : ConditionBase<DateTimeRangeConditionContext>
    {
        /// <summary>
        /// 条件KEY
        /// </summary>
        public override string ConditionKey => nameof(DateTimeRangeCondition);

        /// <summary>
        /// 条件名称
        /// </summary>
        public override string ConditionName => "时间范围条件";

        /// <summary>
        /// 条件设置
        /// </summary>
        public DateTimeRangeConditionSetting Setting { get; set; } = new();

        /// <summary>
        /// 检查是否满足条件
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public override CallResult Check(DateTimeRangeConditionContext context)
        {
            if (Setting.IncludeDates.Contains(context.Now.Date)) return CallResult.Ok();

            if (Setting.ExcludeDates.Contains(context.Now.Date)) return CallResult.Fail("该时段在排除时间列表中");

            if (Setting.StartTime <= context.Now && Setting.EndTime >= context.Now) return CallResult.Ok();

            return CallResult.Fail("该时段在起止时间之外");
        }

        /// <summary>
        /// 检查是否满足条件
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public override async Task<CallResult> CheckAsync(DateTimeRangeConditionContext context)
        {
            return await Task.Run(() =>
            {
                return Check(context);
            });
        }

        /// <summary>
        /// 序列化
        /// </summary>
        /// <returns></returns>
        public override string Serialize()
        {
            return this.Setting.ToJsonString();
        }

        /// <summary>
        /// 反序列化
        /// </summary>
        /// <param name="settingJson"></param>
        public override void Deserialize(string settingJson)
        {
            Setting = settingJson.ToJsonObject<DateTimeRangeConditionSetting>(); 
        }
    }
}

namespace JingJian.Extensions.Condition.DateTimeRanges
{
    public class DateTimeRangeConditionProvider : IConditionProvider
    {
        public string ConditionKey => nameof(DateTimeRangeCondition);

        public ICondition<TContext> Create<TContext>(string json) where TContext : IConditionContext
        {
            return (ICondition<TContext>)new DateTimeRangeCondition(json);
        }
    }
}

获取所有条件

c#
[HttpGet("list")]
public async Task<List<ICondition>> GetConditions()
{
    var conditions = await Task.FromResult(_conditionFactory.GetConditions());
    return conditions;
}

广州宝点数字化科技