|
@@ -3,6 +3,8 @@ using Hotline.Settings.TimeLimits;
|
|
|
using Hotline.Share.Dtos.Settings;
|
|
|
using Hotline.Share.Enums.FlowEngine;
|
|
|
using Hotline.Share.Enums.Settings;
|
|
|
+using Hotline.Share.Tools;
|
|
|
+using Mapster;
|
|
|
using MapsterMapper;
|
|
|
using XF.Domain.Exceptions;
|
|
|
using XF.Domain.Repository;
|
|
@@ -13,35 +15,35 @@ namespace Hotline.Settings.TimeLimitDomain;
|
|
|
/// <summary>
|
|
|
/// 过期时间处理基类
|
|
|
/// </summary>
|
|
|
-public abstract class ExpireTimeLimitBase
|
|
|
+public abstract class ExpireTimeLimitBase
|
|
|
{
|
|
|
private readonly ISystemSettingCacheManager _systemSettingCacheManager;
|
|
|
private readonly IRepository<TimeLimitSetting> _timeLimitSettingRepository;
|
|
|
private readonly IExpireTimeHandler _expireTimeHandler;
|
|
|
private readonly IMapper _mapper;
|
|
|
- private readonly IRepository<SystemSetting> _systemSettingRepository;
|
|
|
private readonly IDaySettingRepository _daySettingRepository;
|
|
|
|
|
|
- public ExpireTimeLimitBase(ISystemSettingCacheManager systemSettingCacheManager, IRepository<TimeLimitSetting> timeLimitSettingRepository, IExpireTimeHandler expireTimeHandler, IMapper mapper, IRepository<SystemSetting> systemSettingRepository, IDaySettingRepository daySettingRepository)
|
|
|
+ public ExpireTimeLimitBase(ISystemSettingCacheManager systemSettingCacheManager, IRepository<TimeLimitSetting> timeLimitSettingRepository, IExpireTimeHandler expireTimeHandler, IMapper mapper, IDaySettingRepository daySettingRepository)
|
|
|
{
|
|
|
_systemSettingCacheManager = systemSettingCacheManager;
|
|
|
_timeLimitSettingRepository = timeLimitSettingRepository;
|
|
|
_expireTimeHandler = expireTimeHandler;
|
|
|
_mapper = mapper;
|
|
|
- _systemSettingRepository = systemSettingRepository;
|
|
|
_daySettingRepository = daySettingRepository;
|
|
|
}
|
|
|
|
|
|
public virtual async Task<int> CalcWorkTime(DateTime beginTime, DateTime endTime, bool isCenter)
|
|
|
{
|
|
|
- var workTime = _systemSettingRepository.Get(x => x.Code == SettingConstants.WorkTime);
|
|
|
- return await _expireTimeHandler.CalcWorkTimeAsync(beginTime, endTime, workTime.SettingValue, isCenter);
|
|
|
+ // var workTime = _systemSettingRepository.Get(x => x.Code == SettingConstants.WorkTime);
|
|
|
+ var workTime = GetWorkTimes(SettingConstants.WorkTime);
|
|
|
+ return await _expireTimeHandler.CalcWorkTimeAsync(beginTime, endTime, workTime, isCenter);
|
|
|
}
|
|
|
|
|
|
public virtual async Task<int> CalcWorkTimeEx(DateTime beginTime, DateTime endTime, bool isCenter)
|
|
|
{
|
|
|
- var workTime = _systemSettingRepository.Get(x => x.Code == SettingConstants.WorkTimeOrg);
|
|
|
- return await _expireTimeHandler.CalcWorkTimeExAsync(beginTime, endTime, workTime.SettingValue, isCenter);
|
|
|
+ // var workTime = _systemSettingRepository.Get(x => x.Code == SettingConstants.WorkTimeOrg);
|
|
|
+ var workTime = GetWorkTimes(SettingConstants.WorkTimeOrg);
|
|
|
+ return await _expireTimeHandler.CalcWorkTimeExAsync(beginTime, endTime, workTime, isCenter);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -51,13 +53,13 @@ public abstract class ExpireTimeLimitBase
|
|
|
/// <returns></returns>
|
|
|
public virtual async Task<DateTime> WorkDay(DateTime date)
|
|
|
{
|
|
|
- var workTime = _systemSettingRepository.Get(x => x.Code == SettingConstants.WorkTime);
|
|
|
- var (WorkBeginTime, WorkEndTime) = GetWorkTime(DateTime.Now, workTime.SettingValue);
|
|
|
+ var workTime = GetWorkTimes(SettingConstants.WorkTime);
|
|
|
+ var (WorkBeginTime, WorkEndTime) = GetWorkTime(DateTime.Now, workTime);
|
|
|
if (await IsWorkDay(date))
|
|
|
{
|
|
|
if (date < WorkBeginTime || date > WorkEndTime)
|
|
|
{
|
|
|
- date = DateTime.Parse(date.ToShortDateString() + " " + workTime.SettingValue[0] + ":00");
|
|
|
+ date = DateTime.Parse(date.ToShortDateString() + " " + workTime[0] + ":00");
|
|
|
}
|
|
|
}
|
|
|
else
|
|
@@ -68,7 +70,7 @@ public abstract class ExpireTimeLimitBase
|
|
|
}
|
|
|
if (date < WorkBeginTime || date > WorkEndTime)
|
|
|
{
|
|
|
- date = DateTime.Parse(date.ToShortDateString() + " " + workTime.SettingValue[0] + ":00");
|
|
|
+ date = DateTime.Parse(date.ToShortDateString() + " " + workTime[0] + ":00");
|
|
|
}
|
|
|
}
|
|
|
return date;
|
|
@@ -89,46 +91,47 @@ public abstract class ExpireTimeLimitBase
|
|
|
if (string.IsNullOrEmpty(code))
|
|
|
{
|
|
|
return new TimeConfig(
|
|
|
- int.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.BackCenterTimeSetting).SettingValue[0]),
|
|
|
+ int.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.BackCenterTimeSetting)!.SettingValue[0]),
|
|
|
ETimeType.WorkDay);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- var timeSetting = _timeLimitSettingRepository.Queryable().First(x => x.BusCode == code);
|
|
|
- return new TimeConfig(timeSetting.TimeValue, timeSetting.TimeType);
|
|
|
+ return _timeLimitSettingRepository.Queryable().First(x => x.BusCode == code).Adapt<TimeConfig>();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 计算期满时间
|
|
|
/// </summary>
|
|
|
- public virtual async Task<ExpiredTimeWithConfig?> CalcExpiredTime(DateTime beginTime, EFlowDirection flowDirection, string? acceptTypeCode)
|
|
|
+ public virtual async Task<ExpiredTimeWithConfig> CalcExpiredTime(DateTime beginTime, EFlowDirection flowDirection, OrderTimeClacInfo order)
|
|
|
{
|
|
|
- if (flowDirection is EFlowDirection.CenterToOrg && string.IsNullOrEmpty(acceptTypeCode))
|
|
|
+ if (EFlowDirection.CenterToOrg == flowDirection && order.Is24HoursComplete)
|
|
|
+ {
|
|
|
+ order.AcceptTypeCode = "24";
|
|
|
+ }
|
|
|
+
|
|
|
+ if (flowDirection is EFlowDirection.CenterToOrg && string.IsNullOrEmpty(order.AcceptTypeCode))
|
|
|
throw new UserFriendlyException("中心派至部门的工单期满时间需受理类型参数");
|
|
|
var timeConfig = flowDirection switch
|
|
|
{
|
|
|
- EFlowDirection.CenterToOrg => GetOrderTimeLimitConfig(acceptTypeCode),
|
|
|
+ EFlowDirection.CenterToOrg => GetOrderTimeLimitConfig(order.AcceptTypeCode),
|
|
|
EFlowDirection.OrgToCenter => GetOrderTimeLimitConfig(),
|
|
|
- EFlowDirection.CenterToCenter => GetOrderTimeLimitConfig(acceptTypeCode),
|
|
|
+ EFlowDirection.CenterToCenter => GetOrderTimeLimitConfig(order.AcceptTypeCode),
|
|
|
_ => throw new ArgumentOutOfRangeException(nameof(flowDirection), flowDirection, null)
|
|
|
};
|
|
|
|
|
|
- return await CalcEndTime(beginTime, timeConfig, acceptTypeCode);
|
|
|
+ return await CalcEndTime(beginTime, timeConfig, order.AcceptTypeCode);
|
|
|
}
|
|
|
|
|
|
- public virtual async Task<ExpiredTimeWithConfig?> CalcEndTime(DateTime beginTime, TimeConfig timeConfig, string? busCode)
|
|
|
+ public virtual async Task<ExpiredTimeWithConfig> CalcEndTime(DateTime beginTime, TimeConfig timeConfig, string busCode)
|
|
|
{
|
|
|
- var setting = _timeLimitSettingRepository.Queryable().First(x => x.BusCode == busCode);
|
|
|
- if (setting == null) return null;
|
|
|
+ var setting = _timeLimitSettingRepository.Queryable().First(x => x.BusCode == busCode)
|
|
|
+ ?? throw new UserFriendlyException($"缺少busCode:{busCode}, 的time limit setting 设置;");
|
|
|
|
|
|
- var workTime = _systemSettingRepository.Get(x => x.Code == SettingConstants.WorkTime);
|
|
|
- var result = await _expireTimeHandler.CalcEndTimeAsync(beginTime, timeConfig.TimeType, workTime.SettingValue, timeConfig.Count, setting.Percentage, setting.PercentageOne);
|
|
|
- var expiredTimeWithConfig = _mapper.Map<ExpiredTimeWithConfig>(timeConfig);
|
|
|
- expiredTimeWithConfig.ExpiredTime = result.EndTime;
|
|
|
- expiredTimeWithConfig.NearlyExpiredTime = result.NearlyExpiredTime;
|
|
|
- expiredTimeWithConfig.NearlyExpiredTimeOne = result.NearlyExpiredTimeOne;
|
|
|
- return expiredTimeWithConfig;
|
|
|
+ var workTime = GetWorkTimes(SettingConstants.WorkTime);
|
|
|
+ var result = await _expireTimeHandler.CalcEndTimeAsync(beginTime, timeConfig.TimeType, workTime, timeConfig.Count, setting.Percentage, setting.PercentageOne);
|
|
|
+ var expiredTimeWithConfig = timeConfig.Adapt<ExpiredTimeWithConfig>();
|
|
|
+ return result.Adapt(expiredTimeWithConfig);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -143,8 +146,8 @@ public abstract class ExpireTimeLimitBase
|
|
|
var setting = _timeLimitSettingRepository.Queryable().First(x => x.BusCode == busCode);
|
|
|
if (setting == null) return null;
|
|
|
|
|
|
- var workTime = _systemSettingRepository.Get(x => x.Code == SettingConstants.WorkTime);
|
|
|
- var result = await _expireTimeHandler.CalcEndTimeAsync(beginTime, setting.TimeType, workTime.SettingValue, setting.TimeValue, setting.Percentage, setting.PercentageOne);
|
|
|
+ var workTime = GetWorkTimes(SettingConstants.WorkTime);
|
|
|
+ var result = await _expireTimeHandler.CalcEndTimeAsync(beginTime, setting.TimeType, workTime, setting.TimeValue, setting.Percentage, setting.PercentageOne);
|
|
|
var expiredTimeWithConfig = new ExpiredTimeWithConfig
|
|
|
{
|
|
|
TimeText = setting.TimeValue + "个" + setting.TimeType.GetDescription(),
|
|
@@ -159,16 +162,25 @@ public abstract class ExpireTimeLimitBase
|
|
|
|
|
|
public virtual async Task<TimeResult?> CalcEndTime(DateTime beginTime, ETimeType timeType, int timeValue, string busCode)
|
|
|
{
|
|
|
- var workTime = _systemSettingRepository.Get(x => x.Code == SettingConstants.WorkTime);
|
|
|
+ var workTime = GetWorkTimes(SettingConstants.WorkTime);
|
|
|
var setting = _timeLimitSettingRepository.Queryable().First(x => x.BusCode == busCode);
|
|
|
if (setting == null) return null;
|
|
|
- return await _expireTimeHandler.CalcEndTimeAsync(beginTime, timeType, workTime.SettingValue, timeValue, setting.Percentage, setting.PercentageOne);
|
|
|
+ return await _expireTimeHandler.CalcEndTimeAsync(beginTime, timeType, workTime, timeValue, setting.Percentage, setting.PercentageOne);
|
|
|
}
|
|
|
|
|
|
- public async Task<TimeResult> CalcEndTime(DateTime beginTime, ETimeType timeType, int timeValue, int Percentage, int PercentageOne)
|
|
|
- {
|
|
|
- var workTime = _systemSettingRepository.Get(x => x.Code == SettingConstants.WorkTime);
|
|
|
- return await _expireTimeHandler.CalcEndTimeAsync(beginTime, timeType, workTime.SettingValue, timeValue, Percentage, PercentageOne);
|
|
|
+ /// <summary>
|
|
|
+ /// 计算工作日
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="beginTime"></param>
|
|
|
+ /// <param name="timeType"></param>
|
|
|
+ /// <param name="timeValue"></param>
|
|
|
+ /// <param name="Percentage">即将超期百分比</param>
|
|
|
+ /// <param name="PercentageOne">超期百分比第一级</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public virtual async Task<TimeResult> CalcEndTime(DateTime beginTime, ETimeType timeType, int timeValue, int Percentage, int PercentageOne)
|
|
|
+ {
|
|
|
+ var workTime = GetWorkTimes(SettingConstants.WorkTime);
|
|
|
+ return await _expireTimeHandler.CalcEndTimeAsync(beginTime, timeType, workTime, timeValue, Percentage, PercentageOne);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -180,8 +192,8 @@ public abstract class ExpireTimeLimitBase
|
|
|
/// <returns></returns>
|
|
|
public virtual async Task<decimal> CalcWorkTimeToHour(DateTime beginTime, DateTime endTime, bool isCenter)
|
|
|
{
|
|
|
- var workTime = _systemSettingRepository.Get(x => x.Code == SettingConstants.WorkTime);
|
|
|
- var min = await _expireTimeHandler.CalcWorkTimeAsync(beginTime, endTime, workTime.SettingValue, isCenter);
|
|
|
+ var workTime = GetWorkTimes(SettingConstants.WorkTime);
|
|
|
+ var min = await _expireTimeHandler.CalcWorkTimeAsync(beginTime, endTime, workTime, isCenter);
|
|
|
if (min == 0) return 0;
|
|
|
if (isCenter)
|
|
|
{
|
|
@@ -203,14 +215,14 @@ public abstract class ExpireTimeLimitBase
|
|
|
/// <returns></returns>
|
|
|
public virtual async Task<decimal> CalcWorkTimeToDecimal(DateTime beginTime, DateTime endTime, bool isCenter)
|
|
|
{
|
|
|
- var workTime = _systemSettingRepository.Get(x => x.Code == SettingConstants.WorkTime);
|
|
|
- var min = await _expireTimeHandler.CalcWorkTimeAsync(beginTime, endTime, workTime.SettingValue, isCenter);
|
|
|
+ var workTime = GetWorkTimes(SettingConstants.WorkTime);
|
|
|
+ var min = await _expireTimeHandler.CalcWorkTimeAsync(beginTime, endTime, workTime, isCenter);
|
|
|
if (min == 0) return 0;
|
|
|
if (isCenter) return Math.Round((decimal)min / 60 / 60 / 24, 2);
|
|
|
|
|
|
if (workTime == null) return 0;
|
|
|
|
|
|
- var (workBeginTime, workEndTime) = GetWorkTime(beginTime, workTime.SettingValue);
|
|
|
+ var (workBeginTime, workEndTime) = GetWorkTime(beginTime, workTime);
|
|
|
var minuteSpan = new TimeSpan(workEndTime.Ticks - workBeginTime.Ticks);
|
|
|
|
|
|
//总时差分钟数
|
|
@@ -220,16 +232,16 @@ public abstract class ExpireTimeLimitBase
|
|
|
|
|
|
public virtual async Task<TimeResult?> CalcEndTime(EFlowDirection flowDirection, int Percentage, int PercentageOne, ETimeType? timeType = null, int? timeValue = null)
|
|
|
{
|
|
|
- var workTime = _systemSettingRepository.Get(x => x.Code == SettingConstants.WorkTime);
|
|
|
+ var workTime = GetWorkTimes(SettingConstants.WorkTime);
|
|
|
switch (flowDirection)
|
|
|
{
|
|
|
case EFlowDirection.CenterToOrg:
|
|
|
if (!timeType.HasValue || !timeValue.HasValue)
|
|
|
throw new UserFriendlyException("无效参数");
|
|
|
- return await _expireTimeHandler.CalcEndTimeAsync(DateTime.Now, timeType.Value, workTime.SettingValue, timeValue.Value, Percentage, PercentageOne);
|
|
|
+ return await _expireTimeHandler.CalcEndTimeAsync(DateTime.Now, timeType.Value, workTime, timeValue.Value, Percentage, PercentageOne);
|
|
|
case EFlowDirection.OrgToCenter:
|
|
|
//todo 根据配置
|
|
|
- return await _expireTimeHandler.CalcEndTimeAsync(DateTime.Now, ETimeType.Day, workTime.SettingValue, 1, Percentage, PercentageOne);
|
|
|
+ return await _expireTimeHandler.CalcEndTimeAsync(DateTime.Now, ETimeType.Day, workTime, 1, Percentage, PercentageOne);
|
|
|
default:
|
|
|
throw new ArgumentOutOfRangeException(nameof(flowDirection), flowDirection, null);
|
|
|
}
|
|
@@ -259,11 +271,14 @@ public abstract class ExpireTimeLimitBase
|
|
|
/// <param name="date"></param>
|
|
|
/// <param name="workTime"></param>
|
|
|
/// <returns></returns>
|
|
|
- private static (DateTime startTime, DateTime endTime) GetWorkTime(DateTime date, List<string> workTime)
|
|
|
+ private static (DateTime startTime, DateTime endTime) GetWorkTime(DateTime date, IList<string> workTime)
|
|
|
{
|
|
|
var startTime = DateTime.Parse(date.ToShortDateString() + " " + workTime[0] + ":00");
|
|
|
var endTime = DateTime.Parse(date.ToShortDateString() + " " + workTime[1] + ":00");
|
|
|
return (startTime, endTime);
|
|
|
}
|
|
|
|
|
|
+ public IList<string> GetWorkTimes(string code)
|
|
|
+ => _systemSettingCacheManager.GetSetting(code)!.SettingValue;
|
|
|
+
|
|
|
}
|