From db42bcc2b37c12d8a96df724d0cb51f24c321206 Mon Sep 17 00:00:00 2001 From: xiaolipro <2357729423@qq.com> Date: Mon, 5 Aug 2024 09:23:26 +0800 Subject: [PATCH 1/4] =?UTF-8?q?temp=EF=BC=9Aremove=20notify=20table?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/Forewarning/CreateWarningInput.cs | 12 +-- .../Dtos/Forewarning/EditWarningOutput.cs | 20 +---- .../Dtos/Forewarning/UpdateWarningInput.cs | 27 +----- .../Helpers/ForewarningHelper.cs | 54 ++++-------- .../ForewarningServices/ForewarningService.cs | 86 +++++++++++++------ .../Forewarning/CreateRuleFactorValidation.cs | 3 - .../Forewarning/RuleTrackStateDtoValidator.cs | 2 +- .../IWarningRepository.cs | 4 +- .../ForewarningAggregate/WarningEntity.cs | 6 -- .../WarningNotifyEntity.cs | 49 ----------- .../ForewarningAggregate/WarningRuleEntity.cs | 14 +++ .../TrackStatusAggregate/TrackStatusEntity.cs | 12 +-- ...arningNitifyDto.cs => WarningNotifyDto.cs} | 9 +- src/SJZY.Track.Domain/Enums/NotifyMode.cs | 5 +- .../Queries/WarningQueries.cs | 10 +-- .../Repositories/WarningRepository.cs | 29 +++++-- 16 files changed, 142 insertions(+), 200 deletions(-) delete mode 100644 src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningNotifyEntity.cs rename src/SJZY.Track.Domain/Dtos/Forewarning/{WarningNitifyDto.cs => WarningNotifyDto.cs} (78%) diff --git a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/CreateWarningInput.cs b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/CreateWarningInput.cs index 0179e744..96ee907a 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/CreateWarningInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/CreateWarningInput.cs @@ -20,20 +20,10 @@ public class CreateWarningInput /// public int CustomerId { get; set; } - /// - /// 通知方式 - /// - public NotifyMode NotifyMode { get; set; } - - /// - /// 通知模板 - /// - public string NotifyTemplate { get; set; } = null!; - /// /// 轨迹状态跨度列表 /// - public List TrackStatusSpans { get; set; } = new(); + public List TrackStatusSpans { get; set; } = new(); /// /// 预警因素列表。 diff --git a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/EditWarningOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/EditWarningOutput.cs index f8c65d67..d915660c 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/EditWarningOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/EditWarningOutput.cs @@ -1,5 +1,4 @@ using SJZY.Track.Domain.Dtos.Forewarning; -using SJZY.Track.Domain.Enums; namespace SJZY.Track.Application.Contract.Dtos.Forewarning; @@ -20,20 +19,10 @@ public class EditWarningOutput /// public int CustomerId { get; set; } - /// - /// 通知方式 - /// - public NotifyMode NotifyMode { get; set; } - - /// - /// 通知模板 - /// - public string NotifyTemplate { get; set; } = null!; - /// /// 通知列表 /// - public List TrackStatusSpans { get; set; } = new(); + public List TrackStatusSpans { get; set; } = new(); /// /// 预警因素列表。 @@ -41,13 +30,6 @@ public class EditWarningOutput public List WarningFactors { get; set; } = new(); } -public class WarningNotifyWithIdDto: WarningNitifyDto -{ - /// - /// 通知id - /// - public int Id { get; set; } -} public class WarningFactorWithIdDto : WarningFactorDto { diff --git a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/UpdateWarningInput.cs b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/UpdateWarningInput.cs index 0d00a8d3..26685924 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/UpdateWarningInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/UpdateWarningInput.cs @@ -14,32 +14,9 @@ public class UpdateWarningInput /// 模板名称 /// public string Name { get; set; } = null!; - - /// - /// 通知方式 - /// - public NotifyMode NotifyMode { get; set; } - - /// - /// 通知模板 - /// - public string NotifyTemplate { get; set; } = null!; - + /// /// 通知列表 /// - public List Notifies { get; set; } = new(); -} - -public class NotifyDto -{ - /// - /// 通知id - /// - public int Id { get; set; } - - /// - /// 通知人id - /// - public int NotifyUserId { get; set; } + public List Notifies { get; set; } = new(); } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Helpers/ForewarningHelper.cs b/src/SJZY.Track.Application/Helpers/ForewarningHelper.cs index a1a0e3bc..fe7bc274 100644 --- a/src/SJZY.Track.Application/Helpers/ForewarningHelper.cs +++ b/src/SJZY.Track.Application/Helpers/ForewarningHelper.cs @@ -15,17 +15,12 @@ public class ForewarningHelper /// /// 递推分裂预警规则列表 /// - /// - /// + /// /// - public static List CalcRuleList(List statusSpans, - List factors) + public static List CalcRuleList(CreateWarningInput input) { - if (statusSpans.Count == 0 || factors.Count == 0) - { - throw new BusinessException(message: "轨迹状态区间或因素列表为空"); - } - + var statusSpans = input.TrackStatusSpans; + var factors = input.WarningFactors; var len = statusSpans.Count * factors.Select(f => f.FactorValue.Count).Aggregate((pre, cur) => pre * cur); if (len == 0) { @@ -52,7 +47,7 @@ public class ForewarningHelper return rules; } - private static void FillStatus(List statusSpans, List rules, int repeat) + private static void FillStatus(List statusSpans, List rules, int repeat) { var row = 0; foreach (var span in statusSpans) @@ -63,6 +58,8 @@ public class ForewarningHelper rules[row].StartTrackStatus = span.StartTrackStatus; rules[row].EndTrackStatusId = span.EndTrackStatusId; rules[row].EndTrackStatus = span.EndTrackStatus; + rules[row].NotifyMode = span.NotifyMode; + rules[row].NotifyUserId = span.NotifyUserId; } } } @@ -152,37 +149,24 @@ public class ForewarningHelper }).ToList(); } - public static List MapNotifyEntities(CreateWarningInput input) + public static EditWarningOutput MapWarningSummary(WarningEntity warning) { - return input.TrackStatusSpans.Select(x => new WarningNotifyEntity - { - StartTrackStatusId = x.StartTrackStatusId, - EndTrackStatusId = x.EndTrackStatusId, - NotifyMode = input.NotifyMode, - NotifyTemplate = input.NotifyTemplate, - NotifyUserId = x.NotifyUserId - }).ToList(); - } - - public static EditWarningOutput MapWarningSummary(WarningEntity warning, List statusList) - { - var statusDic = statusList.ToDictionary(x => x.Id, x => x.Name); return new EditWarningOutput { Name = warning.Name, SubSystemId = warning.SubSystemId, CustomerId = warning.CustomerId, - NotifyMode = warning.WarningNotifies.First().NotifyMode, - NotifyTemplate = warning.WarningNotifies.First().NotifyTemplate, - TrackStatusSpans = warning.WarningNotifies.Select(x => new WarningNotifyWithIdDto - { - Id = x.Id, - StartTrackStatusId = x.StartTrackStatusId, - StartTrackStatus = statusDic.TryGetValue(x.StartTrackStatusId, out var start) ? start : "", - EndTrackStatusId = x.EndTrackStatusId, - EndTrackStatus = statusDic.TryGetValue(x.EndTrackStatusId, out var end) ? end : "", - NotifyUserId = x.NotifyUserId, - }).ToList(), + TrackStatusSpans = warning.WarningRules.GroupBy(x => new + { x.StartTrackStatusId, x.StartTrackStatus, x.EndTrackStatusId, x.EndTrackStatus }) + .Select(x => new WarningNotifyDto + { + StartTrackStatusId = x.Key.StartTrackStatusId, + StartTrackStatus = x.Key.StartTrackStatus, + EndTrackStatusId = x.Key.EndTrackStatusId, + EndTrackStatus = x.Key.EndTrackStatus, + NotifyMode = x.First().NotifyMode, + NotifyUserId = x.First().NotifyUserId, + }).ToList(), WarningFactors = warning.WarningFactors.Select(x => new WarningFactorWithIdDto { Id = x.Id, diff --git a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningService.cs b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningService.cs index 0c7be38f..d6d41930 100644 --- a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningService.cs +++ b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningService.cs @@ -6,7 +6,6 @@ using SJZY.Track.Application.Helpers; using SJZY.Track.Domain.Aggregates.ForewarningAggregate; using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; using SJZY.Track.Domain.Dtos.Forewarning; -using SJZY.Track.Domain.Dtos.TrackStatus; using SJZY.Track.Domain.Queries; namespace SJZY.Track.Application.Services.ForewarningServices; @@ -17,11 +16,14 @@ public class ForewarningService : ApplicationService { private readonly IWarningRepository _warningRepository; private readonly IForewarningCacheService _forewarningCacheService; + private readonly IBasicQuery _trackStatusQueries; - public ForewarningService(IWarningRepository warningRepository, IForewarningCacheService forewarningCacheService) + public ForewarningService(IWarningRepository warningRepository, IForewarningCacheService forewarningCacheService, + IBasicQuery trackStatusQueries) { _warningRepository = warningRepository; _forewarningCacheService = forewarningCacheService; + _trackStatusQueries = trackStatusQueries; } /// @@ -44,6 +46,11 @@ public class ForewarningService : ApplicationService [HttpPost("CreateWarning")] public async Task CreateWarning(CreateWarningInput input) { + if (input.TrackStatusSpans.Count == 0 || input.WarningFactors.Count == 0) + { + throw new BusinessException(message: "轨迹状态区间或因素列表为空"); + } + var warning = ObjectMapper.Map(input); if (await _warningRepository.IsAnyAsync(x => @@ -52,11 +59,9 @@ public class ForewarningService : ApplicationService throw new BusinessException(message: "该子系统下的客户已经存在一个同名预警: " + warning.Name); } - warning.WarningRules = ForewarningHelper.CalcRuleList(input.TrackStatusSpans, input.WarningFactors); + warning.WarningRules = ForewarningHelper.CalcRuleList(input); warning.FactorTypeSort = input.WarningFactors.Select(x => x.FactorType).JoinAsString(","); - warning.WarningFactors = ForewarningHelper.MapFactorEntities(input.WarningFactors); - warning.WarningNotifies = ForewarningHelper.MapNotifyEntities(input); await _warningRepository.CreateForewarningAsync(warning); return true; } @@ -65,27 +70,18 @@ public class ForewarningService : ApplicationService /// 编辑预警 /// /// - /// /// [HttpPost("EditWarning")] - public async Task EditWarning(int warningId, - [FromServices] IBasicQuery statusQuery) + public async Task EditWarning(int warningId) { - var warning = await _warningRepository.GetByIdAsync(warningId); + var warning = await _warningRepository.GetWithRulesAsync(warningId); if (warning == null) { throw new BusinessException(message: "预警不存在"); } - var statusList = await statusQuery.GetListAsync(x => x.SubSystemId == warning.SubSystemId, x => - new IdWithNameDto - { - Id = x.Id, - Name = x.Status - }); - - return ForewarningHelper.MapWarningSummary(warning, statusList); + return ForewarningHelper.MapWarningSummary(warning); } /// @@ -111,19 +107,61 @@ public class ForewarningService : ApplicationService warning.SetName(input.Name); - warning.WarningNotifies = input.Notifies.Select(x => new WarningNotifyEntity + await VerifyAndFillStatusAsync(input.Notifies, warning.SubSystemId); + + warning.WarningRules = input.Notifies.Select(x => new WarningRuleEntity() { - Id = x.Id, - NotifyMode = input.NotifyMode, - NotifyTemplate = input.NotifyTemplate, + WarningId = warning.Id, + StartTrackStatusId = x.StartTrackStatusId, + EndTrackStatusId = x.EndTrackStatusId, + NotifyMode = x.NotifyMode, NotifyUserId = x.NotifyUserId }).ToList(); await _warningRepository.UpdateForewarningAsync(warning); - + return true; } + private async Task VerifyAndFillStatusAsync(List notifies, int subSystemId) + { + var statusIds = new List(); + notifies.ForEach(x => + { + if (x.StartTrackStatusId == x.EndTrackStatusId) + { + throw new BusinessException(message: "起止轨迹状态不能相同"); + } + + statusIds.Add(x.StartTrackStatusId); + statusIds.Add(x.EndTrackStatusId); + }); + var statusList = await _trackStatusQueries.GetListAsync( + x => x.SubSystemId == subSystemId && statusIds.Contains(x.Id), x => + new IdWithNameDto + { + Id = x.Id, + Name = x.Status + }); + + var statusDic = statusList.ToDictionary(x => x.Id, x => x.Name); + notifies.ForEach(x => + { + if (!statusDic.ContainsKey(x.StartTrackStatusId)) + { + throw new BusinessException(message: "存在非法轨迹状态(包含子系统下不存在的轨迹状态)"); + } + + if (!statusDic.ContainsKey(x.EndTrackStatusId)) + { + throw new BusinessException(message: "存在非法轨迹状态(包含子系统下不存在的轨迹状态)"); + } + + x.StartTrackStatus = statusDic[x.StartTrackStatusId]; + x.EndTrackStatus = statusDic[x.EndTrackStatusId]; + }); + } + /// /// 启用or禁用预警 /// @@ -151,7 +189,7 @@ public class ForewarningService : ApplicationService warning.SetEnable(isEnable); await _warningRepository.TurnWarningAsync(warning); - + // 清除缓存 await _forewarningCacheService.DeleteRulesAsync(warning.SubSystemId, warning.CustomerId); @@ -195,7 +233,7 @@ public class ForewarningService : ApplicationService var warningRules = ObjectMapper.Map, List>(input.Items); await _warningRepository.ModifyTimeSpansAsync(warningRules); - + // 清除缓存 await _forewarningCacheService.DeleteRulesAsync(warning.SubSystemId, warning.CustomerId); return true; diff --git a/src/SJZY.Track.Application/Validations/Forewarning/CreateRuleFactorValidation.cs b/src/SJZY.Track.Application/Validations/Forewarning/CreateRuleFactorValidation.cs index 40f58dd3..bb216268 100644 --- a/src/SJZY.Track.Application/Validations/Forewarning/CreateRuleFactorValidation.cs +++ b/src/SJZY.Track.Application/Validations/Forewarning/CreateRuleFactorValidation.cs @@ -10,9 +10,6 @@ public class CreateRuleFactorValidation : AbstractValidator { RuleFor(x => x.WarningFactors).NotNull().WithMessage("因素列表不能为空"); RuleFor(x => x.TrackStatusSpans).NotNull().WithMessage("轨迹状态列表不能为空"); - - RuleFor(x => x.NotifyTemplate).NotEmpty().WithMessage("通知模板必填") - .MaximumLength(256).WithMessage("通知模板长度不能超过256"); // todo: more validation } diff --git a/src/SJZY.Track.Application/Validations/Forewarning/RuleTrackStateDtoValidator.cs b/src/SJZY.Track.Application/Validations/Forewarning/RuleTrackStateDtoValidator.cs index cf61bc45..26228a96 100644 --- a/src/SJZY.Track.Application/Validations/Forewarning/RuleTrackStateDtoValidator.cs +++ b/src/SJZY.Track.Application/Validations/Forewarning/RuleTrackStateDtoValidator.cs @@ -3,7 +3,7 @@ using SJZY.Track.Domain.Dtos.Forewarning; namespace SJZY.Track.Application.Validations.Forewarning; -public class RuleTrackStateDtoValidator : AbstractValidator +public class RuleTrackStateDtoValidator : AbstractValidator { public RuleTrackStateDtoValidator() { diff --git a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IWarningRepository.cs b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IWarningRepository.cs index efa73bbd..848b740f 100644 --- a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IWarningRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IWarningRepository.cs @@ -54,9 +54,9 @@ public interface IWarningRepository : IBasicRepository Task TurnWarningAsync(WarningEntity warning); /// - /// 获取预警,include factors, notifies + /// 获取预警 附带规则 /// /// /// - Task GetByIdAsync(int warningId); + Task GetWithRulesAsync(int warningId); } \ 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 index 4d8cea7e..b7125824 100644 --- a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningEntity.cs @@ -53,12 +53,6 @@ public class WarningEntity: IFullAuditedBasicEntitys, IAggregateRoot /// [SugarColumn(IsIgnore = true)] public List WarningFactors { get; set; } = new(); - - /// - /// 预警通知 - /// - [SugarColumn(IsIgnore = true)] - public List WarningNotifies { get; set; } = new(); public void SetName(string name) { diff --git a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningNotifyEntity.cs b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningNotifyEntity.cs deleted file mode 100644 index 1b846469..00000000 --- a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningNotifyEntity.cs +++ /dev/null @@ -1,49 +0,0 @@ -using SJZY.Track.Domain.Enums; - -namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; - -[SugarTable("t_warning_notify")] -public class WarningNotifyEntity : IFullAuditedBasicEntitys, IEntity -{ - /// - /// 自增主键 - /// - [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)] - public int Id { get; set; } - - /// - /// 预警id - /// - [SugarColumn(ColumnName = "WarningId")] - public int WarningId { 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 = "NotifyMode")] - public NotifyMode NotifyMode { get; set; } - - /// - /// 通知模板 - /// - [SugarColumn(ColumnName = "NotifyTemplate", Length = 256)] - public string NotifyTemplate { get; set; } = null!; - - /// - /// 通知人 - /// - [SugarColumn(ColumnName = "NotifyUserId")] - public int NotifyUserId { get; set; } -} \ 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 index f6141704..06b02509 100644 --- a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningRuleEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningRuleEntity.cs @@ -1,3 +1,5 @@ +using SJZY.Track.Domain.Enums; + namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; [SugarTable("t_warning_rule")] @@ -92,4 +94,16 @@ public class WarningRuleEntity : IFullAuditedBasicEntitys, IEntity /// [SugarColumn(ColumnName = "ProductCode")] public string? ProductCode { get; set; } + + /// + /// 通知方式 + /// + [SugarColumn(ColumnName = "NotifyMode")] + public NotifyMode NotifyMode { get; set; } + + /// + /// 通知人 + /// + [SugarColumn(ColumnName = "NotifyUserId")] + public int NotifyUserId { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/TrackStatusAggregate/TrackStatusEntity.cs b/src/SJZY.Track.Domain/Aggregates/TrackStatusAggregate/TrackStatusEntity.cs index 0b200c1c..4b54469f 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackStatusAggregate/TrackStatusEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackStatusAggregate/TrackStatusEntity.cs @@ -11,6 +11,12 @@ public class TrackStatusEntity : IFullAuditedBasicEntitys, IAggregateRoot /// [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } + + /// + /// 子系统id + /// + [SugarColumn(ColumnName = "SubSystemId")] + public int SubSystemId { get; set; } /// /// 轨迹状态代码 @@ -35,10 +41,4 @@ public class TrackStatusEntity : IFullAuditedBasicEntitys, IAggregateRoot /// [SugarColumn(ColumnName = "Status")] public string Status { get; set; } = null!; - - /// - /// 子系统id - /// - [SugarColumn(ColumnName = "SubSystemId")] - public int SubSystemId { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Forewarning/WarningNitifyDto.cs b/src/SJZY.Track.Domain/Dtos/Forewarning/WarningNotifyDto.cs similarity index 78% rename from src/SJZY.Track.Domain/Dtos/Forewarning/WarningNitifyDto.cs rename to src/SJZY.Track.Domain/Dtos/Forewarning/WarningNotifyDto.cs index f831cfeb..3749e4cc 100644 --- a/src/SJZY.Track.Domain/Dtos/Forewarning/WarningNitifyDto.cs +++ b/src/SJZY.Track.Domain/Dtos/Forewarning/WarningNotifyDto.cs @@ -1,6 +1,8 @@ +using SJZY.Track.Domain.Enums; + namespace SJZY.Track.Domain.Dtos.Forewarning; -public class WarningNitifyDto +public class WarningNotifyDto { /// /// 起始轨迹状态id @@ -21,6 +23,11 @@ public class WarningNitifyDto /// 终止轨迹状态 /// public string EndTrackStatus { get; set; } = null!; + + /// + /// 通知方式 + /// + public NotifyMode NotifyMode { get; set; } /// /// 通知人id diff --git a/src/SJZY.Track.Domain/Enums/NotifyMode.cs b/src/SJZY.Track.Domain/Enums/NotifyMode.cs index f5821903..2af2f323 100644 --- a/src/SJZY.Track.Domain/Enums/NotifyMode.cs +++ b/src/SJZY.Track.Domain/Enums/NotifyMode.cs @@ -1,14 +1,15 @@ namespace SJZY.Track.Domain.Enums; +[Flags] public enum NotifyMode { /// /// 站内信 /// - SiteInternal = 1, + SiteInternal = 0x1, /// /// 飞书 /// - FeiShu = 2 + FeiShu = 0x10, } \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Queries/WarningQueries.cs b/src/SJZY.Track.Repository/Queries/WarningQueries.cs index 32aefadf..421b7b95 100644 --- a/src/SJZY.Track.Repository/Queries/WarningQueries.cs +++ b/src/SJZY.Track.Repository/Queries/WarningQueries.cs @@ -20,12 +20,9 @@ public class WarningQueries : ISugarRepository, IWarningQueries, return await Context.Queryable() .LeftJoin((w, wr) => w.Id == wr.WarningId) .LeftJoin((w, wr, a) => wr.AreaId == a.Id) - .LeftJoin((w, wr, a, wn) => - wr.WarningId == wn.WarningId && wr.StartTrackStatusId == wn.StartTrackStatusId && - wr.EndTrackStatusId == wn.EndTrackStatusId) .Filter(null, true) // 支持历史规则 .Where((w, wr) => ruleIds.Contains(wr.Id)) - .Select((w, wr, a, wn) => new GetWarningNotifiesVo + .Select((w, wr, a) => new GetWarningNotifiesVo { RuleId = wr.Id, WarningName = w.Name, @@ -40,9 +37,8 @@ public class WarningQueries : ISugarRepository, IWarningQueries, IsTransit = wr.IsTransit, LeavePort = wr.LeavePort, ProductCode = wr.ProductCode, - NotifyMode = wn.NotifyMode, - NotifyTemplate = wn.NotifyTemplate, - NotifyUserId = wn.NotifyUserId, + NotifyMode = wr.NotifyMode, + NotifyUserId = wr.NotifyUserId, FactorTypeSort = w.FactorTypeSort }) .ToListAsync(); diff --git a/src/SJZY.Track.Repository/Repositories/WarningRepository.cs b/src/SJZY.Track.Repository/Repositories/WarningRepository.cs index fe25f1d7..54a59d0b 100644 --- a/src/SJZY.Track.Repository/Repositories/WarningRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/WarningRepository.cs @@ -14,13 +14,12 @@ public class WarningRepository : BasicRepository, IWarningReposit using var tran = TransactionHelper.GetReadCommitted(); var ruleId = await InsertReturnIdentityAsync(warning); - warning.WarningNotifies.ForEach(x => x.WarningId = ruleId); warning.WarningFactors.ForEach(x => x.WarningId = ruleId); - warning.WarningRules.ForEach(x => x.WarningId = ruleId); - await Context.Insertable(warning.WarningFactors).ExecuteCommandAsync(); - await Context.Insertable(warning.WarningNotifies).ExecuteCommandAsync(); + + warning.WarningRules.ForEach(x => x.WarningId = ruleId); await Context.Insertable(warning.WarningRules).ExecuteCommandAsync(); + tran.Complete(); return ruleId; } @@ -73,8 +72,19 @@ public class WarningRepository : BasicRepository, IWarningReposit using var tran = TransactionHelper.GetReadCommitted(); await Context.Updateable(warning).ExecuteCommandAsync(); - await Context.Updateable(warning.WarningNotifies) - .UpdateColumns(x => new { x.NotifyMode, x.NotifyTemplate, x.NotifyUserId, x.UpdateTime, x.UpdateUserId }) + + await Context.Updateable(warning.WarningRules).WhereColumns(x => new + { + x.WarningId, + x.StartTrackStatusId, + x.EndTrackStatusId + }).UpdateColumns(x => new + { + x.NotifyMode, + x.NotifyUserId, + x.UpdateTime, + x.UpdateUserId, + }, true) .ExecuteCommandAsync(); tran.Complete(); @@ -94,16 +104,17 @@ public class WarningRepository : BasicRepository, IWarningReposit .ExecuteCommandAsync() > 0; } - public async Task GetByIdAsync(int warningId) + public async Task GetWithRulesAsync(int warningId) { var warning = await GetFirstAsync(x => x.Id == warningId); if (warning == null) return null; - + warning.WarningFactors = await Context.Queryable() .Where(x => x.WarningId == warningId) .ToListAsync(); - warning.WarningNotifies = await Context.Queryable() + + warning.WarningRules = await Context.Queryable() .Where(x => x.WarningId == warningId) .ToListAsync(); From d7c84cfc4a85cfa801d9560334a550e876dac43b Mon Sep 17 00:00:00 2001 From: xiaolipro <2357729423@qq.com> Date: Mon, 5 Aug 2024 09:23:26 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E3=80=90cheery=20pick=E3=80=91temp?= =?UTF-8?q?=EF=BC=9Aremove=20notify=20table?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/Forewarning/CreateWarningInput.cs | 12 +-- .../Dtos/Forewarning/EditWarningOutput.cs | 20 +---- .../Dtos/Forewarning/UpdateWarningInput.cs | 27 +----- .../Helpers/ForewarningHelper.cs | 54 ++++-------- .../ForewarningServices/ForewarningService.cs | 86 +++++++++++++------ .../Forewarning/CreateRuleFactorValidation.cs | 3 - .../Forewarning/RuleTrackStateDtoValidator.cs | 2 +- .../IWarningRepository.cs | 4 +- .../ForewarningAggregate/WarningEntity.cs | 6 -- .../WarningNotifyEntity.cs | 49 ----------- .../ForewarningAggregate/WarningRuleEntity.cs | 14 +++ .../TrackStatusAggregate/TrackStatusEntity.cs | 12 +-- ...arningNitifyDto.cs => WarningNotifyDto.cs} | 9 +- src/SJZY.Track.Domain/Enums/NotifyMode.cs | 5 +- .../Queries/WarningQueries.cs | 10 +-- .../Repositories/WarningRepository.cs | 29 +++++-- 16 files changed, 142 insertions(+), 200 deletions(-) delete mode 100644 src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningNotifyEntity.cs rename src/SJZY.Track.Domain/Dtos/Forewarning/{WarningNitifyDto.cs => WarningNotifyDto.cs} (78%) diff --git a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/CreateWarningInput.cs b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/CreateWarningInput.cs index 0179e744..96ee907a 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/CreateWarningInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/CreateWarningInput.cs @@ -20,20 +20,10 @@ public class CreateWarningInput /// public int CustomerId { get; set; } - /// - /// 通知方式 - /// - public NotifyMode NotifyMode { get; set; } - - /// - /// 通知模板 - /// - public string NotifyTemplate { get; set; } = null!; - /// /// 轨迹状态跨度列表 /// - public List TrackStatusSpans { get; set; } = new(); + public List TrackStatusSpans { get; set; } = new(); /// /// 预警因素列表。 diff --git a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/EditWarningOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/EditWarningOutput.cs index f8c65d67..d915660c 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/EditWarningOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/EditWarningOutput.cs @@ -1,5 +1,4 @@ using SJZY.Track.Domain.Dtos.Forewarning; -using SJZY.Track.Domain.Enums; namespace SJZY.Track.Application.Contract.Dtos.Forewarning; @@ -20,20 +19,10 @@ public class EditWarningOutput /// public int CustomerId { get; set; } - /// - /// 通知方式 - /// - public NotifyMode NotifyMode { get; set; } - - /// - /// 通知模板 - /// - public string NotifyTemplate { get; set; } = null!; - /// /// 通知列表 /// - public List TrackStatusSpans { get; set; } = new(); + public List TrackStatusSpans { get; set; } = new(); /// /// 预警因素列表。 @@ -41,13 +30,6 @@ public class EditWarningOutput public List WarningFactors { get; set; } = new(); } -public class WarningNotifyWithIdDto: WarningNitifyDto -{ - /// - /// 通知id - /// - public int Id { get; set; } -} public class WarningFactorWithIdDto : WarningFactorDto { diff --git a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/UpdateWarningInput.cs b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/UpdateWarningInput.cs index 0d00a8d3..26685924 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/UpdateWarningInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/UpdateWarningInput.cs @@ -14,32 +14,9 @@ public class UpdateWarningInput /// 模板名称 /// public string Name { get; set; } = null!; - - /// - /// 通知方式 - /// - public NotifyMode NotifyMode { get; set; } - - /// - /// 通知模板 - /// - public string NotifyTemplate { get; set; } = null!; - + /// /// 通知列表 /// - public List Notifies { get; set; } = new(); -} - -public class NotifyDto -{ - /// - /// 通知id - /// - public int Id { get; set; } - - /// - /// 通知人id - /// - public int NotifyUserId { get; set; } + public List Notifies { get; set; } = new(); } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Helpers/ForewarningHelper.cs b/src/SJZY.Track.Application/Helpers/ForewarningHelper.cs index a1a0e3bc..fe7bc274 100644 --- a/src/SJZY.Track.Application/Helpers/ForewarningHelper.cs +++ b/src/SJZY.Track.Application/Helpers/ForewarningHelper.cs @@ -15,17 +15,12 @@ public class ForewarningHelper /// /// 递推分裂预警规则列表 /// - /// - /// + /// /// - public static List CalcRuleList(List statusSpans, - List factors) + public static List CalcRuleList(CreateWarningInput input) { - if (statusSpans.Count == 0 || factors.Count == 0) - { - throw new BusinessException(message: "轨迹状态区间或因素列表为空"); - } - + var statusSpans = input.TrackStatusSpans; + var factors = input.WarningFactors; var len = statusSpans.Count * factors.Select(f => f.FactorValue.Count).Aggregate((pre, cur) => pre * cur); if (len == 0) { @@ -52,7 +47,7 @@ public class ForewarningHelper return rules; } - private static void FillStatus(List statusSpans, List rules, int repeat) + private static void FillStatus(List statusSpans, List rules, int repeat) { var row = 0; foreach (var span in statusSpans) @@ -63,6 +58,8 @@ public class ForewarningHelper rules[row].StartTrackStatus = span.StartTrackStatus; rules[row].EndTrackStatusId = span.EndTrackStatusId; rules[row].EndTrackStatus = span.EndTrackStatus; + rules[row].NotifyMode = span.NotifyMode; + rules[row].NotifyUserId = span.NotifyUserId; } } } @@ -152,37 +149,24 @@ public class ForewarningHelper }).ToList(); } - public static List MapNotifyEntities(CreateWarningInput input) + public static EditWarningOutput MapWarningSummary(WarningEntity warning) { - return input.TrackStatusSpans.Select(x => new WarningNotifyEntity - { - StartTrackStatusId = x.StartTrackStatusId, - EndTrackStatusId = x.EndTrackStatusId, - NotifyMode = input.NotifyMode, - NotifyTemplate = input.NotifyTemplate, - NotifyUserId = x.NotifyUserId - }).ToList(); - } - - public static EditWarningOutput MapWarningSummary(WarningEntity warning, List statusList) - { - var statusDic = statusList.ToDictionary(x => x.Id, x => x.Name); return new EditWarningOutput { Name = warning.Name, SubSystemId = warning.SubSystemId, CustomerId = warning.CustomerId, - NotifyMode = warning.WarningNotifies.First().NotifyMode, - NotifyTemplate = warning.WarningNotifies.First().NotifyTemplate, - TrackStatusSpans = warning.WarningNotifies.Select(x => new WarningNotifyWithIdDto - { - Id = x.Id, - StartTrackStatusId = x.StartTrackStatusId, - StartTrackStatus = statusDic.TryGetValue(x.StartTrackStatusId, out var start) ? start : "", - EndTrackStatusId = x.EndTrackStatusId, - EndTrackStatus = statusDic.TryGetValue(x.EndTrackStatusId, out var end) ? end : "", - NotifyUserId = x.NotifyUserId, - }).ToList(), + TrackStatusSpans = warning.WarningRules.GroupBy(x => new + { x.StartTrackStatusId, x.StartTrackStatus, x.EndTrackStatusId, x.EndTrackStatus }) + .Select(x => new WarningNotifyDto + { + StartTrackStatusId = x.Key.StartTrackStatusId, + StartTrackStatus = x.Key.StartTrackStatus, + EndTrackStatusId = x.Key.EndTrackStatusId, + EndTrackStatus = x.Key.EndTrackStatus, + NotifyMode = x.First().NotifyMode, + NotifyUserId = x.First().NotifyUserId, + }).ToList(), WarningFactors = warning.WarningFactors.Select(x => new WarningFactorWithIdDto { Id = x.Id, diff --git a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningService.cs b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningService.cs index 0c7be38f..d6d41930 100644 --- a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningService.cs +++ b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningService.cs @@ -6,7 +6,6 @@ using SJZY.Track.Application.Helpers; using SJZY.Track.Domain.Aggregates.ForewarningAggregate; using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; using SJZY.Track.Domain.Dtos.Forewarning; -using SJZY.Track.Domain.Dtos.TrackStatus; using SJZY.Track.Domain.Queries; namespace SJZY.Track.Application.Services.ForewarningServices; @@ -17,11 +16,14 @@ public class ForewarningService : ApplicationService { private readonly IWarningRepository _warningRepository; private readonly IForewarningCacheService _forewarningCacheService; + private readonly IBasicQuery _trackStatusQueries; - public ForewarningService(IWarningRepository warningRepository, IForewarningCacheService forewarningCacheService) + public ForewarningService(IWarningRepository warningRepository, IForewarningCacheService forewarningCacheService, + IBasicQuery trackStatusQueries) { _warningRepository = warningRepository; _forewarningCacheService = forewarningCacheService; + _trackStatusQueries = trackStatusQueries; } /// @@ -44,6 +46,11 @@ public class ForewarningService : ApplicationService [HttpPost("CreateWarning")] public async Task CreateWarning(CreateWarningInput input) { + if (input.TrackStatusSpans.Count == 0 || input.WarningFactors.Count == 0) + { + throw new BusinessException(message: "轨迹状态区间或因素列表为空"); + } + var warning = ObjectMapper.Map(input); if (await _warningRepository.IsAnyAsync(x => @@ -52,11 +59,9 @@ public class ForewarningService : ApplicationService throw new BusinessException(message: "该子系统下的客户已经存在一个同名预警: " + warning.Name); } - warning.WarningRules = ForewarningHelper.CalcRuleList(input.TrackStatusSpans, input.WarningFactors); + warning.WarningRules = ForewarningHelper.CalcRuleList(input); warning.FactorTypeSort = input.WarningFactors.Select(x => x.FactorType).JoinAsString(","); - warning.WarningFactors = ForewarningHelper.MapFactorEntities(input.WarningFactors); - warning.WarningNotifies = ForewarningHelper.MapNotifyEntities(input); await _warningRepository.CreateForewarningAsync(warning); return true; } @@ -65,27 +70,18 @@ public class ForewarningService : ApplicationService /// 编辑预警 /// /// - /// /// [HttpPost("EditWarning")] - public async Task EditWarning(int warningId, - [FromServices] IBasicQuery statusQuery) + public async Task EditWarning(int warningId) { - var warning = await _warningRepository.GetByIdAsync(warningId); + var warning = await _warningRepository.GetWithRulesAsync(warningId); if (warning == null) { throw new BusinessException(message: "预警不存在"); } - var statusList = await statusQuery.GetListAsync(x => x.SubSystemId == warning.SubSystemId, x => - new IdWithNameDto - { - Id = x.Id, - Name = x.Status - }); - - return ForewarningHelper.MapWarningSummary(warning, statusList); + return ForewarningHelper.MapWarningSummary(warning); } /// @@ -111,19 +107,61 @@ public class ForewarningService : ApplicationService warning.SetName(input.Name); - warning.WarningNotifies = input.Notifies.Select(x => new WarningNotifyEntity + await VerifyAndFillStatusAsync(input.Notifies, warning.SubSystemId); + + warning.WarningRules = input.Notifies.Select(x => new WarningRuleEntity() { - Id = x.Id, - NotifyMode = input.NotifyMode, - NotifyTemplate = input.NotifyTemplate, + WarningId = warning.Id, + StartTrackStatusId = x.StartTrackStatusId, + EndTrackStatusId = x.EndTrackStatusId, + NotifyMode = x.NotifyMode, NotifyUserId = x.NotifyUserId }).ToList(); await _warningRepository.UpdateForewarningAsync(warning); - + return true; } + private async Task VerifyAndFillStatusAsync(List notifies, int subSystemId) + { + var statusIds = new List(); + notifies.ForEach(x => + { + if (x.StartTrackStatusId == x.EndTrackStatusId) + { + throw new BusinessException(message: "起止轨迹状态不能相同"); + } + + statusIds.Add(x.StartTrackStatusId); + statusIds.Add(x.EndTrackStatusId); + }); + var statusList = await _trackStatusQueries.GetListAsync( + x => x.SubSystemId == subSystemId && statusIds.Contains(x.Id), x => + new IdWithNameDto + { + Id = x.Id, + Name = x.Status + }); + + var statusDic = statusList.ToDictionary(x => x.Id, x => x.Name); + notifies.ForEach(x => + { + if (!statusDic.ContainsKey(x.StartTrackStatusId)) + { + throw new BusinessException(message: "存在非法轨迹状态(包含子系统下不存在的轨迹状态)"); + } + + if (!statusDic.ContainsKey(x.EndTrackStatusId)) + { + throw new BusinessException(message: "存在非法轨迹状态(包含子系统下不存在的轨迹状态)"); + } + + x.StartTrackStatus = statusDic[x.StartTrackStatusId]; + x.EndTrackStatus = statusDic[x.EndTrackStatusId]; + }); + } + /// /// 启用or禁用预警 /// @@ -151,7 +189,7 @@ public class ForewarningService : ApplicationService warning.SetEnable(isEnable); await _warningRepository.TurnWarningAsync(warning); - + // 清除缓存 await _forewarningCacheService.DeleteRulesAsync(warning.SubSystemId, warning.CustomerId); @@ -195,7 +233,7 @@ public class ForewarningService : ApplicationService var warningRules = ObjectMapper.Map, List>(input.Items); await _warningRepository.ModifyTimeSpansAsync(warningRules); - + // 清除缓存 await _forewarningCacheService.DeleteRulesAsync(warning.SubSystemId, warning.CustomerId); return true; diff --git a/src/SJZY.Track.Application/Validations/Forewarning/CreateRuleFactorValidation.cs b/src/SJZY.Track.Application/Validations/Forewarning/CreateRuleFactorValidation.cs index 40f58dd3..bb216268 100644 --- a/src/SJZY.Track.Application/Validations/Forewarning/CreateRuleFactorValidation.cs +++ b/src/SJZY.Track.Application/Validations/Forewarning/CreateRuleFactorValidation.cs @@ -10,9 +10,6 @@ public class CreateRuleFactorValidation : AbstractValidator { RuleFor(x => x.WarningFactors).NotNull().WithMessage("因素列表不能为空"); RuleFor(x => x.TrackStatusSpans).NotNull().WithMessage("轨迹状态列表不能为空"); - - RuleFor(x => x.NotifyTemplate).NotEmpty().WithMessage("通知模板必填") - .MaximumLength(256).WithMessage("通知模板长度不能超过256"); // todo: more validation } diff --git a/src/SJZY.Track.Application/Validations/Forewarning/RuleTrackStateDtoValidator.cs b/src/SJZY.Track.Application/Validations/Forewarning/RuleTrackStateDtoValidator.cs index cf61bc45..26228a96 100644 --- a/src/SJZY.Track.Application/Validations/Forewarning/RuleTrackStateDtoValidator.cs +++ b/src/SJZY.Track.Application/Validations/Forewarning/RuleTrackStateDtoValidator.cs @@ -3,7 +3,7 @@ using SJZY.Track.Domain.Dtos.Forewarning; namespace SJZY.Track.Application.Validations.Forewarning; -public class RuleTrackStateDtoValidator : AbstractValidator +public class RuleTrackStateDtoValidator : AbstractValidator { public RuleTrackStateDtoValidator() { diff --git a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IWarningRepository.cs b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IWarningRepository.cs index efa73bbd..848b740f 100644 --- a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IWarningRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IWarningRepository.cs @@ -54,9 +54,9 @@ public interface IWarningRepository : IBasicRepository Task TurnWarningAsync(WarningEntity warning); /// - /// 获取预警,include factors, notifies + /// 获取预警 附带规则 /// /// /// - Task GetByIdAsync(int warningId); + Task GetWithRulesAsync(int warningId); } \ 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 index 4d8cea7e..b7125824 100644 --- a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningEntity.cs @@ -53,12 +53,6 @@ public class WarningEntity: IFullAuditedBasicEntitys, IAggregateRoot /// [SugarColumn(IsIgnore = true)] public List WarningFactors { get; set; } = new(); - - /// - /// 预警通知 - /// - [SugarColumn(IsIgnore = true)] - public List WarningNotifies { get; set; } = new(); public void SetName(string name) { diff --git a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningNotifyEntity.cs b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningNotifyEntity.cs deleted file mode 100644 index 1b846469..00000000 --- a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningNotifyEntity.cs +++ /dev/null @@ -1,49 +0,0 @@ -using SJZY.Track.Domain.Enums; - -namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; - -[SugarTable("t_warning_notify")] -public class WarningNotifyEntity : IFullAuditedBasicEntitys, IEntity -{ - /// - /// 自增主键 - /// - [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)] - public int Id { get; set; } - - /// - /// 预警id - /// - [SugarColumn(ColumnName = "WarningId")] - public int WarningId { 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 = "NotifyMode")] - public NotifyMode NotifyMode { get; set; } - - /// - /// 通知模板 - /// - [SugarColumn(ColumnName = "NotifyTemplate", Length = 256)] - public string NotifyTemplate { get; set; } = null!; - - /// - /// 通知人 - /// - [SugarColumn(ColumnName = "NotifyUserId")] - public int NotifyUserId { get; set; } -} \ 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 index f6141704..06b02509 100644 --- a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningRuleEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningRuleEntity.cs @@ -1,3 +1,5 @@ +using SJZY.Track.Domain.Enums; + namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; [SugarTable("t_warning_rule")] @@ -92,4 +94,16 @@ public class WarningRuleEntity : IFullAuditedBasicEntitys, IEntity /// [SugarColumn(ColumnName = "ProductCode")] public string? ProductCode { get; set; } + + /// + /// 通知方式 + /// + [SugarColumn(ColumnName = "NotifyMode")] + public NotifyMode NotifyMode { get; set; } + + /// + /// 通知人 + /// + [SugarColumn(ColumnName = "NotifyUserId")] + public int NotifyUserId { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/TrackStatusAggregate/TrackStatusEntity.cs b/src/SJZY.Track.Domain/Aggregates/TrackStatusAggregate/TrackStatusEntity.cs index 0b200c1c..4b54469f 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackStatusAggregate/TrackStatusEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackStatusAggregate/TrackStatusEntity.cs @@ -11,6 +11,12 @@ public class TrackStatusEntity : IFullAuditedBasicEntitys, IAggregateRoot /// [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } + + /// + /// 子系统id + /// + [SugarColumn(ColumnName = "SubSystemId")] + public int SubSystemId { get; set; } /// /// 轨迹状态代码 @@ -35,10 +41,4 @@ public class TrackStatusEntity : IFullAuditedBasicEntitys, IAggregateRoot /// [SugarColumn(ColumnName = "Status")] public string Status { get; set; } = null!; - - /// - /// 子系统id - /// - [SugarColumn(ColumnName = "SubSystemId")] - public int SubSystemId { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Forewarning/WarningNitifyDto.cs b/src/SJZY.Track.Domain/Dtos/Forewarning/WarningNotifyDto.cs similarity index 78% rename from src/SJZY.Track.Domain/Dtos/Forewarning/WarningNitifyDto.cs rename to src/SJZY.Track.Domain/Dtos/Forewarning/WarningNotifyDto.cs index f831cfeb..3749e4cc 100644 --- a/src/SJZY.Track.Domain/Dtos/Forewarning/WarningNitifyDto.cs +++ b/src/SJZY.Track.Domain/Dtos/Forewarning/WarningNotifyDto.cs @@ -1,6 +1,8 @@ +using SJZY.Track.Domain.Enums; + namespace SJZY.Track.Domain.Dtos.Forewarning; -public class WarningNitifyDto +public class WarningNotifyDto { /// /// 起始轨迹状态id @@ -21,6 +23,11 @@ public class WarningNitifyDto /// 终止轨迹状态 /// public string EndTrackStatus { get; set; } = null!; + + /// + /// 通知方式 + /// + public NotifyMode NotifyMode { get; set; } /// /// 通知人id diff --git a/src/SJZY.Track.Domain/Enums/NotifyMode.cs b/src/SJZY.Track.Domain/Enums/NotifyMode.cs index f5821903..2af2f323 100644 --- a/src/SJZY.Track.Domain/Enums/NotifyMode.cs +++ b/src/SJZY.Track.Domain/Enums/NotifyMode.cs @@ -1,14 +1,15 @@ namespace SJZY.Track.Domain.Enums; +[Flags] public enum NotifyMode { /// /// 站内信 /// - SiteInternal = 1, + SiteInternal = 0x1, /// /// 飞书 /// - FeiShu = 2 + FeiShu = 0x10, } \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Queries/WarningQueries.cs b/src/SJZY.Track.Repository/Queries/WarningQueries.cs index 32aefadf..421b7b95 100644 --- a/src/SJZY.Track.Repository/Queries/WarningQueries.cs +++ b/src/SJZY.Track.Repository/Queries/WarningQueries.cs @@ -20,12 +20,9 @@ public class WarningQueries : ISugarRepository, IWarningQueries, return await Context.Queryable() .LeftJoin((w, wr) => w.Id == wr.WarningId) .LeftJoin((w, wr, a) => wr.AreaId == a.Id) - .LeftJoin((w, wr, a, wn) => - wr.WarningId == wn.WarningId && wr.StartTrackStatusId == wn.StartTrackStatusId && - wr.EndTrackStatusId == wn.EndTrackStatusId) .Filter(null, true) // 支持历史规则 .Where((w, wr) => ruleIds.Contains(wr.Id)) - .Select((w, wr, a, wn) => new GetWarningNotifiesVo + .Select((w, wr, a) => new GetWarningNotifiesVo { RuleId = wr.Id, WarningName = w.Name, @@ -40,9 +37,8 @@ public class WarningQueries : ISugarRepository, IWarningQueries, IsTransit = wr.IsTransit, LeavePort = wr.LeavePort, ProductCode = wr.ProductCode, - NotifyMode = wn.NotifyMode, - NotifyTemplate = wn.NotifyTemplate, - NotifyUserId = wn.NotifyUserId, + NotifyMode = wr.NotifyMode, + NotifyUserId = wr.NotifyUserId, FactorTypeSort = w.FactorTypeSort }) .ToListAsync(); diff --git a/src/SJZY.Track.Repository/Repositories/WarningRepository.cs b/src/SJZY.Track.Repository/Repositories/WarningRepository.cs index fe25f1d7..54a59d0b 100644 --- a/src/SJZY.Track.Repository/Repositories/WarningRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/WarningRepository.cs @@ -14,13 +14,12 @@ public class WarningRepository : BasicRepository, IWarningReposit using var tran = TransactionHelper.GetReadCommitted(); var ruleId = await InsertReturnIdentityAsync(warning); - warning.WarningNotifies.ForEach(x => x.WarningId = ruleId); warning.WarningFactors.ForEach(x => x.WarningId = ruleId); - warning.WarningRules.ForEach(x => x.WarningId = ruleId); - await Context.Insertable(warning.WarningFactors).ExecuteCommandAsync(); - await Context.Insertable(warning.WarningNotifies).ExecuteCommandAsync(); + + warning.WarningRules.ForEach(x => x.WarningId = ruleId); await Context.Insertable(warning.WarningRules).ExecuteCommandAsync(); + tran.Complete(); return ruleId; } @@ -73,8 +72,19 @@ public class WarningRepository : BasicRepository, IWarningReposit using var tran = TransactionHelper.GetReadCommitted(); await Context.Updateable(warning).ExecuteCommandAsync(); - await Context.Updateable(warning.WarningNotifies) - .UpdateColumns(x => new { x.NotifyMode, x.NotifyTemplate, x.NotifyUserId, x.UpdateTime, x.UpdateUserId }) + + await Context.Updateable(warning.WarningRules).WhereColumns(x => new + { + x.WarningId, + x.StartTrackStatusId, + x.EndTrackStatusId + }).UpdateColumns(x => new + { + x.NotifyMode, + x.NotifyUserId, + x.UpdateTime, + x.UpdateUserId, + }, true) .ExecuteCommandAsync(); tran.Complete(); @@ -94,16 +104,17 @@ public class WarningRepository : BasicRepository, IWarningReposit .ExecuteCommandAsync() > 0; } - public async Task GetByIdAsync(int warningId) + public async Task GetWithRulesAsync(int warningId) { var warning = await GetFirstAsync(x => x.Id == warningId); if (warning == null) return null; - + warning.WarningFactors = await Context.Queryable() .Where(x => x.WarningId == warningId) .ToListAsync(); - warning.WarningNotifies = await Context.Queryable() + + warning.WarningRules = await Context.Queryable() .Where(x => x.WarningId == warningId) .ToListAsync(); From 35bfbc43bd9aa306347aeead28b0eabbdf06a0cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E5=96=9C=E6=97=BA?= Date: Mon, 5 Aug 2024 09:36:15 +0800 Subject: [PATCH 3/4] =?UTF-8?q?feat=20=EF=BC=9A=20=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E8=B0=83=E6=95=B4=E8=BF=94=E5=9B=9E=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repositories/TrackStatusRepository.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SJZY.Track.Repository/Repositories/TrackStatusRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackStatusRepository.cs index 7ea0fb26..30af2705 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackStatusRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackStatusRepository.cs @@ -44,21 +44,21 @@ public class TrackStatusRepository : BasicRepository, ITrackS .LeftJoin((a, b) => a.SubSystemId == b.Id && b.IsDeleted == false) .LeftJoin((a, b, c) => a.CreateUserId == c.Id && c.IsDeleted == false) .LeftJoin((a, b, c, d) => a.UpdateUserId == d.Id && d.IsDeleted == false) + .InnerJoin((a, b, c, d,e) => a.Node==e.Id&&a.SubSystemId==e.SubSystemId) .WhereIF(input.SubSystemId > 0, (a, b, c, d) => a.SubSystemId == input.SubSystemId) .WhereIF(!input.Keywords.IsNullOrWhiteSpace(), (a, b, c, d) => a.Status.Contains(input.Keywords) || a.EnStatus.Contains(input.Keywords) || a.Code.Contains(input.Keywords)) .OrderByIF(input.SelectIds.IsNullOrEmpty(), (a, b, c, d) => a.CreateTime, OrderByType.Desc) .OrderByIF(!input.SelectIds.IsNullOrEmpty(), (a, b, c, d) => SqlFunc.IIF(input.SelectIds.Contains(a.Id), SqlFunc.DateAdd(SqlFunc.GetDate(), 1), a.CreateTime), OrderByType.Desc) - .Select((a, b, c, d) => new GetTrackStatusListVO + .Select((a, b, c, d,e) => new GetTrackStatusListVO { Id = a.Id, Code = a.Code, EntrackStatus = a.EnStatus, TrackStatus = a.Status, NodeId = a.Node, - Node = SqlFunc.IF(a.Node == 1).Return("揽收").ElseIF(a.Node == 2).Return("清关").ElseIF(a.Node == 3) - .Return("干线").ElseIF(a.Node == 4).Return("派送").ElseIF(a.Node == 5).Return("其他").End(""), + Node = e.NodeName!, CreateTime = a.CreateTime, CreateUser = c.Name, UpdateTime = a.UpdateTime, From a3c4199a302404c6a931c34432acfbf963d9d0ed Mon Sep 17 00:00:00 2001 From: xiaolipro <2357729423@qq.com> Date: Mon, 5 Aug 2024 10:01:12 +0800 Subject: [PATCH 4/4] =?UTF-8?q?Revert=20"=E3=80=90cheery=20pick=E3=80=91te?= =?UTF-8?q?mp=EF=BC=9Aremove=20notify=20table"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit d7c84cfc4a85cfa801d9560334a550e876dac43b. --- .../Dtos/Forewarning/CreateWarningInput.cs | 12 ++- .../Dtos/Forewarning/EditWarningOutput.cs | 20 ++++- .../Dtos/Forewarning/UpdateWarningInput.cs | 27 +++++- .../Helpers/ForewarningHelper.cs | 54 ++++++++---- .../ForewarningServices/ForewarningService.cs | 86 ++++++------------- .../Forewarning/CreateRuleFactorValidation.cs | 3 + .../Forewarning/RuleTrackStateDtoValidator.cs | 2 +- .../IWarningRepository.cs | 4 +- .../ForewarningAggregate/WarningEntity.cs | 6 ++ .../WarningNotifyEntity.cs | 49 +++++++++++ .../ForewarningAggregate/WarningRuleEntity.cs | 14 --- .../TrackStatusAggregate/TrackStatusEntity.cs | 12 +-- ...arningNotifyDto.cs => WarningNitifyDto.cs} | 9 +- src/SJZY.Track.Domain/Enums/NotifyMode.cs | 5 +- .../Queries/WarningQueries.cs | 10 ++- .../Repositories/WarningRepository.cs | 29 ++----- 16 files changed, 200 insertions(+), 142 deletions(-) create mode 100644 src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningNotifyEntity.cs rename src/SJZY.Track.Domain/Dtos/Forewarning/{WarningNotifyDto.cs => WarningNitifyDto.cs} (78%) diff --git a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/CreateWarningInput.cs b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/CreateWarningInput.cs index 96ee907a..0179e744 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/CreateWarningInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/CreateWarningInput.cs @@ -20,10 +20,20 @@ public class CreateWarningInput /// public int CustomerId { get; set; } + /// + /// 通知方式 + /// + public NotifyMode NotifyMode { get; set; } + + /// + /// 通知模板 + /// + public string NotifyTemplate { get; set; } = null!; + /// /// 轨迹状态跨度列表 /// - public List TrackStatusSpans { get; set; } = new(); + public List TrackStatusSpans { get; set; } = new(); /// /// 预警因素列表。 diff --git a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/EditWarningOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/EditWarningOutput.cs index d915660c..f8c65d67 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/EditWarningOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/EditWarningOutput.cs @@ -1,4 +1,5 @@ using SJZY.Track.Domain.Dtos.Forewarning; +using SJZY.Track.Domain.Enums; namespace SJZY.Track.Application.Contract.Dtos.Forewarning; @@ -19,10 +20,20 @@ public class EditWarningOutput /// public int CustomerId { get; set; } + /// + /// 通知方式 + /// + public NotifyMode NotifyMode { get; set; } + + /// + /// 通知模板 + /// + public string NotifyTemplate { get; set; } = null!; + /// /// 通知列表 /// - public List TrackStatusSpans { get; set; } = new(); + public List TrackStatusSpans { get; set; } = new(); /// /// 预警因素列表。 @@ -30,6 +41,13 @@ public class EditWarningOutput public List WarningFactors { get; set; } = new(); } +public class WarningNotifyWithIdDto: WarningNitifyDto +{ + /// + /// 通知id + /// + public int Id { get; set; } +} public class WarningFactorWithIdDto : WarningFactorDto { diff --git a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/UpdateWarningInput.cs b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/UpdateWarningInput.cs index 26685924..0d00a8d3 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/UpdateWarningInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/UpdateWarningInput.cs @@ -14,9 +14,32 @@ public class UpdateWarningInput /// 模板名称 /// public string Name { get; set; } = null!; - + + /// + /// 通知方式 + /// + public NotifyMode NotifyMode { get; set; } + + /// + /// 通知模板 + /// + public string NotifyTemplate { get; set; } = null!; + /// /// 通知列表 /// - public List Notifies { get; set; } = new(); + public List Notifies { get; set; } = new(); +} + +public class NotifyDto +{ + /// + /// 通知id + /// + public int Id { get; set; } + + /// + /// 通知人id + /// + public int NotifyUserId { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Helpers/ForewarningHelper.cs b/src/SJZY.Track.Application/Helpers/ForewarningHelper.cs index fe7bc274..a1a0e3bc 100644 --- a/src/SJZY.Track.Application/Helpers/ForewarningHelper.cs +++ b/src/SJZY.Track.Application/Helpers/ForewarningHelper.cs @@ -15,12 +15,17 @@ public class ForewarningHelper /// /// 递推分裂预警规则列表 /// - /// + /// + /// /// - public static List CalcRuleList(CreateWarningInput input) + public static List CalcRuleList(List statusSpans, + List factors) { - var statusSpans = input.TrackStatusSpans; - var factors = input.WarningFactors; + if (statusSpans.Count == 0 || factors.Count == 0) + { + throw new BusinessException(message: "轨迹状态区间或因素列表为空"); + } + var len = statusSpans.Count * factors.Select(f => f.FactorValue.Count).Aggregate((pre, cur) => pre * cur); if (len == 0) { @@ -47,7 +52,7 @@ public class ForewarningHelper return rules; } - private static void FillStatus(List statusSpans, List rules, int repeat) + private static void FillStatus(List statusSpans, List rules, int repeat) { var row = 0; foreach (var span in statusSpans) @@ -58,8 +63,6 @@ public class ForewarningHelper rules[row].StartTrackStatus = span.StartTrackStatus; rules[row].EndTrackStatusId = span.EndTrackStatusId; rules[row].EndTrackStatus = span.EndTrackStatus; - rules[row].NotifyMode = span.NotifyMode; - rules[row].NotifyUserId = span.NotifyUserId; } } } @@ -149,24 +152,37 @@ public class ForewarningHelper }).ToList(); } - public static EditWarningOutput MapWarningSummary(WarningEntity warning) + public static List MapNotifyEntities(CreateWarningInput input) { + return input.TrackStatusSpans.Select(x => new WarningNotifyEntity + { + StartTrackStatusId = x.StartTrackStatusId, + EndTrackStatusId = x.EndTrackStatusId, + NotifyMode = input.NotifyMode, + NotifyTemplate = input.NotifyTemplate, + NotifyUserId = x.NotifyUserId + }).ToList(); + } + + public static EditWarningOutput MapWarningSummary(WarningEntity warning, List statusList) + { + var statusDic = statusList.ToDictionary(x => x.Id, x => x.Name); return new EditWarningOutput { Name = warning.Name, SubSystemId = warning.SubSystemId, CustomerId = warning.CustomerId, - TrackStatusSpans = warning.WarningRules.GroupBy(x => new - { x.StartTrackStatusId, x.StartTrackStatus, x.EndTrackStatusId, x.EndTrackStatus }) - .Select(x => new WarningNotifyDto - { - StartTrackStatusId = x.Key.StartTrackStatusId, - StartTrackStatus = x.Key.StartTrackStatus, - EndTrackStatusId = x.Key.EndTrackStatusId, - EndTrackStatus = x.Key.EndTrackStatus, - NotifyMode = x.First().NotifyMode, - NotifyUserId = x.First().NotifyUserId, - }).ToList(), + NotifyMode = warning.WarningNotifies.First().NotifyMode, + NotifyTemplate = warning.WarningNotifies.First().NotifyTemplate, + TrackStatusSpans = warning.WarningNotifies.Select(x => new WarningNotifyWithIdDto + { + Id = x.Id, + StartTrackStatusId = x.StartTrackStatusId, + StartTrackStatus = statusDic.TryGetValue(x.StartTrackStatusId, out var start) ? start : "", + EndTrackStatusId = x.EndTrackStatusId, + EndTrackStatus = statusDic.TryGetValue(x.EndTrackStatusId, out var end) ? end : "", + NotifyUserId = x.NotifyUserId, + }).ToList(), WarningFactors = warning.WarningFactors.Select(x => new WarningFactorWithIdDto { Id = x.Id, diff --git a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningService.cs b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningService.cs index d6d41930..0c7be38f 100644 --- a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningService.cs +++ b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningService.cs @@ -6,6 +6,7 @@ using SJZY.Track.Application.Helpers; using SJZY.Track.Domain.Aggregates.ForewarningAggregate; using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; using SJZY.Track.Domain.Dtos.Forewarning; +using SJZY.Track.Domain.Dtos.TrackStatus; using SJZY.Track.Domain.Queries; namespace SJZY.Track.Application.Services.ForewarningServices; @@ -16,14 +17,11 @@ public class ForewarningService : ApplicationService { private readonly IWarningRepository _warningRepository; private readonly IForewarningCacheService _forewarningCacheService; - private readonly IBasicQuery _trackStatusQueries; - public ForewarningService(IWarningRepository warningRepository, IForewarningCacheService forewarningCacheService, - IBasicQuery trackStatusQueries) + public ForewarningService(IWarningRepository warningRepository, IForewarningCacheService forewarningCacheService) { _warningRepository = warningRepository; _forewarningCacheService = forewarningCacheService; - _trackStatusQueries = trackStatusQueries; } /// @@ -46,11 +44,6 @@ public class ForewarningService : ApplicationService [HttpPost("CreateWarning")] public async Task CreateWarning(CreateWarningInput input) { - if (input.TrackStatusSpans.Count == 0 || input.WarningFactors.Count == 0) - { - throw new BusinessException(message: "轨迹状态区间或因素列表为空"); - } - var warning = ObjectMapper.Map(input); if (await _warningRepository.IsAnyAsync(x => @@ -59,9 +52,11 @@ public class ForewarningService : ApplicationService throw new BusinessException(message: "该子系统下的客户已经存在一个同名预警: " + warning.Name); } - warning.WarningRules = ForewarningHelper.CalcRuleList(input); + warning.WarningRules = ForewarningHelper.CalcRuleList(input.TrackStatusSpans, input.WarningFactors); warning.FactorTypeSort = input.WarningFactors.Select(x => x.FactorType).JoinAsString(","); + warning.WarningFactors = ForewarningHelper.MapFactorEntities(input.WarningFactors); + warning.WarningNotifies = ForewarningHelper.MapNotifyEntities(input); await _warningRepository.CreateForewarningAsync(warning); return true; } @@ -70,18 +65,27 @@ public class ForewarningService : ApplicationService /// 编辑预警 /// /// + /// /// [HttpPost("EditWarning")] - public async Task EditWarning(int warningId) + public async Task EditWarning(int warningId, + [FromServices] IBasicQuery statusQuery) { - var warning = await _warningRepository.GetWithRulesAsync(warningId); + var warning = await _warningRepository.GetByIdAsync(warningId); if (warning == null) { throw new BusinessException(message: "预警不存在"); } - return ForewarningHelper.MapWarningSummary(warning); + var statusList = await statusQuery.GetListAsync(x => x.SubSystemId == warning.SubSystemId, x => + new IdWithNameDto + { + Id = x.Id, + Name = x.Status + }); + + return ForewarningHelper.MapWarningSummary(warning, statusList); } /// @@ -107,61 +111,19 @@ public class ForewarningService : ApplicationService warning.SetName(input.Name); - await VerifyAndFillStatusAsync(input.Notifies, warning.SubSystemId); - - warning.WarningRules = input.Notifies.Select(x => new WarningRuleEntity() + warning.WarningNotifies = input.Notifies.Select(x => new WarningNotifyEntity { - WarningId = warning.Id, - StartTrackStatusId = x.StartTrackStatusId, - EndTrackStatusId = x.EndTrackStatusId, - NotifyMode = x.NotifyMode, + Id = x.Id, + NotifyMode = input.NotifyMode, + NotifyTemplate = input.NotifyTemplate, NotifyUserId = x.NotifyUserId }).ToList(); await _warningRepository.UpdateForewarningAsync(warning); - + return true; } - private async Task VerifyAndFillStatusAsync(List notifies, int subSystemId) - { - var statusIds = new List(); - notifies.ForEach(x => - { - if (x.StartTrackStatusId == x.EndTrackStatusId) - { - throw new BusinessException(message: "起止轨迹状态不能相同"); - } - - statusIds.Add(x.StartTrackStatusId); - statusIds.Add(x.EndTrackStatusId); - }); - var statusList = await _trackStatusQueries.GetListAsync( - x => x.SubSystemId == subSystemId && statusIds.Contains(x.Id), x => - new IdWithNameDto - { - Id = x.Id, - Name = x.Status - }); - - var statusDic = statusList.ToDictionary(x => x.Id, x => x.Name); - notifies.ForEach(x => - { - if (!statusDic.ContainsKey(x.StartTrackStatusId)) - { - throw new BusinessException(message: "存在非法轨迹状态(包含子系统下不存在的轨迹状态)"); - } - - if (!statusDic.ContainsKey(x.EndTrackStatusId)) - { - throw new BusinessException(message: "存在非法轨迹状态(包含子系统下不存在的轨迹状态)"); - } - - x.StartTrackStatus = statusDic[x.StartTrackStatusId]; - x.EndTrackStatus = statusDic[x.EndTrackStatusId]; - }); - } - /// /// 启用or禁用预警 /// @@ -189,7 +151,7 @@ public class ForewarningService : ApplicationService warning.SetEnable(isEnable); await _warningRepository.TurnWarningAsync(warning); - + // 清除缓存 await _forewarningCacheService.DeleteRulesAsync(warning.SubSystemId, warning.CustomerId); @@ -233,7 +195,7 @@ public class ForewarningService : ApplicationService var warningRules = ObjectMapper.Map, List>(input.Items); await _warningRepository.ModifyTimeSpansAsync(warningRules); - + // 清除缓存 await _forewarningCacheService.DeleteRulesAsync(warning.SubSystemId, warning.CustomerId); return true; diff --git a/src/SJZY.Track.Application/Validations/Forewarning/CreateRuleFactorValidation.cs b/src/SJZY.Track.Application/Validations/Forewarning/CreateRuleFactorValidation.cs index bb216268..40f58dd3 100644 --- a/src/SJZY.Track.Application/Validations/Forewarning/CreateRuleFactorValidation.cs +++ b/src/SJZY.Track.Application/Validations/Forewarning/CreateRuleFactorValidation.cs @@ -10,6 +10,9 @@ public class CreateRuleFactorValidation : AbstractValidator { RuleFor(x => x.WarningFactors).NotNull().WithMessage("因素列表不能为空"); RuleFor(x => x.TrackStatusSpans).NotNull().WithMessage("轨迹状态列表不能为空"); + + RuleFor(x => x.NotifyTemplate).NotEmpty().WithMessage("通知模板必填") + .MaximumLength(256).WithMessage("通知模板长度不能超过256"); // todo: more validation } diff --git a/src/SJZY.Track.Application/Validations/Forewarning/RuleTrackStateDtoValidator.cs b/src/SJZY.Track.Application/Validations/Forewarning/RuleTrackStateDtoValidator.cs index 26228a96..cf61bc45 100644 --- a/src/SJZY.Track.Application/Validations/Forewarning/RuleTrackStateDtoValidator.cs +++ b/src/SJZY.Track.Application/Validations/Forewarning/RuleTrackStateDtoValidator.cs @@ -3,7 +3,7 @@ using SJZY.Track.Domain.Dtos.Forewarning; namespace SJZY.Track.Application.Validations.Forewarning; -public class RuleTrackStateDtoValidator : AbstractValidator +public class RuleTrackStateDtoValidator : AbstractValidator { public RuleTrackStateDtoValidator() { diff --git a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IWarningRepository.cs b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IWarningRepository.cs index 848b740f..efa73bbd 100644 --- a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IWarningRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/IWarningRepository.cs @@ -54,9 +54,9 @@ public interface IWarningRepository : IBasicRepository Task TurnWarningAsync(WarningEntity warning); /// - /// 获取预警 附带规则 + /// 获取预警,include factors, notifies /// /// /// - Task GetWithRulesAsync(int warningId); + Task GetByIdAsync(int warningId); } \ 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 index b7125824..4d8cea7e 100644 --- a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningEntity.cs @@ -53,6 +53,12 @@ public class WarningEntity: IFullAuditedBasicEntitys, IAggregateRoot /// [SugarColumn(IsIgnore = true)] public List WarningFactors { get; set; } = new(); + + /// + /// 预警通知 + /// + [SugarColumn(IsIgnore = true)] + public List WarningNotifies { get; set; } = new(); public void SetName(string name) { diff --git a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningNotifyEntity.cs b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningNotifyEntity.cs new file mode 100644 index 00000000..1b846469 --- /dev/null +++ b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningNotifyEntity.cs @@ -0,0 +1,49 @@ +using SJZY.Track.Domain.Enums; + +namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; + +[SugarTable("t_warning_notify")] +public class WarningNotifyEntity : IFullAuditedBasicEntitys, IEntity +{ + /// + /// 自增主键 + /// + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)] + public int Id { get; set; } + + /// + /// 预警id + /// + [SugarColumn(ColumnName = "WarningId")] + public int WarningId { 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 = "NotifyMode")] + public NotifyMode NotifyMode { get; set; } + + /// + /// 通知模板 + /// + [SugarColumn(ColumnName = "NotifyTemplate", Length = 256)] + public string NotifyTemplate { get; set; } = null!; + + /// + /// 通知人 + /// + [SugarColumn(ColumnName = "NotifyUserId")] + public int NotifyUserId { get; set; } +} \ 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 index 06b02509..f6141704 100644 --- a/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningRuleEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/ForewarningAggregate/WarningRuleEntity.cs @@ -1,5 +1,3 @@ -using SJZY.Track.Domain.Enums; - namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; [SugarTable("t_warning_rule")] @@ -94,16 +92,4 @@ public class WarningRuleEntity : IFullAuditedBasicEntitys, IEntity /// [SugarColumn(ColumnName = "ProductCode")] public string? ProductCode { get; set; } - - /// - /// 通知方式 - /// - [SugarColumn(ColumnName = "NotifyMode")] - public NotifyMode NotifyMode { get; set; } - - /// - /// 通知人 - /// - [SugarColumn(ColumnName = "NotifyUserId")] - public int NotifyUserId { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/TrackStatusAggregate/TrackStatusEntity.cs b/src/SJZY.Track.Domain/Aggregates/TrackStatusAggregate/TrackStatusEntity.cs index 4b54469f..0b200c1c 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackStatusAggregate/TrackStatusEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackStatusAggregate/TrackStatusEntity.cs @@ -11,12 +11,6 @@ public class TrackStatusEntity : IFullAuditedBasicEntitys, IAggregateRoot /// [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } - - /// - /// 子系统id - /// - [SugarColumn(ColumnName = "SubSystemId")] - public int SubSystemId { get; set; } /// /// 轨迹状态代码 @@ -41,4 +35,10 @@ public class TrackStatusEntity : IFullAuditedBasicEntitys, IAggregateRoot /// [SugarColumn(ColumnName = "Status")] public string Status { get; set; } = null!; + + /// + /// 子系统id + /// + [SugarColumn(ColumnName = "SubSystemId")] + public int SubSystemId { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Forewarning/WarningNotifyDto.cs b/src/SJZY.Track.Domain/Dtos/Forewarning/WarningNitifyDto.cs similarity index 78% rename from src/SJZY.Track.Domain/Dtos/Forewarning/WarningNotifyDto.cs rename to src/SJZY.Track.Domain/Dtos/Forewarning/WarningNitifyDto.cs index 3749e4cc..f831cfeb 100644 --- a/src/SJZY.Track.Domain/Dtos/Forewarning/WarningNotifyDto.cs +++ b/src/SJZY.Track.Domain/Dtos/Forewarning/WarningNitifyDto.cs @@ -1,8 +1,6 @@ -using SJZY.Track.Domain.Enums; - namespace SJZY.Track.Domain.Dtos.Forewarning; -public class WarningNotifyDto +public class WarningNitifyDto { /// /// 起始轨迹状态id @@ -23,11 +21,6 @@ public class WarningNotifyDto /// 终止轨迹状态 /// public string EndTrackStatus { get; set; } = null!; - - /// - /// 通知方式 - /// - public NotifyMode NotifyMode { get; set; } /// /// 通知人id diff --git a/src/SJZY.Track.Domain/Enums/NotifyMode.cs b/src/SJZY.Track.Domain/Enums/NotifyMode.cs index 2af2f323..f5821903 100644 --- a/src/SJZY.Track.Domain/Enums/NotifyMode.cs +++ b/src/SJZY.Track.Domain/Enums/NotifyMode.cs @@ -1,15 +1,14 @@ namespace SJZY.Track.Domain.Enums; -[Flags] public enum NotifyMode { /// /// 站内信 /// - SiteInternal = 0x1, + SiteInternal = 1, /// /// 飞书 /// - FeiShu = 0x10, + FeiShu = 2 } \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Queries/WarningQueries.cs b/src/SJZY.Track.Repository/Queries/WarningQueries.cs index 421b7b95..32aefadf 100644 --- a/src/SJZY.Track.Repository/Queries/WarningQueries.cs +++ b/src/SJZY.Track.Repository/Queries/WarningQueries.cs @@ -20,9 +20,12 @@ public class WarningQueries : ISugarRepository, IWarningQueries, return await Context.Queryable() .LeftJoin((w, wr) => w.Id == wr.WarningId) .LeftJoin((w, wr, a) => wr.AreaId == a.Id) + .LeftJoin((w, wr, a, wn) => + wr.WarningId == wn.WarningId && wr.StartTrackStatusId == wn.StartTrackStatusId && + wr.EndTrackStatusId == wn.EndTrackStatusId) .Filter(null, true) // 支持历史规则 .Where((w, wr) => ruleIds.Contains(wr.Id)) - .Select((w, wr, a) => new GetWarningNotifiesVo + .Select((w, wr, a, wn) => new GetWarningNotifiesVo { RuleId = wr.Id, WarningName = w.Name, @@ -37,8 +40,9 @@ public class WarningQueries : ISugarRepository, IWarningQueries, IsTransit = wr.IsTransit, LeavePort = wr.LeavePort, ProductCode = wr.ProductCode, - NotifyMode = wr.NotifyMode, - NotifyUserId = wr.NotifyUserId, + NotifyMode = wn.NotifyMode, + NotifyTemplate = wn.NotifyTemplate, + NotifyUserId = wn.NotifyUserId, FactorTypeSort = w.FactorTypeSort }) .ToListAsync(); diff --git a/src/SJZY.Track.Repository/Repositories/WarningRepository.cs b/src/SJZY.Track.Repository/Repositories/WarningRepository.cs index 54a59d0b..fe25f1d7 100644 --- a/src/SJZY.Track.Repository/Repositories/WarningRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/WarningRepository.cs @@ -14,12 +14,13 @@ public class WarningRepository : BasicRepository, IWarningReposit using var tran = TransactionHelper.GetReadCommitted(); var ruleId = await InsertReturnIdentityAsync(warning); + warning.WarningNotifies.ForEach(x => x.WarningId = ruleId); warning.WarningFactors.ForEach(x => x.WarningId = ruleId); - await Context.Insertable(warning.WarningFactors).ExecuteCommandAsync(); - warning.WarningRules.ForEach(x => x.WarningId = ruleId); + + await Context.Insertable(warning.WarningFactors).ExecuteCommandAsync(); + await Context.Insertable(warning.WarningNotifies).ExecuteCommandAsync(); await Context.Insertable(warning.WarningRules).ExecuteCommandAsync(); - tran.Complete(); return ruleId; } @@ -72,19 +73,8 @@ public class WarningRepository : BasicRepository, IWarningReposit using var tran = TransactionHelper.GetReadCommitted(); await Context.Updateable(warning).ExecuteCommandAsync(); - - await Context.Updateable(warning.WarningRules).WhereColumns(x => new - { - x.WarningId, - x.StartTrackStatusId, - x.EndTrackStatusId - }).UpdateColumns(x => new - { - x.NotifyMode, - x.NotifyUserId, - x.UpdateTime, - x.UpdateUserId, - }, true) + await Context.Updateable(warning.WarningNotifies) + .UpdateColumns(x => new { x.NotifyMode, x.NotifyTemplate, x.NotifyUserId, x.UpdateTime, x.UpdateUserId }) .ExecuteCommandAsync(); tran.Complete(); @@ -104,17 +94,16 @@ public class WarningRepository : BasicRepository, IWarningReposit .ExecuteCommandAsync() > 0; } - public async Task GetWithRulesAsync(int warningId) + public async Task GetByIdAsync(int warningId) { var warning = await GetFirstAsync(x => x.Id == warningId); if (warning == null) return null; - + warning.WarningFactors = await Context.Queryable() .Where(x => x.WarningId == warningId) .ToListAsync(); - - warning.WarningRules = await Context.Queryable() + warning.WarningNotifies = await Context.Queryable() .Where(x => x.WarningId == warningId) .ToListAsync();