Appearance
条件限制管理器
条件管理是针对业务需求中有不同条件限制的统一管理类。 比如星期一到星期五有效,星期六合星期天无效,再比如针对某些机台有效,其他机台无效等。
已内置条件
当前内置条件有:
- 时间范围条件: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;
}