diff --git a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/ModifyTimeSpanInput.cs b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/ModifyTimeSpanInput.cs new file mode 100644 index 00000000..016106ec --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/ModifyTimeSpanInput.cs @@ -0,0 +1,17 @@ +using SJZY.Track.Domain.Dtos.Forewarning; + +namespace SJZY.Track.Application.Contract.Dtos.Forewarning; + +public class ModifyTimeSpanInput +{ + /// + /// 预警id + /// + public int WarningId { get; set; } + + /// + /// 规则详情中的时效相关信息 + /// + public List Items { get; set; } = new(); +} + diff --git a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/WarningTimeSpanDto.cs b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/WarningTimeSpanDto.cs new file mode 100644 index 00000000..02c3e20c --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/WarningTimeSpanDto.cs @@ -0,0 +1,27 @@ +namespace SJZY.Track.Application.Contract.Dtos.Forewarning; + +/// +/// 预警规则时效 +/// +public class WarningTimeSpanDto +{ + /// + /// 预警规则id + /// + public int Id { get; set; } + + /// + /// 时效 + /// + public float TotalTimeSpan { get; set; } + + /// + /// 提醒时效 + /// + public float WarnTimeSpan { get; set; } + + /// + /// 提醒次数 + /// + public int WarnCount { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Services/IRuleFactorCacheService.cs b/src/SJZY.Track.Application.Contract/Services/IRuleFactorCacheService.cs index 41eb2171..fb1f742b 100644 --- a/src/SJZY.Track.Application.Contract/Services/IRuleFactorCacheService.cs +++ b/src/SJZY.Track.Application.Contract/Services/IRuleFactorCacheService.cs @@ -12,7 +12,7 @@ public interface IRuleFactorCacheService /// 获取所有因子收集的规则。 /// /// 规则数组。 - Task GetAllFactorCollect(); + Task GetAllFactorCollect(); /// /// 获取所有规则因子。 diff --git a/src/SJZY.Track.Application/AutoMapper/ForewarningMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/ForewarningMapperProfile.cs index b905d38d..c06978eb 100644 --- a/src/SJZY.Track.Application/AutoMapper/ForewarningMapperProfile.cs +++ b/src/SJZY.Track.Application/AutoMapper/ForewarningMapperProfile.cs @@ -1,4 +1,5 @@ using AutoMapper; +using SJZY.Track.Application.Contract.Dtos.Forewarning; using SJZY.Track.Domain.Aggregates.ForewarningAggregate; using SJZY.Track.Domain.Aggregates.KPIAreaAggregate; using SJZY.Track.Domain.Dtos.Forewarning; @@ -9,9 +10,8 @@ public class ForewarningMapperProfile :Profile { public ForewarningMapperProfile() { - CreateMap(MemberList.None); - CreateMap(); - CreateMap(); + CreateMap(MemberList.None); + CreateMap(MemberList.None); CreateMap(); CreateMap(MemberList.None); CreateMap(MemberList.None) @@ -32,17 +32,5 @@ public class ForewarningMapperProfile :Profile .ForMember(dest => dest.City, opt => opt.MapFrom(src => src.City)) .ForMember(dest => dest.LeftPostcode, opt => opt.MapFrom(src => src.LeftPostCode)) .ForMember(dest => dest.RightPostcode, opt => opt.MapFrom(src => src.RightPostCode)); - - CreateMap(MemberList.None) - .ForMember(dest => dest.RuleId, opt => opt.MapFrom(src => src.RuleId)) - .ForMember(dest => dest.Tracks, opt => opt.MapFrom(src => src.Tracks)) - .ForMember(dest => dest.FactorItems, opt => opt.MapFrom(src => src.FactorItems)) - .ForMember(dest => dest.CargoTypes, opt => opt.MapFrom(src => src.CargoTypes)) - .ForMember(dest => dest.Months, opt => opt.MapFrom(src => src.Months.Select(m => m.ToString()))) - .ForMember(dest => dest.IsTransit, opt => opt.MapFrom(src => src.IsTransit.Select(i => i == 1))) - .ForMember(dest => dest.Areas, opt => opt.MapFrom(src => src.Areas)) - .ForMember(dest => dest.DeparturePorts, opt => opt.MapFrom(src => src.DeparturePorts)) - .ForMember(dest => dest.ProductCodes, opt => opt.MapFrom(src => src.ProductCodes)); - } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs index 7a371e49..c20ca137 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs @@ -2,7 +2,6 @@ using SJZY.Track.Application.Contract.Events; using SJZY.Track.Application.Contract.Services; using SJZY.Track.Domain.Aggregates.OrderAggregate; -using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Consts; using SJZY.Track.Domain.Dtos.Forewarning; using Volo.Abp.DependencyInjection; @@ -12,15 +11,12 @@ namespace SJZY.Track.Application.CAP.EventHandlers; public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICapSubscribe { private readonly IOrderRepository _orderRepository; - private readonly ITrackDetailsRepository _trackDetailsRepository; private readonly IForewarningNotifyService _forewarningNotifyService; - public TrackChangeAfterUpdateOrderEventHandler(IOrderRepository orderRepository, - ITrackDetailsRepository trackDetailsRepository, + public TrackChangeAfterUpdateOrderEventHandler(IOrderRepository orderRepository, IForewarningNotifyService forewarningNotifyService) { _orderRepository = orderRepository; - _trackDetailsRepository = trackDetailsRepository; _forewarningNotifyService = forewarningNotifyService; } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushCompletedEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushCompletedEventHandler.cs index 4658aa44..b63c4e52 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushCompletedEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushCompletedEventHandler.cs @@ -26,7 +26,7 @@ public class TrackPushCompletedEventHandler : ITransientDependency, ICapSubscrib [CapSubscribe(GlobalConst.TrackPushCompletedSubscribe, Group = GlobalConst.TrackPushSubscribe)] public async Task ConsumerAsync(InterfaceRelayForwardReplayEvent @event) { - string logStr = null; + string? logStr = null; var optionType = Base64Helper.DeSerialize(@event.Attach); if (optionType == OptionType.新增.ToString()) { diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 30ef3bdc..ed6b7522 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -24,8 +24,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe private readonly ITrackPushCacheService _trackPushCacheService; private readonly ITrackDetailsRepository _trackDetailsRepository; private readonly ITrackPushRecordsRepository _trackPushRecordsRepository; - private List _pushConfigs; - private List _orders; + private List _pushConfigs = null!; + private List _orders = null!; public TrackPushEventHandler(IHttpClientProxy httpClientProxy, IOrderRepository orderRepository, ITrackPushCacheService trackPushCacheService, diff --git a/src/SJZY.Track.Application/Helpers/ForewarningFactorHelper.cs b/src/SJZY.Track.Application/Helpers/ForewarningFactorHelper.cs deleted file mode 100644 index e3a1f4c9..00000000 --- a/src/SJZY.Track.Application/Helpers/ForewarningFactorHelper.cs +++ /dev/null @@ -1,65 +0,0 @@ -using JetBrains.Annotations; -using SJZY.Track.Domain.Aggregates.ForewarningAggregate; - -namespace SJZY.Track.Application.Helpers; - -public class ForewarningFactorHelper -{ - public static RuleItemEntity[] GetFactorItem([NotNull] RuleFactorEntity ruleFactors) - { - var total = Factorial(ruleFactors); - var ruleCollect = AllocateFactor(total, ruleFactors.RuleId); - Assignment(ruleCollect, total, ruleFactors.Tracks, (item, value) => - { - item.TrackEnd = value.End; - item.TrackStart = value.Start; - }); - Assignment(ruleCollect, total, ruleFactors.CargoTypes, (item, value) => item.CargoType = value); - Assignment(ruleCollect, total, ruleFactors.Months, (item, value) => item.Month = value); - Assignment(ruleCollect, total, ruleFactors.Areas, (item, value) => item.Area = value); - Assignment(ruleCollect, total, ruleFactors.IsTransit, (item, value) => item.IsTransit = value); - Assignment(ruleCollect, total, ruleFactors.DeparturePorts, (item, value) => item.DeparturePort = value); - Assignment(ruleCollect, total, ruleFactors.ProductCodes, (item, value) => item.ProductCode = value); - return ruleCollect.ToArray(); - } - - private static void Assignment(Span ruleCollect, int total, IReadOnlyList values, - Action action) - { - if (values.Count == 0) - { - return; - } - - var segment = total / values.Count; - for (int index = 0; index < values.Count; index++) - { - var start = index * segment; - var assignmentSlice = ruleCollect.Slice(start, segment); - foreach (var item in assignmentSlice) - { - action(item, values[index]); - } - } - } - - private static Span AllocateFactor(int total, int ruleId) - { - Span factors = new RuleItemEntity[total]; - for (int index = 0; index < total; index++) - { - factors[index] = new RuleItemEntity() - { - RuleId = ruleId - }; - } - - return factors; - } - - internal static int Factorial(RuleFactorEntity ruleFactors) - { - return ruleFactors.Tracks.Count* ruleFactors.CargoTypes.Count * ruleFactors.Months.Count * ruleFactors.Areas.Count * - ruleFactors.IsTransit.Count * ruleFactors.DeparturePorts.Count * ruleFactors.ProductCodes.Count; - } -} \ No newline at end of file diff --git a/src/SJZY.Track.Application/Helpers/ForewarningHelper.cs b/src/SJZY.Track.Application/Helpers/ForewarningHelper.cs new file mode 100644 index 00000000..c945e018 --- /dev/null +++ b/src/SJZY.Track.Application/Helpers/ForewarningHelper.cs @@ -0,0 +1,139 @@ +using Newtonsoft.Json.Linq; +using SJZY.Expand.ABP.Core.PublicMethords; +using SJZY.Track.Domain.Aggregates.ForewarningAggregate; +using SJZY.Track.Domain.Dtos.Forewarning; +using SJZY.Track.Domain.Enums; + +namespace SJZY.Track.Application.Helpers; + +public class ForewarningHelper +{ + /// + /// 递推分裂预警规则列表 + /// + /// + /// + /// + public static List CalcRuleList(List statusSpans, + List factors) + { + var len = statusSpans.Count * factors.Select(f => f.FactorValue.Count).Aggregate((pre, cur) => pre * cur); + if (len == 0) + { + throw new BusinessException(message: "轨迹状态区间或因素列表为空"); + } + + var rules = new List(len); + + var repeat = len / statusSpans.Count; + + FillStatus(statusSpans, rules, repeat); + + foreach (var factor in factors) + { + var factorValueCount = factor.FactorValue.Count; + repeat /= factor.FactorValue.Count; // repeat梯度下降,与times成反比关系 + + for (int time = 0; time < len / repeat / factorValueCount; time++) + { + FillFactor(factor, rules, repeat, time); + } + } + + + return rules; + } + + private static void FillStatus(List statusSpans, List rules, int repeat) + { + for (var i = 0; i < statusSpans.Count; i++) + { + var span = statusSpans[i]; + + for (var j = 0; j < repeat; j++) + { + var row = i * repeat + j; + rules[row].StartTrackStatusId = span.StartTrackStatusId; + rules[row].EndTrackStatusId = span.EndTrackStatusId; + } + } + } + + private static void FillFactor(WarningFactorDto factor, List rules, int repeat, int time) + { + for (var i = 0; i < factor.FactorValue.Count * time; i++) + { + for (var j = 0; j < repeat; j++) + { + var row = i * repeat + j; + var value = factor.FactorValue[row]; + var strValue = value.ToString(); + switch (factor.FactorType) + { + case RuleFactorType.CargoType: + if (value.Type is not JTokenType.String) + { + throw new BusinessException(message: "货物类型只接收字符串"); + } + + rules[row].CargoType = strValue; + break; + case RuleFactorType.Months: + foreach (var item in strValue.Split("/")) + { + if (!int.TryParse(item, out var month) || month < 1 || month > 12) + { + throw new BusinessException(message: "请输入合法的月份,多个月份请以'/'连接"); + } + } + + rules[row].Months = strValue; + break; + case RuleFactorType.Areas: + if (value.Type is not JTokenType.Integer) + { + throw new BusinessException(message: "分区请传id"); + } + + rules[row].AreaId = int.Parse(strValue); + break; + case RuleFactorType.IsTransit: + if (value.Type is not JTokenType.Boolean) + { + throw new BusinessException(message: "是否中转只接收bool类型"); + } + + rules[row].IsTransit = bool.Parse(strValue); + break; + case RuleFactorType.LeavePort: + if (value.Type is not JTokenType.String) + { + throw new BusinessException(message: "货物类型只接收字符串"); + } + + rules[row].LeavePort = strValue; + break; + case RuleFactorType.ProductCode: + if (value.Type is not JTokenType.String) + { + throw new BusinessException(message: "货物类型只接收字符串"); + } + + rules[row].ProductCode = strValue; + break; + default: + throw new BusinessException(message: $"不支持的因素:{factor.FactorType}"); + } + } + } + } + + public static List MapFactorEntities(List warningFactors) + { + return warningFactors.Select(x => new WarningFactorEntity + { + Type = x.FactorType, + Value = x.FactorValue.ToJson() + }).ToList(); + } +} \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs index 490c7c20..3beac40f 100644 --- a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs +++ b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs @@ -15,9 +15,9 @@ namespace SJZY.Track.Application.Services.ForewarningServices; public class ForewarningNotifyService : IForewarningNotifyService, ITransientDependency { private IRuleFactorCacheService _ruleFactorCache; - IReadOnlyDictionary> _ruleGroupDict; + IReadOnlyDictionary> _ruleGroupDict; IReadOnlyDictionary> _factorDict; - private IReadOnlyDictionary _rules; + private IReadOnlyDictionary _rules; readonly INotifyService _notifyService; public ForewarningNotifyService(IRuleFactorCacheService ruleFactorCache, INotifyService notifyService) @@ -88,12 +88,12 @@ public class ForewarningNotifyService : IForewarningNotifyService, ITransientDep _rules = null; } - private List DeleteNotifyValue(ForewarningRule rule, int orderId) + private List DeleteNotifyValue(ForewarningRuleItem ruleItem, int orderId) { var members = new List(); - for (var index = 0; index < rule.Count; index++) + for (var index = 0; index < ruleItem.Count; index++) { - var notifyValue = NotifyValue(rule, orderId, index); + var notifyValue = NotifyValue(ruleItem, orderId, index); members.Add(notifyValue); } @@ -105,7 +105,7 @@ public class ForewarningNotifyService : IForewarningNotifyService, ITransientDep /// /// /// - private List GetRule(ForewarningOrderModel order) + private List GetRule(ForewarningOrderModel order) { if (!_factorDict.TryGetValue(GetFactorKey(order.CustomerId, order.SystemId), out var factors)) { @@ -113,7 +113,7 @@ public class ForewarningNotifyService : IForewarningNotifyService, ITransientDep } var keys = GetForewarningKeys(factors, order); - var result = new List(); + var result = new List(); foreach (var item in keys) { @@ -127,7 +127,7 @@ public class ForewarningNotifyService : IForewarningNotifyService, ITransientDep return result; } - private async ValueTask ExecuteRule(List rules, int orderId) + private async ValueTask ExecuteRule(List rules, int orderId) { var members = new List(); foreach (var rule in rules) @@ -140,16 +140,16 @@ public class ForewarningNotifyService : IForewarningNotifyService, ITransientDep return members.Count; } - private List ExecuteRule(ForewarningRule rule, int orderId) + private List ExecuteRule(ForewarningRuleItem ruleItem, int orderId) { var members = new List(); - var intervalMinute = 60 * ((rule.Timeliness - rule.Remind) / rule.Count); // 间隔多少分钟 + var intervalMinute = 60 * ((ruleItem.Timeliness - ruleItem.Remind) / ruleItem.Count); // 间隔多少分钟 - for (var index = 0; index < rule.Count; index++) + for (var index = 0; index < ruleItem.Count; index++) { - var notifyTime = (rule.Remind * 60) + intervalMinute * index; + var notifyTime = (ruleItem.Remind * 60) + intervalMinute * index; var notifyTimestamp = GetTimestamp(DateTime.Now.AddMinutes(notifyTime)); - var notifyValue = new ZMember(NotifyValue(rule, orderId, index), notifyTimestamp); + var notifyValue = new ZMember(NotifyValue(ruleItem, orderId, index), notifyTimestamp); members.Add(notifyValue); } @@ -161,9 +161,9 @@ public class ForewarningNotifyService : IForewarningNotifyService, ITransientDep return new DateTimeOffset(dateTime).ToUnixTimeSeconds(); } - private string NotifyValue(ForewarningRule rule, int orderId, int sort) + private string NotifyValue(ForewarningRuleItem ruleItem, int orderId, int sort) { - var result = new RuleNotifyValue(rule.Id, orderId, sort, rule.TrackEnd); + var result = new RuleNotifyValue(ruleItem.Id, orderId, sort, ruleItem.TrackEnd); return result.ToString(); } @@ -220,9 +220,9 @@ public class ForewarningNotifyService : IForewarningNotifyService, ITransientDep return rule.Area.HasValue ? rule.Area.Value.ToString() : throw new Exception("区域不能为空"); case RuleFactorType.CargoType: return rule.CargoType; - case RuleFactorType.DeparturePort: + case RuleFactorType.LeavePort: return rule.DeparturePort; - case RuleFactorType.Month: + case RuleFactorType.Months: return rule.Month.HasValue ? rule.Month.Value.ToString() : throw new Exception("月份不能为空"); case RuleFactorType.ProductCode: return rule.ProductCode; diff --git a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningService.cs b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningService.cs index 11532104..6a1b011d 100644 --- a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningService.cs +++ b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningService.cs @@ -1,3 +1,5 @@ +using System.ComponentModel.DataAnnotations; +using SJZY.Track.Application.Contract.Dtos.Forewarning; using SJZY.Track.Application.Helpers; using SJZY.Track.Domain.Aggregates.ForewarningAggregate; using SJZY.Track.Domain.Dtos.Forewarning; @@ -8,110 +10,73 @@ namespace SJZY.Track.Application.Services.ForewarningServices; [Route("/ForewarningService")] public class ForewarningService : ApplicationService { - readonly IRuleRepository _ruleRepository; - readonly IRuleFactorRepository _ruleFactorRepository; - private readonly IRuleItemRepository _ruleItemRepository; - - public ForewarningService(IRuleRepository ruleRepository - , IRuleFactorRepository ruleFactorRepository - , IRuleItemRepository ruleItemRepository) + private readonly IWarningRepository _warningRepository; + + public ForewarningService(IWarningRepository warningRepository) { - _ruleRepository = ruleRepository; - _ruleFactorRepository = ruleFactorRepository; - _ruleItemRepository = ruleItemRepository; + _warningRepository = warningRepository; } /// - /// 创建预警模板,存在则更新 + /// 创建预警 /// /// /// - [HttpPost("ModifyForewarning")] - public async ValueTask ModifyForewarning(CreateRuleFactorRequest input) + [HttpPost("CreateWarning")] + public async Task CreateWarning(CreateWarningInput input) { - var factors = ObjectMapper.Map(input); - var ruleItems = ForewarningFactorHelper.GetFactorItem(factors); - - //todo 原子性没有保证,后续可能需要调整 - if (input.RuleId > 0) - { - await _ruleFactorRepository.DeleteByIdAsync(input.RuleId.ToString()); - } - - if (input.RuleId > 0) - { - var ruleTemplate = await _ruleRepository.GetFirstAsync(val => val.Id == input.RuleId); - if (ruleTemplate == null) - return new UnifyResultDto(false, "规则不存在"); - - ruleTemplate.Name = input.Name; - ruleTemplate.CustomId = input.CustomId; - - await _ruleFactorRepository.IndexDocumentAsync(factors); - await _ruleRepository.UpdateForewarning(ruleTemplate, ruleItems); - return new UnifyResultDto(true, "保存成功"); - } - - var newRuleTemplate = ObjectMapper.Map(input); - var ruleId = await _ruleRepository.CreateForewarning(newRuleTemplate, ruleItems); - factors.Id = ruleId.ToString(); - await _ruleFactorRepository.IndexDocumentAsync(factors); - return new UnifyResultDto(true, "保存成功"); + var warning = ObjectMapper.Map(input); + warning.WarningRules = ForewarningHelper.CalcRuleList(input.TrackStatusSpans, input.WarningFactors); + warning.WarningFactors = ForewarningHelper.MapFactorEntities(input.WarningFactors); + await _warningRepository.CreateForewarningAsync(warning); + return true; } /// - /// 修改时效 + /// 修改预警规则时效 /// - [HttpPost("ModifyTimeliness")] - public async ValueTask ModifyTimeliness(ModifyTimelinessRequest input) + /// + /// + /// + [HttpPost("ModifyTimeSpans")] + public async Task ModifyTimeSpans(ModifyTimeSpanInput input) { - var ruleIds = input.Items.Select(val => val.Id).ToList(); - var ruleCollect = - await _ruleItemRepository.GetListAsync(val => ruleIds.Contains(val.Id) && val.RuleId == input.RuleId); - if (ruleCollect == null || ruleCollect.Count == 0) - throw new BusinessException(message: "规则不存在"); - - var ruleMaps = ruleCollect.ToDictionary(val => val.Id); - var notModifyList = new List(); - foreach (var item in input.Items) + if (!await _warningRepository.IsAnyAsync(x => x.Id == input.WarningId)) { - if (!ruleMaps.TryGetValue(item.Id, out var rule)) - { - notModifyList.Add(item.Id); - continue; - } - - rule.Remind = item.Remind; - rule.Timeliness = item.Timeliness; - rule.Count = item.Count; + throw new BusinessException(message: "预警不存在"); } - await _ruleItemRepository.UpdateRangeAsync(ruleCollect, val => val.RuleId == input.RuleId); + if (input.Items.IsNullOrEmpty()) return false; - if (notModifyList.Count > 0) - return new UnifyResultDto(true, $"更新成功,规则{string.Join(",", notModifyList)}不存在"); + var warningRules = ObjectMapper.Map, List>(input.Items); - return new UnifyResultDto(true, "更新成功"); + await _warningRepository.ModifyTimeSpansAsync(warningRules); + + return true; + } + + + /// + /// 获取预警分页列表 + /// + /// + /// + [HttpPost("GetWarningPageList")] + public async Task> GetWarningPageList(GetWarningPageInputVo inputVo) + { + if (!inputVo.KeyWord.IsNullOrEmpty()) inputVo.KeyWord = inputVo.KeyWord!.Trim(); + return await _warningRepository.GetWarningPageListAsync(inputVo); } /// /// 查询预警规则列表 /// + /// 预警规则id /// - [HttpPost("QueryForewarning")] - public async Task QueryForewarning(QueryForewarningRequest input) + [HttpGet("GetWarningRuleList")] + public async Task> GetWarningRuleListAsync([Required] int warningId) { - var result = await _ruleRepository.QueryForewarningRuleAsync(input); - return new UnifyResultDto(true, result); - } - - /// - /// 查询预警规则明细列表 - /// - [HttpPost("QueryForewarningRules")] - public async Task> QueryForewarningRuleItems(QueryForewarningRuleRequest input) - { - return await _ruleItemRepository.QueryForewarningRuleItemsAsync(input); + return await _warningRepository.GetWarningRuleListAsync(warningId); } /// diff --git a/src/SJZY.Track.Application/Services/ForewarningServices/RuleFactorCacheService.cs b/src/SJZY.Track.Application/Services/ForewarningServices/RuleFactorCacheService.cs deleted file mode 100644 index 74bc9345..00000000 --- a/src/SJZY.Track.Application/Services/ForewarningServices/RuleFactorCacheService.cs +++ /dev/null @@ -1,194 +0,0 @@ -using SJZY.Expand.ABP.Core; -using SJZY.Track.Application.Contract.Services; -using SJZY.Track.Domain.Aggregates.ForewarningAggregate; -using SJZY.Track.Domain.Consts; -using SJZY.Track.Domain.Dtos.Forewarning; -using Volo.Abp.DependencyInjection; - -namespace SJZY.Track.Application.Services.ForewarningServices; - -public class RuleFactorCacheService : IRuleFactorCacheService, ITransientDependency -{ - private const string GlobalFactorLockKey = "RuleFactorCacheService_GlobalLock"; - private const string GlobalRuleLockKey = "RuleFactorCacheService_GlobalLock"; - readonly IRuleFactorRepository _ruleFactorRepository; - readonly IRuleItemRepository _ruleItemRepository; - readonly IRuleRepository _ruleRepository; - - public RuleFactorCacheService(IRuleFactorRepository ruleFactorRepository, - IRuleItemRepository ruleItemRepository, IRuleRepository ruleRepository) - { - _ruleFactorRepository = ruleFactorRepository; - _ruleItemRepository = ruleItemRepository; - _ruleRepository = ruleRepository; - } - - private string GetKey() - { - return $"{GlobalConst.RuleFactorKeyPrefix}:allFactor"; - } - - private string GetRuleKey() - { - return $"{GlobalConst.RuleFactorKeyPrefix}:allRule"; - } - - /// - /// 获取所有规则数据 - /// - /// - [NonAction] - public async Task GetAllFactorCollect() - { - var key = GetRuleKey(); - var result = await RedisHelper.Client.GetAsync(key); - if (result == null) - { - using (var globalLock = RedisHelper.Client.Lock(GlobalRuleLockKey, 10)) - { - result = await RedisHelper.Client.GetAsync(key); - if (result != null) return result; - - var ruleCollect = await _ruleItemRepository.GetListAsync(val => true); - if (ruleCollect == null || ruleCollect.Count == 0) - { - ForewarningRule[] rules = new ForewarningRule[0]; - await RedisHelper.Client.SetAsync(key, rules, TimeSpan.FromSeconds(20)); - return result; - } - - var ruleList = ruleCollect.SelectMany(RuleEntityToRule); - await RedisHelper.Client.SetAsync(key, ruleList); - return result; - } - } - - return result; - } - - /// - /// 获取所有因素数据 - /// - /// 获取所有因素,返回值可能为空 - [NonAction] - public async Task> GetAllRuleFactor() - { - var key = GetKey(); - var result = await RedisHelper.Client.GetAsync>(key); - if (result == null) - { - using (var globalLock = RedisHelper.Client.Lock(GlobalFactorLockKey, 10)) - { - result = await RedisHelper.Client.GetAsync>(key); - if (result != null) return result; - - result = await GenerateAllRuleFactor(); - if (result == null || result.Count == 0) - { - await RedisHelper.Client.SetAsync(key, new List(), TimeSpan.FromSeconds(20)); - return result; - } - - await RedisHelper.Client.SetAsync(key, result); - return result; - } - } - - return result; - } - - [NonAction] - public void ClearFactorCache() - { - RedisHelper.Client.DelAsync(GetKey()); - } - - [NonAction] - public void ClearRuleCache() - { - RedisHelper.Client.DelAsync(GetRuleKey()); - } - - private async Task> GenerateAllRuleFactor() - { - var factors = await _ruleFactorRepository.GetAllList(); - var ruleTemplate = await _ruleRepository.GetListAsync(val => true); - var ruleMap = ruleTemplate.ToDictionary(val => val.Id); - var result = new List(); - foreach (var item in factors) - { - if (!ruleMap.TryGetValue(item.RuleId, out var rule)) - continue; - var ruleFactors = EntityToRuleFactor(item, rule); - result.AddRange(ruleFactors); - } - - return result; - } - - private ForewarningRule[] RuleEntityToRule(RuleItemEntity entity) - { - var result = RuleCollectToRule(entity); - if (string.IsNullOrEmpty(entity.Month)) - { - return new ForewarningRule[] { result }; - } - - var months = entity.Month.Split('/'); - var rules = new List(months.Length); - - foreach (var month in months) - { - if (int.TryParse(month, out int monthInt)) - { - var rule = result; - rule.Month = monthInt; - rules.Add(rule); - } - } - - return rules.ToArray(); - } - - private ForewarningRule RuleCollectToRule(RuleItemEntity entity) - { - return new ForewarningRule - { - Id = entity.Id, - RuleId = entity.RuleId, - Remind = entity.Remind, - Timeliness = entity.Timeliness, - Count = entity.Count, - TrackStart = entity.TrackStart, - TrackEnd = entity.TrackEnd, - CargoType = entity.CargoType, - Month = null, - Area = entity.Area, - IsTransit = entity.IsTransit, - DeparturePort = entity.DeparturePort, - ProductCode = entity.ProductCode - }; - } - - private List EntityToRuleFactor(RuleFactorEntity entity, RuleEntity ruleTemplate) - { - List result = new List(); - foreach (var track in entity.Tracks) - { - var item = new RuleFactor() - { - CustomerId = ruleTemplate.CustomId, - RuleId = ruleTemplate.Id, - NotifyUser = track.NotifyUser, - NotifyTemplate = track.NotifyTemplate, - FactorItems = entity.FactorItems, - End = track.End, - Start = track.Start, - SystemId = ruleTemplate.SubSystemId - }; - result.Add(item); - } - - return result; - } -} \ No newline at end of file diff --git a/src/SJZY.Track.Application/Validations/Forewarning/CreateRuleFactorValidation.cs b/src/SJZY.Track.Application/Validations/Forewarning/CreateRuleFactorValidation.cs index 0b3fe50a..cc5cd662 100644 --- a/src/SJZY.Track.Application/Validations/Forewarning/CreateRuleFactorValidation.cs +++ b/src/SJZY.Track.Application/Validations/Forewarning/CreateRuleFactorValidation.cs @@ -3,31 +3,16 @@ using SJZY.Track.Domain.Dtos.Forewarning; namespace SJZY.Track.Application.Validations.Forewarning; -public class CreateRuleFactorValidation : AbstractValidator +public class CreateRuleFactorValidation : AbstractValidator { public CreateRuleFactorValidation() { - RuleForEach(x => x.Tracks).SetValidator(new RuleTrackStateDtoValidator()); - RuleFor(x => x.FactorItems).NotNull().WithMessage("FactorItems cannot be null."); + RuleFor(x => x.WarningFactors).NotNull().WithMessage("因素列表不能为空"); + RuleFor(x => x.TrackStatusSpans).NotNull().WithMessage("轨迹状态列表不能为空"); - RuleFor(x => x.CargoTypes).NotEmpty().WithMessage("CargoTypes cannot be empty."); - RuleForEach(x => x.CargoTypes).NotEmpty().WithMessage("CargoType cannot be empty."); - - RuleFor(x => x.Months).NotEmpty().WithMessage("Months cannot be empty."); - RuleForEach(x => x.Months) - .ForEach(val=>val.Must(t=>t>0)) - .WithMessage("Each month array must have 12 elements."); - - RuleFor(x => x.IsTransit).NotEmpty().WithMessage("IsTransit cannot be empty."); - RuleForEach(x => x.IsTransit).InclusiveBetween(0, 1).WithMessage("IsTransit must be 0 or 1."); - - RuleFor(x => x.Areas).NotEmpty().WithMessage("Areas cannot be empty."); - RuleForEach(x => x.Areas).GreaterThan(0).WithMessage("Area must be greater than 0."); - - RuleFor(x => x.DeparturePorts).NotEmpty().WithMessage("DeparturePorts cannot be empty."); - RuleForEach(x => x.DeparturePorts).NotEmpty().WithMessage("DeparturePort cannot be empty."); - - RuleFor(x => x.ProductCodes).NotEmpty().WithMessage("ProductCodes cannot be empty."); - RuleForEach(x => x.ProductCodes).NotEmpty().WithMessage("ProductCode cannot be empty."); + RuleFor(x => x.NotifyTemplate).NotEmpty().WithMessage("通知模板必填") + .MaximumLength(256).WithMessage("通知模板长度不能超过256"); + + // todo: more validation } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Validations/Forewarning/RuleTrackStateDtoValidator.cs b/src/SJZY.Track.Application/Validations/Forewarning/RuleTrackStateDtoValidator.cs index 6de8c9b6..7dab2f60 100644 --- a/src/SJZY.Track.Application/Validations/Forewarning/RuleTrackStateDtoValidator.cs +++ b/src/SJZY.Track.Application/Validations/Forewarning/RuleTrackStateDtoValidator.cs @@ -3,13 +3,12 @@ using SJZY.Track.Domain.Dtos.Forewarning; namespace SJZY.Track.Application.Validations.Forewarning; -public class RuleTrackStateDtoValidator : AbstractValidator +public class RuleTrackStateDtoValidator : AbstractValidator { public RuleTrackStateDtoValidator() { - RuleFor(x => x.Start).GreaterThanOrEqualTo(0).WithMessage("Start must be greater than or equal to 0."); - RuleFor(x => x.End).GreaterThanOrEqualTo(0).WithMessage("End must be greater than or equal to 0."); - RuleFor(x => x.NotifyUser).NotEmpty().WithMessage("NotifyUser cannot be empty."); - RuleFor(x => x.NotifyTemplate).NotEmpty().WithMessage("NotifyTemplate cannot be empty."); + RuleFor(x => x.StartTrackStatusId).GreaterThan(0).WithMessage("起始轨迹状态id必须大于0"); + RuleFor(x => x.EndTrackStatusId).GreaterThan(0).WithMessage("终止轨迹状态id必须大于0"); + RuleFor(x => x.NotifyUserId).NotEmpty().WithMessage("通知对象不能为空"); } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IForewarningList.cs b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IForewarningList.cs deleted file mode 100644 index ae0406fe..00000000 --- a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IForewarningList.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; - -public interface IForewarningList -{ - void AddForewarning(int score,int id); - - void DeleteForewarning(int score,int id); -} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IRuleFactorRepository.cs b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IRuleFactorRepository.cs deleted file mode 100644 index 38b32ef7..00000000 --- a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IRuleFactorRepository.cs +++ /dev/null @@ -1,10 +0,0 @@ -using SJZY.Expand.ElasticSearch.Services; - -namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; - -public interface IRuleFactorRepository:IElasticsearchClientService -{ - Task> GetFactorByIdsAsync(int[] ruleIds); - - Task> GetAllList(); -} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IRuleItemRepository.cs b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IRuleItemRepository.cs deleted file mode 100644 index c06aa847..00000000 --- a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IRuleItemRepository.cs +++ /dev/null @@ -1,13 +0,0 @@ -using SJZY.Track.Domain.Dtos.Forewarning; - -namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; - -public interface IRuleItemRepository : IBasicRepository -{ - /// - /// 查询分页 - /// - /// - /// - Task> QueryForewarningRuleItemsAsync(QueryForewarningRuleRequest input); -} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IRuleRepository.cs b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IRuleRepository.cs deleted file mode 100644 index 04488ef5..00000000 --- a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IRuleRepository.cs +++ /dev/null @@ -1,12 +0,0 @@ -using SJZY.Track.Domain.Dtos.Forewarning; - -namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; - -public interface IRuleRepository : IBasicRepository -{ - Task CreateForewarning(RuleEntity rule, RuleItemEntity[] ruleItems); - - Task UpdateForewarning(RuleEntity rule, RuleItemEntity[] factorList); - - Task> QueryForewarningRuleAsync(QueryForewarningRequest input); -} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IWarningRepository.cs b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IWarningRepository.cs new file mode 100644 index 00000000..b3f6bd97 --- /dev/null +++ b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IWarningRepository.cs @@ -0,0 +1,48 @@ +using SJZY.Track.Domain.Dtos.Forewarning; + +namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; + +public interface IWarningRepository : IBasicRepository +{ + /// + /// 创建预警 + /// + /// + /// + Task CreateForewarningAsync(WarningEntity warning); + + /// + /// 修改预警 + /// + /// + /// + Task UpdateForewarningAsync(WarningEntity warning); + + /// + /// 复制预警 + /// + /// + /// + Task CopyForewarning(int warningId); + + /// + /// 获取预警分页列表 + /// + /// + /// + Task> GetWarningPageListAsync(GetWarningPageInputVo input); + + /// + /// 获取预警规则列表 + /// + /// 预警id + /// + Task> GetWarningRuleListAsync(int warningId); + + /// + /// 修改预警时效 + /// + /// + /// + Task ModifyTimeSpansAsync(List inputItems); +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/RuleEntity.cs b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/RuleEntity.cs deleted file mode 100644 index 15439fbf..00000000 --- a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/RuleEntity.cs +++ /dev/null @@ -1,60 +0,0 @@ -namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; - -[SugarTable("t_rule")] -public class RuleEntity:IAggregateRoot -{ - /// - /// 自增主键 - /// - [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)] - public int Id { get; set; } - - /// - /// 子系统id - /// - [SugarColumn(ColumnName = "SubSystemId")] - public int SubSystemId { get; set; } - - /// - /// 客户id - /// - [SugarColumn(ColumnName = "CustomId")] - public int CustomId { get; set; } - - /// - /// 规则模板名称,KPI名称 - /// - [SugarColumn(ColumnName = "Name", Length = 64)] - public string Name { get; set; } - - /// - /// 规则模板名称,KPI名称 - /// - [SugarColumn(ColumnName = "CustomName", Length = 64)] - public string CustomName { get; set; } - - /// - /// 创建人 - /// - [SugarColumn(ColumnName = "CreateUserId")] - public int CreateUserId { get; set; } - - /// - /// 创建时间 - /// - [SugarColumn(ColumnName = "CreateTime")] - public DateTime CreateTime { get; set; } - - /// - /// 更新人 - /// - [SugarColumn(ColumnName = "UpdateUserId", IsNullable = false)] - public int UpdateUserId { get; set; } - - /// - /// 更新时间 - /// - [SugarColumn(ColumnName = "UpdateTime", IsNullable = false)] - public DateTime UpdateTime { get; set; } - -} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/RuleFactorEntity.cs b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/RuleFactorEntity.cs deleted file mode 100644 index 0b99b712..00000000 --- a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/RuleFactorEntity.cs +++ /dev/null @@ -1,55 +0,0 @@ -using Nest; -using SJZY.Expand.ElasticSearch; -using SJZY.Track.Domain.Consts; - -namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; - -[ElasticsearchType(RelationName = GlobalConst.RuleFactorIndex)] -public class RuleFactorEntity : IdBaseIndex -{ - /// - /// RuleId 表的id - /// - [Keyword(Index = true)] - public int RuleId { get; set; } - - /// - /// 获取或设置规则跟踪状态实体的列表。 - /// - public List Tracks { get; set; } - - /// - /// 获取或设置因素项模型的列表。 - /// - public List FactorItems { get; set; } - - /// - /// 获取或设置货物类型的列表。 - /// - public List CargoTypes { get; set; } - - /// - /// 获取或设置月份的列表。 - /// - public List Months { get; set; } - - /// - /// 获取或设置是否中转的列表。 - /// - public List IsTransit { get; set; } - - /// - /// 获取或设置区域的列表。 - /// - public List Areas { get; set; } - - /// - /// 获取或设置起运港口的列表。 - /// - public List DeparturePorts { get; set; } - - /// - /// 获取或设置产品编号的列表。 - /// - public List ProductCodes { get; set; } -} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/RuleItemEntity.cs b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/RuleItemEntity.cs deleted file mode 100644 index b08b1edc..00000000 --- a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/RuleItemEntity.cs +++ /dev/null @@ -1,109 +0,0 @@ -namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; - -[SugarTable("t_rule_item")] -public class RuleItemEntity : IAggregateRoot, ICloneable -{ - /// - /// 自增主键 - /// - [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)] - public int Id { get; set; } - - [SugarColumn(ColumnName = "RuleId")] public int RuleId { get; set; } - - /// - /// 提醒的时间(小时) - /// - [SugarColumn(ColumnName = "Remind")] - public float Remind { get; set; } - - /// - /// 时效(小时) - /// - [SugarColumn(ColumnName = "Timeliness")] - public float Timeliness { get; set; } - - /// - /// 提醒次数 - /// - [SugarColumn(ColumnName = "Count")] - public int Count { get; set; } - - /// - /// 起始轨迹 - /// - [SugarColumn(ColumnName = "TrackStart", IsNullable = false)] - public int TrackStart { get; set; } - - /// - /// 终止轨迹 - /// - [SugarColumn(ColumnName = "TrackEnd", IsNullable = false)] - public int TrackEnd { get; set; } - - /// - /// 货物类型 - /// - [SugarColumn(ColumnName = "CargoType", Length = 64)] - public string CargoType { get; set; } - - /// - /// 月份 - /// - [SugarColumn(ColumnName = "Month", Length = 25)] - public string Month { get; set; } - - /// - /// 区域 - /// - [SugarColumn(ColumnName = "Area")] - public int? Area { get; set; } - - /// - /// 是否中转 - /// - [SugarColumn(ColumnName = "IsTransit")] - public bool? IsTransit { get; set; } - - /// - /// 起运港口 - /// - [SugarColumn(ColumnName = "DeparturePort")] - public string DeparturePort { get; set; } - - /// - /// 产品编码 - /// - [SugarColumn(ColumnName = "ProductCode")] - public string ProductCode { get; set; } - - /// - /// 创建人 - /// - [SugarColumn(ColumnName = "CreateUserId")] - public int CreateUserId { get; set; } - - /// - /// 创建时间 - /// - [SugarColumn(ColumnName = "CreateTime")] - public DateTime CreateTime { get; set; } - - /// - /// 更新人 - /// - [SugarColumn(ColumnName = "UpdateUserId")] - public int UpdateUserId { get; set; } - - /// - /// 更新时间 - /// - [SugarColumn(ColumnName = "UpdateTime")] - public DateTime UpdateTime { get; set; } - - public object Clone() - { - var clone = this.MemberwiseClone(); - return clone; - } -} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/RuleTrackStateModel.cs b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/RuleTrackStateModel.cs deleted file mode 100644 index 554d1e2c..00000000 --- a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/RuleTrackStateModel.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; - -public class RuleTrackStateModel -{ - /// - /// Gets or sets the start track value. - /// - public int Start { get; set; } - - /// - /// Gets or sets the end track value. - /// - public int End { get; set; } - - /// - /// Gets or sets the user to notify. - /// - public string NotifyUser { get; set; } - - /// - /// Gets or sets the notification template. - /// - public string NotifyTemplate { get; set; } -} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningEntity.cs b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningEntity.cs new file mode 100644 index 00000000..b713ffe0 --- /dev/null +++ b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningEntity.cs @@ -0,0 +1,53 @@ +namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; + +[SugarTable("t_warning")] +public class WarningEntity: IFullAuditedBasicEntitys, IAggregateRoot +{ + /// + /// 自增主键 + /// + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)] + public int Id { get; set; } + + /// + /// 子系统id + /// + [SugarColumn(ColumnName = "SubSystemId")] + public int SubSystemId { get; set; } + + /// + /// 客户id + /// + [SugarColumn(ColumnName = "CustomerId")] + public int CustomerId { get; set; } + + /// + /// 客户 + /// + [SugarColumn(ColumnName = "CustomerName", Length = 255)] + public string CustomerName { get; set; } = null!; + + /// + /// 规则模板名称,KPI名称 + /// + [SugarColumn(ColumnName = "Name", Length = 64)] + public string Name { get; set; } = null!; + + /// + /// 是否启用,默认否 + /// + [SugarColumn(ColumnName = "IsEnable")] + public bool IsEnable { get; set; } + + /// + /// 预警规则 + /// + [SugarColumn(IsIgnore = true)] + public List WarningRules { get; set; } = new(); + + /// + /// 预警因素 + /// + [SugarColumn(IsIgnore = true)] + public List WarningFactors { get; set; } = new(); +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningFactorEntity.cs b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningFactorEntity.cs new file mode 100644 index 00000000..62a37538 --- /dev/null +++ b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningFactorEntity.cs @@ -0,0 +1,30 @@ +using SJZY.Track.Domain.Enums; + +namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; + +public class WarningFactorEntity : IFullAuditedBasicEntitys +{ + /// + /// 自增主键 + /// + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)] + public int Id { get; set; } + + /// + /// 预警id + /// + [SugarColumn(ColumnName = "WarningId")] + public int WarningId { get; set; } + + /// + /// 因素类型(1货物类型,2月份,3分区,4是否中转,5起运港口,6销售产品) + /// + [SugarColumn(ColumnName = "Type")] + public RuleFactorType Type { get; set; } + + /// + /// 预警因素值(json数组字符串) + /// + [SugarColumn(ColumnName = "Value")] + public string Value { get; set; } = null!; +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningRuleEntity.cs b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningRuleEntity.cs new file mode 100644 index 00000000..ce26f2a1 --- /dev/null +++ b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningRuleEntity.cs @@ -0,0 +1,83 @@ +namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; + +[SugarTable("t_warning_rule")] +public class WarningRuleEntity : IFullAuditedBasicEntitys +{ + /// + /// 自增主键 + /// + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)] + public int Id { get; set; } + + /// + /// 预警id + /// + [SugarColumn(ColumnName = "WarningId")] + public int WarningId { get; set; } + + /// + /// 时效(小时) + /// + [SugarColumn(ColumnName = "TotalTimeSpan")] + public float TotalTimeSpan { get; set; } + + /// + /// 提醒的时间(小时) + /// + [SugarColumn(ColumnName = "WarnTimeSpan")] + public float WarnTimeSpan { get; set; } + + /// + /// 提醒次数 + /// + [SugarColumn(ColumnName = "WarnCount")] + public int WarnCount { get; set; } + + /// + /// 起始轨迹状态id + /// + [SugarColumn(ColumnName = "StartTrackStatusId", IsNullable = false)] + public int StartTrackStatusId { get; set; } + + /// + /// 终止轨迹状态id + /// + [SugarColumn(ColumnName = "EndTrackStatusId", IsNullable = false)] + public int EndTrackStatusId { get; set; } + + /// + /// 货物类型 + /// + [SugarColumn(ColumnName = "CargoType", Length = 64)] + public string? CargoType { get; set; } + + /// + /// 月份 + /// + [SugarColumn(ColumnName = "Months", Length = 25)] + public string? Months { get; set; } + + /// + /// 区域 + /// + [SugarColumn(ColumnName = "AreaId")] + public int? AreaId { get; set; } + + /// + /// 是否中转 + /// + [SugarColumn(ColumnName = "IsTransit")] + public bool? IsTransit { get; set; } + + /// + /// 起运港口 + /// + [SugarColumn(ColumnName = "LeavePort")] + public string? LeavePort { get; set; } + + /// + /// 产品编码 + /// + [SugarColumn(ColumnName = "ProductCode")] + public string? ProductCode { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Forewarning/CreateRuleRequest.cs b/src/SJZY.Track.Domain/Dtos/Forewarning/CreateRuleRequest.cs index 68199b0f..0226853e 100644 --- a/src/SJZY.Track.Domain/Dtos/Forewarning/CreateRuleRequest.cs +++ b/src/SJZY.Track.Domain/Dtos/Forewarning/CreateRuleRequest.cs @@ -1,16 +1,14 @@ +using System.ComponentModel.DataAnnotations; +using SJZY.Track.Domain.Enums; + namespace SJZY.Track.Domain.Dtos.Forewarning { - public class CreateRuleFactorRequest + public class CreateWarningInput { - /// - /// RuleId 表的id,小于0 表示创建新的规则 - /// - public int RuleId { get; set; } - /// /// 模板名称 /// - public string Name { get; set; } + public string Name { get; set; } = null!; /// /// 子系统id @@ -20,46 +18,31 @@ namespace SJZY.Track.Domain.Dtos.Forewarning /// /// 客户id /// - public int CustomId { get; set; } + public int CustomerId { get; set; } /// - /// 获取或设置规则跟踪状态实体的列表。 + /// 客户名称 /// - public List Tracks { get; set; } + public string CustomerName { get; set; } = null!; /// - /// 获取或设置因素项模型的列表。 + /// 通知方式 /// - public List FactorItems { get; set; } + public NotifyMode NotifyMode { get; set; } /// - /// 获取或设置货物类型的列表。 + /// 通知模板 /// - public List CargoTypes { get; set; } + public string NotifyTemplate { get; set; } = null!; /// - /// 获取或设置月份的列表。 + /// 轨迹状态跨度列表 /// - public List Months { get; set; } + public List TrackStatusSpans { get; set; } = new(); /// - /// 获取或设置是否中转的列表。 + /// 预警因素列表。 /// - public List IsTransit { get; set; } - - /// - /// 获取或设置区域的列表。 - /// - public List Areas { get; set; } - - /// - /// 获取或设置起运港口的列表。 - /// - public List DeparturePorts { get; set; } - - /// - /// 获取或设置产品编号的列表。 - /// - public List ProductCodes { get; set; } + public List WarningFactors { get; set; } = new(); } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Forewarning/FactorItemDto.cs b/src/SJZY.Track.Domain/Dtos/Forewarning/FactorItemDto.cs deleted file mode 100644 index 9360d491..00000000 --- a/src/SJZY.Track.Domain/Dtos/Forewarning/FactorItemDto.cs +++ /dev/null @@ -1,16 +0,0 @@ -using SJZY.Track.Domain.Enums; - -namespace SJZY.Track.Domain.Dtos.Forewarning; - -public class FactorItemDto -{ - /// - /// Gets or sets the sort order. - /// - public int Sort { get; set; } - - /// - /// Gets or sets the type of the rule factor. - /// - public RuleFactorType FactorType { get; set; } -} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Forewarning/ForewarningRule.cs b/src/SJZY.Track.Domain/Dtos/Forewarning/ForewarningRuleItem.cs similarity index 91% rename from src/SJZY.Track.Domain/Dtos/Forewarning/ForewarningRule.cs rename to src/SJZY.Track.Domain/Dtos/Forewarning/ForewarningRuleItem.cs index b8499e64..ef550296 100644 --- a/src/SJZY.Track.Domain/Dtos/Forewarning/ForewarningRule.cs +++ b/src/SJZY.Track.Domain/Dtos/Forewarning/ForewarningRuleItem.cs @@ -1,6 +1,6 @@ namespace SJZY.Track.Domain.Dtos.Forewarning; -public record struct ForewarningRule:IForewarningFactorValue +public record struct ForewarningRuleItem:IForewarningFactorValue { public int Id { get; set; } diff --git a/src/SJZY.Track.Domain/Dtos/Forewarning/GetWarningPageInputVo.cs b/src/SJZY.Track.Domain/Dtos/Forewarning/GetWarningPageInputVo.cs new file mode 100644 index 00000000..08d0b0ea --- /dev/null +++ b/src/SJZY.Track.Domain/Dtos/Forewarning/GetWarningPageInputVo.cs @@ -0,0 +1,14 @@ +namespace SJZY.Track.Domain.Dtos.Forewarning; + +public class GetWarningPageInputVo: PageInfoInput +{ + /// + /// 子系统id + /// + public int? SystemId { get; set; } + + /// + /// 关键字(客户or名称) + /// + public string? KeyWord { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Forewarning/QueryForewarningRuleRequest.cs b/src/SJZY.Track.Domain/Dtos/Forewarning/GetWarningRuleListInput.cs similarity index 87% rename from src/SJZY.Track.Domain/Dtos/Forewarning/QueryForewarningRuleRequest.cs rename to src/SJZY.Track.Domain/Dtos/Forewarning/GetWarningRuleListInput.cs index 0014a95a..72b951be 100644 --- a/src/SJZY.Track.Domain/Dtos/Forewarning/QueryForewarningRuleRequest.cs +++ b/src/SJZY.Track.Domain/Dtos/Forewarning/GetWarningRuleListInput.cs @@ -1,6 +1,6 @@ namespace SJZY.Track.Domain.Dtos.Forewarning; -public class QueryForewarningRuleRequest: PageInfoInput +public class GetWarningRuleListInput: PageInfoInput { /// /// kpi 预警规则模板id diff --git a/src/SJZY.Track.Domain/Dtos/Forewarning/ModifyTimelinessRequest.cs b/src/SJZY.Track.Domain/Dtos/Forewarning/ModifyTimelinessRequest.cs deleted file mode 100644 index 841292f7..00000000 --- a/src/SJZY.Track.Domain/Dtos/Forewarning/ModifyTimelinessRequest.cs +++ /dev/null @@ -1,40 +0,0 @@ -namespace SJZY.Track.Domain.Dtos.Forewarning; - -public class ModifyTimelinessRequest -{ - /// - /// 规则详情中的时效相关信息 - /// - public List Items { get; set; } - - /// - /// 规则模板id - /// - public int RuleId { get; set; } -} - -/// -/// 规则详情时效 -/// -public class TimelinessDto -{ - /// - /// 时效 - /// - public float Timeliness { get; set; } - - /// - /// 提醒时效 - /// - public float Remind { get; set; } - - /// - /// 提醒次数 - /// - public int Count { get; set; } - - /// - /// 规则详情id - /// - public int Id { get; set; } -} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Forewarning/QueryForewarningRequest.cs b/src/SJZY.Track.Domain/Dtos/Forewarning/QueryForewarningRequest.cs deleted file mode 100644 index 5bb9fea1..00000000 --- a/src/SJZY.Track.Domain/Dtos/Forewarning/QueryForewarningRequest.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace SJZY.Track.Domain.Dtos.Forewarning; - -public class QueryForewarningRequest: PageInfoInput -{ - /// - /// 子系统id - /// - public int? SystemId { get; set; } - - /// - /// 客户或者模板名称 - /// - public string? KeyWord { get; set; } - - /// - /// 排序方式,不填不排序 - /// - public string? SortField { get; set; } - - /// - /// 排序方式 - /// - public bool IsAsc { get; set; } = false; -} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Forewarning/RuleCollectDto.cs b/src/SJZY.Track.Domain/Dtos/Forewarning/RuleCollectDto.cs deleted file mode 100644 index 4cce0e58..00000000 --- a/src/SJZY.Track.Domain/Dtos/Forewarning/RuleCollectDto.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace SJZY.Track.Domain.Dtos.Forewarning; - -public class RuleCollectDto -{ - public int Id { get; set; } - public int RuleId { get; set; } - public float Remind { get; set; } - public float Timeliness { get; set; } - public int Count { get; set; } - public int TrackStart { get; set; } - public int TrackEnd { get; set; } - public string CargoType { get; set; } - public string Month { get; set; } - public int? Area { get; set; } - public bool? IsTransit { get; set; } - public string DeparturePort { get; set; } - public string ProductCode { get; set; } - public int CreateUserId { get; set; } - public DateTime CreateTime { get; set; } - public int UpdateUserId { get; set; } - public DateTime UpdateTime { get; set; } -} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Forewarning/RuleInfoModel.cs b/src/SJZY.Track.Domain/Dtos/Forewarning/RuleInfoModel.cs deleted file mode 100644 index 93644080..00000000 --- a/src/SJZY.Track.Domain/Dtos/Forewarning/RuleInfoModel.cs +++ /dev/null @@ -1,42 +0,0 @@ -using SJZY.Track.Domain.Aggregates.ForewarningAggregate; -using SJZY.Track.Domain.Enums; - -namespace SJZY.Track.Domain.Dtos.Forewarning; - -public class RuleInfoModel -{ - /// - /// 获取或设置因素项模型的列表。 - /// - public FactorItemModel FactorItems { get; set; } - - /// - /// 获取或设置货物类型的列表。 - /// - public string CargoTypes { get; set; } - - /// - /// 获取或设置月份的列表。 - /// - public short Months { get; set; } - - /// - /// 获取或设置是否中转的列表。 - /// - public bool? IsTransit { get; set; } - - /// - /// 获取或设置区域的列表。 - /// - public int Areas { get; set; } - - /// - /// 获取或设置起运港口的列表。 - /// - public string DeparturePorts { get; set; } - - /// - /// 获取或设置产品编号的列表。 - /// - public string ProductCodes { get; set; } -} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Forewarning/RuleTrackStateDto.cs b/src/SJZY.Track.Domain/Dtos/Forewarning/RuleTrackStateDto.cs deleted file mode 100644 index 52abd1fa..00000000 --- a/src/SJZY.Track.Domain/Dtos/Forewarning/RuleTrackStateDto.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace SJZY.Track.Domain.Dtos.Forewarning; - -public class RuleTrackStateDto -{ - /// - /// Gets or sets the start track value. - /// - public int Start { get; set; } - - /// - /// Gets or sets the end track value. - /// - public int End { get; set; } - - /// - /// Gets or sets the user to notify. - /// - public string NotifyUser { get; set; } - - /// - /// Gets or sets the notification template. - /// - public string NotifyTemplate { get; set; } -} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Forewarning/TrackStatusSpanDto.cs b/src/SJZY.Track.Domain/Dtos/Forewarning/TrackStatusSpanDto.cs new file mode 100644 index 00000000..f9eda466 --- /dev/null +++ b/src/SJZY.Track.Domain/Dtos/Forewarning/TrackStatusSpanDto.cs @@ -0,0 +1,19 @@ +namespace SJZY.Track.Domain.Dtos.Forewarning; + +public class TrackStatusSpanDto +{ + /// + /// 起始轨迹状态id + /// + public int StartTrackStatusId { get; set; } + + /// + /// 终止轨迹状态id + /// + public int EndTrackStatusId { get; set; } + + /// + /// 通知人id + /// + public int NotifyUserId { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Forewarning/WarningFactorDto.cs b/src/SJZY.Track.Domain/Dtos/Forewarning/WarningFactorDto.cs new file mode 100644 index 00000000..3d4e93b9 --- /dev/null +++ b/src/SJZY.Track.Domain/Dtos/Forewarning/WarningFactorDto.cs @@ -0,0 +1,17 @@ +using Newtonsoft.Json.Linq; +using SJZY.Track.Domain.Enums; + +namespace SJZY.Track.Domain.Dtos.Forewarning; + +public class WarningFactorDto +{ + /// + /// 因素类型 + /// + public RuleFactorType FactorType { get; set; } + + /// + /// 因素值 + /// + public JArray FactorValue { get; set; } = new(); +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Forewarning/WarningPageOutput.cs b/src/SJZY.Track.Domain/Dtos/Forewarning/WarningPageOutput.cs new file mode 100644 index 00000000..58408422 --- /dev/null +++ b/src/SJZY.Track.Domain/Dtos/Forewarning/WarningPageOutput.cs @@ -0,0 +1,29 @@ +namespace SJZY.Track.Domain.Dtos.Forewarning; + +public class WarningPageOutput +{ + /// + /// 预警id + /// + public int Id { get; set; } + + /// + /// 子系统 + /// + public string SubSystem { get; set; } = null!; + + /// + /// 客户 + /// + public string Custom { get; set; } = null!; + + /// + /// 规则模板名称,KPI名称 + /// + public string Name { get; set; } = null!; + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Forewarning/WarningRuleOutput.cs b/src/SJZY.Track.Domain/Dtos/Forewarning/WarningRuleOutput.cs new file mode 100644 index 00000000..c614eb38 --- /dev/null +++ b/src/SJZY.Track.Domain/Dtos/Forewarning/WarningRuleOutput.cs @@ -0,0 +1,64 @@ +namespace SJZY.Track.Domain.Dtos.Forewarning; + +public class WarningRuleOutput +{ + /// + /// 自增主键 + /// + public int Id { get; set; } + + /// + /// 时效(小时) + /// + public float TotalTimeSpan { get; set; } + + /// + /// 提醒的时间(小时) + /// + public float WarnTimeSpan { get; set; } + + /// + /// 提醒次数 + /// + public int WarnCount { get; set; } + + /// + /// 起始轨迹状态 + /// + public string StartTrackStatus { get; set; } = null!; + + /// + /// 终止轨迹状态 + /// + public string EndTrackStatus { get; set; } = null!; + + /// + /// 货物类型 + /// + public string? CargoType { get; set; } + + /// + /// 月份 + /// + public string? Months { get; set; } + + /// + /// 区域 + /// + public int? AreaId { get; set; } + + /// + /// 是否中转 + /// + public bool? IsTransit { get; set; } + + /// + /// 起运港口 + /// + public string? LeavePort { get; set; } + + /// + /// 销售产品 + /// + public string? ProductCode { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Order/GetOrderDetailsInputVO.cs b/src/SJZY.Track.Domain/Dtos/Order/GetOrderDetailsInputVO.cs deleted file mode 100644 index 082b245a..00000000 --- a/src/SJZY.Track.Domain/Dtos/Order/GetOrderDetailsInputVO.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace SJZY.Track.Domain.Dtos.Order -{ - public class GetOrderDetailsInputVO - { - - } - - public class TrackOrderDetailVO - { - - } -} diff --git a/src/SJZY.Track.Domain/Enums/NotifyMode.cs b/src/SJZY.Track.Domain/Enums/NotifyMode.cs new file mode 100644 index 00000000..f5821903 --- /dev/null +++ b/src/SJZY.Track.Domain/Enums/NotifyMode.cs @@ -0,0 +1,14 @@ +namespace SJZY.Track.Domain.Enums; + +public enum NotifyMode +{ + /// + /// 站内信 + /// + SiteInternal = 1, + + /// + /// 飞书 + /// + FeiShu = 2 +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Enums/RuleFactorType.cs b/src/SJZY.Track.Domain/Enums/RuleFactorType.cs index 64d32839..5ff3e3e5 100644 --- a/src/SJZY.Track.Domain/Enums/RuleFactorType.cs +++ b/src/SJZY.Track.Domain/Enums/RuleFactorType.cs @@ -9,12 +9,12 @@ public enum RuleFactorType /// /// 表示货物类型。 /// - CargoType, + CargoType = 1, /// /// 表示月份。 /// - Month, + Months, /// /// 表示分区或区域。 @@ -29,10 +29,10 @@ public enum RuleFactorType /// /// 表示起运港口。 /// - DeparturePort, + LeavePort, /// - /// 表示产品编号。 + /// 表示销售产品。 /// ProductCode } \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index 85df94ed..aa825973 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -96,7 +96,7 @@ AND `a`.`IsDeleted` = 0 AND `b`.`IsDeleted` = 0;"); public async Task UnLinkByIdsAsync(List linkIds) { - await Context.Deleteable(linkIds).ExecuteCommandAsync(); + await Context.Deleteable(linkIds).ExecuteCommandAsync(); } #endregion diff --git a/src/SJZY.Track.Repository/Repositories/RuleFactorRepository.cs b/src/SJZY.Track.Repository/Repositories/RuleFactorRepository.cs deleted file mode 100644 index b9492f28..00000000 --- a/src/SJZY.Track.Repository/Repositories/RuleFactorRepository.cs +++ /dev/null @@ -1,53 +0,0 @@ -using Nest; -using SJZY.Expand.ElasticSearch.Services; -using SJZY.Track.Domain.Aggregates.ForewarningAggregate; - -namespace SJZY.Track.Repository.Repositories; - -public class RuleFactorRepository:ElasticSearchContextAbstract, IRuleFactorRepository, - ITransientDependency -{ - public RuleFactorRepository(ConnectionFactory connectionFactory) : base(connectionFactory) - { - } - - public async Task CreateAsync(RuleFactorEntity entity) - { - await IndexDocumentAsync(entity); - } - - public async Task> GetFactorByIdsAsync(int[] ruleIds) - { - var response = await Context.SearchAsync(s => s.Query(q => q.Terms(t => t.Field(f => f.RuleId).Terms(ruleIds)))); - int num = response.ApiCall.HttpStatusCode ?? throw new Exception("数据查询失败,原因:" + response.DebugInformation); - switch (num) - { - case 200: - return response.Documents.ToList(); - case 404: - return new List(); - default: - throw new Exception($"数据查询失败,http status: {num},原因:{response.DebugInformation}"); - } - } - - /// - /// 获取所有数据 - /// - /// - /// - public async Task> GetAllList() - { - var response = await Context.SearchAsync(); - int num = response.ApiCall.HttpStatusCode ?? throw new Exception("数据查询失败,原因:" + response.DebugInformation); - switch (num) - { - case 200: - return response.Documents.ToList(); - case 404: - return new List(); - default: - throw new Exception($"数据查询失败,http status: {num},原因:{response.DebugInformation}"); - } - } -} \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Repositories/RuleItemRepository.cs b/src/SJZY.Track.Repository/Repositories/RuleItemRepository.cs deleted file mode 100644 index 03139fb6..00000000 --- a/src/SJZY.Track.Repository/Repositories/RuleItemRepository.cs +++ /dev/null @@ -1,50 +0,0 @@ -using SJZY.Track.Domain.Aggregates.ForewarningAggregate; -using SJZY.Track.Domain.Dtos.Forewarning; - -namespace SJZY.Track.Repository.Repositories; - -public class RuleItemRepository : BasicRepository, IRuleItemRepository, ITransientDependency -{ - /// - /// 查询预警规则分页信息 - /// - /// - /// - public Task> QueryForewarningRuleItemsAsync(QueryForewarningRuleRequest input) - { - var query = Context.Queryable() - .Where(val => val.RuleId == input.RuleId); - - if (!string.IsNullOrEmpty(input.SortField)) - { - query = query.OrderByPropertyName(input.SortField, input.IsAsc ? OrderByType.Asc : OrderByType.Desc); - } - - return query.Select(val => MapToDto(val)) - .ToPagedListAsync(input.PageIndex, input.PageSize); - } - - private RuleCollectDto MapToDto(RuleItemEntity entity) - { - return new RuleCollectDto() - { - Id = entity.Id, - RuleId = entity.RuleId, - Remind = entity.Remind, - Timeliness = entity.Timeliness, - Count = entity.Count, - TrackStart = entity.TrackStart, - TrackEnd = entity.TrackEnd, - CargoType = entity.CargoType, - Month = entity.Month, - Area = entity.Area, - IsTransit = entity.IsTransit, - DeparturePort = entity.DeparturePort, - ProductCode = entity.ProductCode, - CreateUserId = entity.CreateUserId, - CreateTime = entity.CreateTime, - UpdateUserId = entity.UpdateUserId, - UpdateTime = entity.UpdateTime - }; - } -} \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Repositories/RuleRepository.cs b/src/SJZY.Track.Repository/Repositories/RuleRepository.cs deleted file mode 100644 index a285017a..00000000 --- a/src/SJZY.Track.Repository/Repositories/RuleRepository.cs +++ /dev/null @@ -1,52 +0,0 @@ -using SJZY.Track.Domain; -using SJZY.Track.Domain.Aggregates.ForewarningAggregate; -using SJZY.Track.Domain.Dtos.Forewarning; - -namespace SJZY.Track.Repository.Repositories; - -public class RuleRepository : BasicRepository, IRuleRepository, ITransientDependency -{ - public async Task CreateForewarning(RuleEntity rule, RuleItemEntity[] ruleItems) - { - using var tran = TransactionHelper.GetReadCommitted(); - - var ruleId = await InsertReturnIdentityAsync(rule); - foreach (var item in ruleItems) - { - item.RuleId = ruleId; - } - - await Context.Insertable(ruleItems).ExecuteCommandAsync(); - tran.Complete(); - return ruleId; - } - - public async Task UpdateForewarning(RuleEntity rule, RuleItemEntity[] factorList) - { - using var tran = TransactionHelper.GetReadCommitted(); - await UpdateAsync(rule); - await Context.Deleteable().Where(x => x.RuleId == rule.Id).ExecuteCommandAsync(); - await Context.Insertable(factorList).ExecuteCommandAsync(); - tran.Complete(); - } - - /// - /// 查询预警模板分页信息 - /// - /// - /// - public Task> QueryForewarningRuleAsync(QueryForewarningRequest input) - { - var query = Context.Queryable() - .WhereIF(input.SystemId.HasValue, val => val.SubSystemId == input.SystemId) - .WhereIF(!string.IsNullOrEmpty(input.KeyWord), - val => val.CustomName.Contains(input.KeyWord!) || val.Name.Contains(input.KeyWord!)); - - if (!string.IsNullOrEmpty(input.SortField)) - { - query = query.OrderByPropertyName(input.SortField, input.IsAsc ? OrderByType.Asc : OrderByType.Desc); - } - - return query.ToPagedListAsync(input.PageIndex, input.PageSize); - } -} \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Repositories/WarningRepository.cs b/src/SJZY.Track.Repository/Repositories/WarningRepository.cs new file mode 100644 index 00000000..81c704ac --- /dev/null +++ b/src/SJZY.Track.Repository/Repositories/WarningRepository.cs @@ -0,0 +1,75 @@ +using SJZY.Track.Domain; +using SJZY.Track.Domain.Aggregates.ForewarningAggregate; +using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; +using SJZY.Track.Domain.Dtos.Forewarning; +using SJZY.Track.Domain.VEntities; + +namespace SJZY.Track.Repository.Repositories; + +public class WarningRepository : BasicRepository, IWarningRepository, ITransientDependency +{ + public async Task CreateForewarningAsync(WarningEntity warning) + { + using var tran = TransactionHelper.GetReadCommitted(); + + var ruleId = await InsertReturnIdentityAsync(warning); + warning.WarningRules.ForEach(x => x.WarningId = ruleId); + warning.WarningFactors.ForEach(x => x.WarningId = ruleId); + + await Context.Insertable(warning.WarningRules).ExecuteCommandAsync(); + await Context.Insertable(warning.WarningFactors).ExecuteCommandAsync(); + tran.Complete(); + return ruleId; + } + + public Task UpdateForewarningAsync(WarningEntity warning) + { + throw new NotImplementedException(); + } + + public Task CopyForewarning(int warningId) + { + throw new NotImplementedException(); + } + + public Task> GetWarningPageListAsync(GetWarningPageInputVo input) + { + var query = Context.Queryable() + .LeftJoin((a, b) => a.SubSystemId == b.Id) + .WhereIF(input.SystemId.HasValue, (a, b) => a.SubSystemId == input.SystemId) + .WhereIF(!string.IsNullOrEmpty(input.KeyWord), a => a.CustomerName.Contains(input.KeyWord!) || a.Name.Contains(input.KeyWord!)) + .OrderBy(a => a.UpdateTime, OrderByType.Desc); + + return query + .Select((a, b) => new WarningPageOutput + { + Id = a.Id, + SubSystem = b.CnName, + Custom = a.CustomerName, + Name = a.Name, + UpdateTime = a.UpdateTime + }) + .ToPagedListAsync(input.PageIndex, input.PageSize); + } + + public async Task> GetWarningRuleListAsync(int warningId) + { + return await Context.Queryable() + .LeftJoin((a, b) => a.StartTrackStatusId == b.Id) + .LeftJoin((a, b, c) => a.EndTrackStatusId == c.Id) + .Where(a => a.WarningId == warningId) + .Select((a, b, c) => new WarningRuleOutput + { + StartTrackStatus = b.Status, + EndTrackStatus = c.Status, + }, true) + .ToListAsync(); + } + + public async Task ModifyTimeSpansAsync(List rules) + { + return await Context.Updateable(rules) + .UpdateColumns(x => new { x.TotalTimeSpan, x.WarnTimeSpan, x.WarnCount }) + .ExecuteCommandAsync(); + } +} \ No newline at end of file