From c3f904ccdcc44959f24a50318621a4def581c925 Mon Sep 17 00:00:00 2001
From: xiaolipro <2357729423@qq.com>
Date: Thu, 25 Jul 2024 21:06:06 +0800
Subject: [PATCH] =?UTF-8?q?importance=EF=BC=9A=E9=A2=84=E8=AD=A6=E5=88=9D?=
=?UTF-8?q?=E6=AD=A5=E9=87=8D=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Dtos/Forewarning/ModifyTimeSpanInput.cs | 17 ++
.../Dtos/Forewarning/WarningTimeSpanDto.cs | 27 +++
.../Services/IRuleFactorCacheService.cs | 2 +-
.../AutoMapper/ForewarningMapperProfile.cs | 18 +-
...TrackChangeAfterUpdateOrderEventHandler.cs | 6 +-
.../TrackPushCompletedEventHandler.cs | 2 +-
.../EventHandlers/TrackPushEventHandler.cs | 4 +-
.../Helpers/ForewarningFactorHelper.cs | 65 ------
.../Helpers/ForewarningHelper.cs | 139 +++++++++++++
.../ForewarningNotifyService.cs | 34 +--
.../ForewarningServices/ForewarningService.cs | 123 ++++-------
.../RuleFactorCacheService.cs | 194 ------------------
.../Forewarning/CreateRuleFactorValidation.cs | 29 +--
.../Forewarning/RuleTrackStateDtoValidator.cs | 9 +-
.../ForewarningAggregate/IForewarningList.cs | 8 -
.../IRuleFactorRepository.cs | 10 -
.../IRuleItemRepository.cs | 13 --
.../ForewarningAggregate/IRuleRepository.cs | 12 --
.../IWarningRepository.cs | 48 +++++
.../ForewarningAggregate/RuleEntity.cs | 60 ------
.../ForewarningAggregate/RuleFactorEntity.cs | 55 -----
.../ForewarningAggregate/RuleItemEntity.cs | 109 ----------
.../RuleTrackStateModel.cs | 24 ---
.../ForewarningAggregate/WarningEntity.cs | 53 +++++
.../WarningFactorEntity.cs | 30 +++
.../ForewarningAggregate/WarningRuleEntity.cs | 83 ++++++++
.../Dtos/Forewarning/CreateRuleRequest.cs | 49 ++---
.../Dtos/Forewarning/FactorItemDto.cs | 16 --
...ewarningRule.cs => ForewarningRuleItem.cs} | 2 +-
.../Dtos/Forewarning/GetWarningPageInputVo.cs | 14 ++
...eRequest.cs => GetWarningRuleListInput.cs} | 2 +-
.../Forewarning/ModifyTimelinessRequest.cs | 40 ----
.../Forewarning/QueryForewarningRequest.cs | 24 ---
.../Dtos/Forewarning/RuleCollectDto.cs | 22 --
.../Dtos/Forewarning/RuleInfoModel.cs | 42 ----
.../Dtos/Forewarning/RuleTrackStateDto.cs | 24 ---
.../Dtos/Forewarning/TrackStatusSpanDto.cs | 19 ++
.../Dtos/Forewarning/WarningFactorDto.cs | 17 ++
.../Dtos/Forewarning/WarningPageOutput.cs | 29 +++
.../Dtos/Forewarning/WarningRuleOutput.cs | 64 ++++++
.../Dtos/Order/GetOrderDetailsInputVO.cs | 18 --
src/SJZY.Track.Domain/Enums/NotifyMode.cs | 14 ++
src/SJZY.Track.Domain/Enums/RuleFactorType.cs | 8 +-
.../Repositories/OrderRepository.cs | 2 +-
.../Repositories/RuleFactorRepository.cs | 53 -----
.../Repositories/RuleItemRepository.cs | 50 -----
.../Repositories/RuleRepository.cs | 52 -----
.../Repositories/WarningRepository.cs | 75 +++++++
48 files changed, 732 insertions(+), 1078 deletions(-)
create mode 100644 src/SJZY.Track.Application.Contract/Dtos/Forewarning/ModifyTimeSpanInput.cs
create mode 100644 src/SJZY.Track.Application.Contract/Dtos/Forewarning/WarningTimeSpanDto.cs
delete mode 100644 src/SJZY.Track.Application/Helpers/ForewarningFactorHelper.cs
create mode 100644 src/SJZY.Track.Application/Helpers/ForewarningHelper.cs
delete mode 100644 src/SJZY.Track.Application/Services/ForewarningServices/RuleFactorCacheService.cs
delete mode 100644 src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IForewarningList.cs
delete mode 100644 src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IRuleFactorRepository.cs
delete mode 100644 src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IRuleItemRepository.cs
delete mode 100644 src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IRuleRepository.cs
create mode 100644 src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IWarningRepository.cs
delete mode 100644 src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/RuleEntity.cs
delete mode 100644 src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/RuleFactorEntity.cs
delete mode 100644 src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/RuleItemEntity.cs
delete mode 100644 src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/RuleTrackStateModel.cs
create mode 100644 src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningEntity.cs
create mode 100644 src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningFactorEntity.cs
create mode 100644 src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningRuleEntity.cs
delete mode 100644 src/SJZY.Track.Domain/Dtos/Forewarning/FactorItemDto.cs
rename src/SJZY.Track.Domain/Dtos/Forewarning/{ForewarningRule.cs => ForewarningRuleItem.cs} (91%)
create mode 100644 src/SJZY.Track.Domain/Dtos/Forewarning/GetWarningPageInputVo.cs
rename src/SJZY.Track.Domain/Dtos/Forewarning/{QueryForewarningRuleRequest.cs => GetWarningRuleListInput.cs} (87%)
delete mode 100644 src/SJZY.Track.Domain/Dtos/Forewarning/ModifyTimelinessRequest.cs
delete mode 100644 src/SJZY.Track.Domain/Dtos/Forewarning/QueryForewarningRequest.cs
delete mode 100644 src/SJZY.Track.Domain/Dtos/Forewarning/RuleCollectDto.cs
delete mode 100644 src/SJZY.Track.Domain/Dtos/Forewarning/RuleInfoModel.cs
delete mode 100644 src/SJZY.Track.Domain/Dtos/Forewarning/RuleTrackStateDto.cs
create mode 100644 src/SJZY.Track.Domain/Dtos/Forewarning/TrackStatusSpanDto.cs
create mode 100644 src/SJZY.Track.Domain/Dtos/Forewarning/WarningFactorDto.cs
create mode 100644 src/SJZY.Track.Domain/Dtos/Forewarning/WarningPageOutput.cs
create mode 100644 src/SJZY.Track.Domain/Dtos/Forewarning/WarningRuleOutput.cs
delete mode 100644 src/SJZY.Track.Domain/Dtos/Order/GetOrderDetailsInputVO.cs
create mode 100644 src/SJZY.Track.Domain/Enums/NotifyMode.cs
delete mode 100644 src/SJZY.Track.Repository/Repositories/RuleFactorRepository.cs
delete mode 100644 src/SJZY.Track.Repository/Repositories/RuleItemRepository.cs
delete mode 100644 src/SJZY.Track.Repository/Repositories/RuleRepository.cs
create mode 100644 src/SJZY.Track.Repository/Repositories/WarningRepository.cs
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 cd7ec8f7..f28ffc69 100644
--- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs
+++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs
@@ -23,8 +23,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 85faff5d..8a0fcd0e 100644
--- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs
+++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs
@@ -91,7 +91,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