|
@@ -1,201 +0,0 @@
|
|
|
-
|
|
|
-using Hotline.Settings.TimeLimits;
|
|
|
-using Hotline.Share.Dtos.Settings;
|
|
|
-using Hotline.Share.Enums.Settings;
|
|
|
-using System.Data;
|
|
|
-using XF.Domain.Dependency;
|
|
|
-
|
|
|
-namespace Hotline.Application.TimeLimits
|
|
|
-{
|
|
|
- public class TimeLimitApplication:ITimeLimitApplication, IScopeDependency
|
|
|
- {
|
|
|
- private readonly ITimeLimitRepository _timeLimitRepository;
|
|
|
- private readonly IDaySettingRepository _daySettingRepository;
|
|
|
-
|
|
|
- public TimeLimitApplication(ITimeLimitRepository timeLimitRepository, IDaySettingRepository daySettingRepository)
|
|
|
- {
|
|
|
- _timeLimitRepository = timeLimitRepository;
|
|
|
- _daySettingRepository = daySettingRepository;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// 计算结束时间
|
|
|
- /// </summary>
|
|
|
- /// <param name="beginTime"></param>
|
|
|
- /// <param name="timeType"></param>
|
|
|
- /// <param name="timeValue"></param>
|
|
|
- public TimeResult CalcEndTime(DateTime beginTime, ETimeType timeType, int timeValue)
|
|
|
- {
|
|
|
-
|
|
|
- var time = beginTime;
|
|
|
- switch (timeType)
|
|
|
- {
|
|
|
- //新增对应小时
|
|
|
- case ETimeType.Hour:
|
|
|
- return new TimeResult { EndTime = beginTime.AddHours(timeValue), RuleStr = timeValue + "小时" };
|
|
|
- //新增工作日
|
|
|
- case ETimeType.WorkDay:
|
|
|
- //检查时间段内是否存在休息日或者工作日
|
|
|
- int day = 1;
|
|
|
- for (int i = 1; i < timeValue + 1; i++)
|
|
|
- {
|
|
|
- if (IsWorkDay(beginTime.AddDays(day)))
|
|
|
- {
|
|
|
- beginTime = beginTime.AddDays(day);
|
|
|
- day = 1;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- i--;
|
|
|
- day++;
|
|
|
- }
|
|
|
- }
|
|
|
- return new TimeResult { EndTime = beginTime, RuleStr = timeValue + "个工作日" };
|
|
|
- //新增自然日
|
|
|
- case ETimeType.Day:
|
|
|
- return new TimeResult { EndTime = beginTime.AddDays(timeValue), RuleStr = timeValue + "个自然日" };
|
|
|
- default:
|
|
|
- return null;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private bool IsWorkDay(DateTime date)
|
|
|
- {
|
|
|
- return _daySettingRepository.IsWorkDay(date).GetAwaiter().GetResult();
|
|
|
- }
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// 计算工作时间(跳过休息日)
|
|
|
- /// </summary>
|
|
|
- /// <param name="date"></param>
|
|
|
- /// <param name="days"></param>
|
|
|
- /// <returns></returns>
|
|
|
- public DateTime GetEndDateWork(DateTime date,int days)
|
|
|
- {
|
|
|
- for (int i = 0; i < days; )
|
|
|
- {
|
|
|
- date = date.AddDays(1);
|
|
|
- if (IsWorkDay(date))
|
|
|
- i++;
|
|
|
- }
|
|
|
- return date;
|
|
|
- }
|
|
|
-
|
|
|
- //public async Task<TimeResult> Get(string WorkflowCode, DateTime BeginTime, Dictionary<string, string> param)
|
|
|
- //{
|
|
|
- // //1>> 取出对应已启用的配置
|
|
|
- // var model = await _timeLimitRepository.GetAsync(x => x.WorkflowCode == WorkflowCode && x.TimeLimitState == Share.Enums.Settings.ETimeLimitState.Enable);
|
|
|
- // if (model != null)
|
|
|
- // {
|
|
|
- // #region 组合优先级
|
|
|
- // //2>> 优先级 组合逻辑判定 (组合重复取最短时间)
|
|
|
- // if (model.Combination?.Count > 0)
|
|
|
- // {
|
|
|
- // //待计算集合
|
|
|
- // List<CombinationModel> list = new List<CombinationModel>();
|
|
|
- // foreach (var item in model.Combination)
|
|
|
- // {
|
|
|
- // //判断是否包含当前组合的所有参数
|
|
|
- // int countx = item.CombinationParam.Count(x => param.Any(d => d.Key == x.Code && d.Value == x.ParamValue));
|
|
|
- // //如果包含 就加入到待计算的集合中
|
|
|
- // if (countx == item.CombinationParam.Count)
|
|
|
- // {
|
|
|
- // list.Add(item);
|
|
|
- // }
|
|
|
- // }
|
|
|
- // if (list.Count > 0)
|
|
|
- // {
|
|
|
- // //获取符合参数条件的组合最小时间单位
|
|
|
- // var comHavMinParam = list.OrderBy(x => x.Hour).FirstOrDefault();
|
|
|
- // if (comHavMinParam != null && comHavMinParam?.TimeLimit != ETimeType.WorkDay)
|
|
|
- // {
|
|
|
- // return CalcEndTime(BeginTime, comHavMinParam.TimeLimit, comHavMinParam.TimeLimitValue);
|
|
|
- // }
|
|
|
- // else
|
|
|
- // {
|
|
|
- // //获取符合参数条件的组合(工作日)最小单位
|
|
|
- // var comHavMinParamWorkDay = list.OrderBy(x => x.Hour).FirstOrDefault(x => x.TimeLimit == ETimeType.WorkDay);
|
|
|
-
|
|
|
- // //如果符合条件的组合和符合条件的组合(工作日)都存在
|
|
|
- // if (comHavMinParam != null && comHavMinParamWorkDay != null)
|
|
|
- // {
|
|
|
- // var comMinParamResult = CalcEndTime(BeginTime, comHavMinParam.TimeLimit, comHavMinParam.TimeLimitValue);
|
|
|
- // var comMinParamWorkDayResult = CalcEndTime(BeginTime, comHavMinParamWorkDay.TimeLimit, comHavMinParamWorkDay.TimeLimitValue);
|
|
|
- // if (comMinParamResult.EndTime != null && comMinParamWorkDayResult.EndTime != null && DateTime.Compare(comMinParamResult.EndTime.Value, comMinParamWorkDayResult.EndTime.Value) <= 0)
|
|
|
- // {
|
|
|
- // return comMinParamResult;
|
|
|
- // }
|
|
|
- // else
|
|
|
- // {
|
|
|
- // return comMinParamWorkDayResult;
|
|
|
- // }
|
|
|
- // }
|
|
|
- // }
|
|
|
- // }
|
|
|
- // }
|
|
|
- // #endregion
|
|
|
-
|
|
|
- // #region 排序优先级
|
|
|
- // //3>> 优先级 排序逻辑判定
|
|
|
- // if (model.Priority?.Count > 0)
|
|
|
- // {
|
|
|
- // var firstModel = model.Priority.OrderBy(x => x.Sort).FirstOrDefault(x => param.Any(d => d.Key == x.Code && d.Value == x.ParamTypeValue));
|
|
|
- // //如果找到排序条件 走排序逻辑
|
|
|
- // if (firstModel != null)
|
|
|
- // {
|
|
|
- // var CanUseModel = model.ParamArr?.FirstOrDefault(x => x.ParamType == firstModel.ParamType && x.Id == firstModel.Code);
|
|
|
- // if (CanUseModel != null)
|
|
|
- // {
|
|
|
- // #region 计算结束时间
|
|
|
- // return CalcEndTime(BeginTime, CanUseModel.TimeLimitType, CanUseModel.TimeLimitValue);
|
|
|
- // #endregion
|
|
|
- // }
|
|
|
- // }
|
|
|
-
|
|
|
- // }
|
|
|
- // #endregion
|
|
|
-
|
|
|
- // #region 配置优先级
|
|
|
- // // 4>> 优先级 配置逻辑判定
|
|
|
- // if (model.ParamArr?.Count > 0)
|
|
|
- // {
|
|
|
- // //获取符合参数条件的配置最小时间单位
|
|
|
- // var havMinParam = model.ParamArr.OrderBy(x => x.Hour).FirstOrDefault(x => x.TimeLimitType != ETimeType.WorkDay && param.Any(d => d.Key == x.ParamType && d.Value == x.Id));
|
|
|
- // //获取符合参数条件的配置(工作日)最小时间单位
|
|
|
- // var havMinParamWorkDay = model.ParamArr.OrderBy(x => x.Hour).FirstOrDefault(x => x.TimeLimitType == ETimeType.WorkDay && param.Any(d => d.Key == x.ParamType && d.Value == x.Id));
|
|
|
- // //如果符合条件的参数和符合条件的参数(工作日)都存在
|
|
|
- // if (havMinParam != null && havMinParamWorkDay != null)
|
|
|
- // {
|
|
|
- // var minParamResult = CalcEndTime(BeginTime, havMinParam.TimeLimitType, havMinParam.TimeLimitValue);
|
|
|
- // var minParamWorkDayResult = CalcEndTime(BeginTime, havMinParam.TimeLimitType, havMinParam.TimeLimitValue);
|
|
|
- // if (minParamResult.EndTime != null && minParamWorkDayResult.EndTime != null && DateTime.Compare(minParamResult.EndTime.Value, minParamWorkDayResult.EndTime.Value) <= 0)
|
|
|
- // {
|
|
|
- // return minParamResult;
|
|
|
- // }
|
|
|
- // else
|
|
|
- // {
|
|
|
- // return minParamWorkDayResult;
|
|
|
- // }
|
|
|
- // }
|
|
|
- // else
|
|
|
- // {
|
|
|
- // return new TimeResult() { EndTime = null, RuleId = "", RuleStr = "" };
|
|
|
- // }
|
|
|
- // }
|
|
|
- // else
|
|
|
- // {
|
|
|
- // return new TimeResult() { EndTime = null, RuleId = "", RuleStr = "" };
|
|
|
- // }
|
|
|
-
|
|
|
- // #endregion
|
|
|
-
|
|
|
- // }
|
|
|
- // return null;
|
|
|
- //}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
-}
|