From 5fa20966ab43a6c9133b781dbed0ab9ec98b4af2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Sat, 2 Mar 2024 15:34:26 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E5=8F=91=E7=94=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Events/TrackUpsertEvent.cs | 12 ++++- .../Events/UpdateOrderTrackEvent.cs | 34 +++++++++++++ .../Services/ITrackPushCacheService.cs | 18 +++++++ .../EventHandlers/TrackUpsertEventHandler.cs | 51 +++++++++++++------ .../UpdateOrderTrackEventHandler.cs | 38 ++++++++++++++ .../ProvideServices/OrderLinkService.cs | 20 +++++--- .../Services/ProvideServices/TrackService.cs | 4 +- .../TrackPush/TrackPushCacheService.cs | 38 ++++++++++++++ .../TrackDetailsIndex.cs | 8 +-- .../Dtos/Order/LinkedOrderVO.cs | 20 ++++++++ .../Dtos/TrackDetails/MatchTrackContentDto.cs | 5 ++ src/SJZY.Track.Domain/GlobalConst.cs | 17 +++++-- .../Queries/TrackQueries.cs | 7 ++- .../Repositories/OrderRepository.cs | 15 ++++-- 14 files changed, 248 insertions(+), 39 deletions(-) create mode 100644 src/SJZY.Track.Application.Contract/Events/UpdateOrderTrackEvent.cs create mode 100644 src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs create mode 100644 src/SJZY.Track.Application/EventHandlers/UpdateOrderTrackEventHandler.cs create mode 100644 src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index ad0fe356..16d8c9ce 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -8,12 +8,22 @@ public class TrackUpsertEvent : UpsertTrackInput /// 订单id /// public int OrderId { get; set; } - + + /// + /// 客户id + /// + public int CustomId { get; set; } + /// /// 子系统id /// public int SubSystemId { get; set; } + /// + /// 订单是否推送完成(异步维护) + /// + public bool IsPushCompleted { get; set; } + /// /// 上游子系统id /// diff --git a/src/SJZY.Track.Application.Contract/Events/UpdateOrderTrackEvent.cs b/src/SJZY.Track.Application.Contract/Events/UpdateOrderTrackEvent.cs new file mode 100644 index 00000000..a92678d7 --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Events/UpdateOrderTrackEvent.cs @@ -0,0 +1,34 @@ +namespace SJZY.Track.Application.Contract.Events; + +public class UpdateOrderTrackEvent +{ + /// + /// 订单Id + /// + public int OrderId { get; set; } + + /// + /// 此次发生的轨迹是否意味完成 + /// + public bool IsCompleted { get; set; } + + /// + /// 轨迹内容 + /// + public string TrackContent { get; set; } = null!; + + /// + /// 轨迹内容英文 + /// + public string TrackEnContent { get; set; } = null!; + + /// + /// 轨迹发生地 + /// + public string TrackPlace { get; set; } = null!; + + /// + /// 轨迹发生时间 + /// + public DateTime TrackTime { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs b/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs new file mode 100644 index 00000000..04369975 --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs @@ -0,0 +1,18 @@ +namespace SJZY.Track.Application.Contract.Services; + +public interface ITrackPushCacheService +{ + /// + /// 判断客户是否需要推送 + /// + /// + /// + Task IsPushAsync(int customId); + + /// + /// 更新缓存 + /// + /// + /// + Task UpdateAsync(int customId, bool isPush); +} \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs index 220607ab..5f8d9466 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs @@ -1,6 +1,7 @@ using DotNetCore.CAP; using SJZY.Expand.ABP.Core.PublicMethords; 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.Queries; @@ -14,29 +15,33 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe private readonly IOrderRepository _orderRepository; private readonly ITrackQueries _trackQueries; private readonly ITrackDetailsRepository _trackDetailsRepository; + private readonly ITrackPushCacheService _trackPushCacheService; private readonly ICapPublisher _capPublisher; public TrackUpsertEventHandler(IOrderRepository orderRepository, ICapPublisher capPublisher, - ITrackQueries trackQueries, ITrackDetailsRepository trackDetailsRepository) + ITrackQueries trackQueries, ITrackDetailsRepository trackDetailsRepository, + ITrackPushCacheService trackPushCacheService) { _orderRepository = orderRepository; _capPublisher = capPublisher; _trackQueries = trackQueries; _trackDetailsRepository = trackDetailsRepository; + _trackPushCacheService = trackPushCacheService; } - [NonAction] [CapSubscribe(GlobalConst.TrackUpsertSubscribe)] public async Task ConsumerAsync(TrackUpsertEvent @event) { // 不同子系统需要做内容映射 if (@event.UpSubSystemId != @event.SubSystemId) { - var mapCode = await _trackQueries.MapTrackContentCodeAsync(@event.UpSubSystemId, @event.SubSystemId, @event.TrackCode); + var mapCode = await _trackQueries + .MapTrackContentCodeAsync(@event.UpSubSystemId, @event.SubSystemId, @event.TrackCode); if (mapCode == default) { - throw new BusinessException(message: "订单跨子系统,未配置内容映射,请联系管理员"); + //throw new BusinessException(message: "订单跨子系统,未配置内容映射,请联系管理员"); + return; } @event.TrackCode = mapCode; @@ -50,15 +55,17 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe // 不存在则新增轨迹,存在则更新 var track = await _trackDetailsRepository.GetFirstOrDefaultAsync(@event.OrderId, @event.TrackCode); - var isPush = false; // 推送只做新增的,更新和删除的不做先 + var orderIsCompleted = false; if (track == default) { // 根据轨迹code在订单模板内容中寻找匹配的 var trackContent = await _trackQueries.MatchTrackContentAsync(@event.OrderId, @event.TrackCode); if (trackContent == default) { - throw new BusinessException(message: $"订单:{@event.OrderNo} 所绑定的模板,没有一条内容可以匹配轨迹代码:{@event.TrackCode}"); + //throw new BusinessException(message: $"订单:{@event.OrderNo} 所绑定的模板,没有一条内容可以匹配轨迹代码:{@event.TrackCode}"); + return; } + orderIsCompleted = trackContent.IsCompleted; track = new TrackDetailsIndex { @@ -72,22 +79,37 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackPlace = @event.TrackPlace, TrackTime = @event.TrackTime, TraceTimeZone = @event.TraceTimeZone, - CreateUserId = CurrentUserRequest.CurrentUser.UserId, + CreateUser = CurrentUserRequest.CurrentUser.Name, CreateTime = DateTime.Now }; - - isPush = true; + + // todo:推送只做新增的,更新和删除的不做先 + if (!@event.IsPushCompleted && await _trackPushCacheService.IsPushAsync(@event.CustomId)) + { + //await PushTrack(); + } } else { track.TrackPlace = @event.TrackPlace; track.TrackTime = @event.TrackTime; track.TraceTimeZone = @event.TraceTimeZone; - track.UpdateUserId = CurrentUserRequest.CurrentUser.UserId; + track.UpdateUser = CurrentUserRequest.CurrentUser.Name; track.UpdateTime = DateTime.Now; } await _trackDetailsRepository.UpsertAsync(track); + + // 触发订单主表更新事件 + await _capPublisher.PublishAsync(GlobalConst.UpdateOrderTrackSubscribe, new UpdateOrderTrackEvent + { + OrderId = track.OrderId, + IsCompleted = orderIsCompleted, + TrackContent = track.TrackContent, + TrackEnContent = track.TrackEnContent, + TrackPlace = track.TrackPlace, + TrackTime = track.TrackTime + }); // 根据订单关联关系异步向下刷 var linkedOrders = await _orderRepository.GetLinkedOrdersAsync(@event.OrderId); @@ -95,14 +117,13 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe { var nextEvent = @event.DeepCopy(); nextEvent.OrderId = linkedOrder.OrderId; + nextEvent.OrderType = linkedOrder.OrderType; + nextEvent.OrderNo = linkedOrder.OrderNo; nextEvent.SubSystemId = linkedOrder.SubSystemId; + nextEvent.IsPushCompleted = linkedOrder.IsPushCompleted; + nextEvent.CustomId = linkedOrder.CustomId; nextEvent.UpSubSystemId = @event.SubSystemId; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, nextEvent); } - - if (isPush) - { - //await PushTrack(); - } } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/UpdateOrderTrackEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/UpdateOrderTrackEventHandler.cs new file mode 100644 index 00000000..b9ec2dd6 --- /dev/null +++ b/src/SJZY.Track.Application/EventHandlers/UpdateOrderTrackEventHandler.cs @@ -0,0 +1,38 @@ +using DotNetCore.CAP; +using SJZY.Track.Application.Contract.Events; +using SJZY.Track.Domain.Aggregates.OrderAggregate; +using Volo.Abp.DependencyInjection; + +namespace SJZY.Track.Application.EventHandlers; + +public class UpdateOrderTrackEventHandler : ITransientDependency, ICapSubscribe +{ + private readonly IOrderRepository _orderRepository; + + public UpdateOrderTrackEventHandler(IOrderRepository orderRepository) + { + _orderRepository = orderRepository; + } + + [CapSubscribe(GlobalConst.UpdateOrderTrackSubscribe)] + public async Task ConsumerAsync(UpdateOrderTrackEvent @event) + { + var order = await _orderRepository.GetFirstAsync(x => x.Id == @event.OrderId); + if (order == default) return; + + if (order.IsCompleted) return; + + if (order.LatestTrackTime > @event.TrackTime) return; + + order.LatestTrackContent = @event.TrackContent; + order.LatestTrackEnContent = @event.TrackEnContent; + order.LatestTrackPlace = @event.TrackPlace; + order.LatestTrackTime = @event.TrackTime; + if (@event.IsCompleted) order.IsCompleted = true; + + await _orderRepository.UpdateColumnAsync(order, x => new + { + x.IsCompleted, x.LatestTrackContent, x.LatestTrackEnContent, x.LatestTrackPlace, x.LatestTrackTime + }); + } +} \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderLinkService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderLinkService.cs index f0261697..50490d04 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/OrderLinkService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderLinkService.cs @@ -27,9 +27,11 @@ public class OrderLinkService : ApplicationService [HttpPost("Order/Link")] public async Task LinkOrderAsync(LinkOrderInput input) { - if (!await _orderRepository.IsAnyAsync(x => x.OrderType == input.OrderType && x.OrderNo == input.OrderNo)) + var orderId = await _orderRepository.GetFirstAsync(x => + x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, x => x.Id); + if (orderId == default) { - throw new BusinessException(message: $"单号:{input.OrderNo}不存在"); + throw new BusinessException(message: $"订单:{input.OrderNo}不存在"); } if (input.LinkOrderNos.Count < 1 || input.LinkOrderType == 0) return true; @@ -41,10 +43,10 @@ public class OrderLinkService : ApplicationService if (!input.IsLink) return await UnLinkOrderAsync(input); // 关联订单 - return await DoLinkOrderAsync(input); + return await DoLinkOrderAsync(input, orderId); } - private async Task DoLinkOrderAsync(LinkOrderInput input) + private async Task DoLinkOrderAsync(LinkOrderInput input, int orderId) { // 获取已关联的订单 var linkOrderNos = await _orderLinkQuery.GetListAsync(x => @@ -55,15 +57,17 @@ public class OrderLinkService : ApplicationService var noLinkOrderNos = input.LinkOrderNos.Except(linkOrderNos); // 过滤掉不存在的订单 - var canLinkOrderNos = await _orderRepository.GetListAsync(x => + var canLinkOrders = await _orderRepository.GetListAsync(x => x.OrderType == input.LinkOrderType && noLinkOrderNos.Contains(x.OrderNo), - x => x.OrderNo); + x => new { x.Id, x.OrderNo }); - await _orderRepository.LinkOrderAsync(canLinkOrderNos.Select(x => new OrderLinkEntity + await _orderRepository.LinkOrderAsync(canLinkOrders.Select(x => new OrderLinkEntity { + OrderId = orderId, OrderNo = input.OrderNo, OrderType = input.OrderType, - LinkOrderNo = x, + LinkOrderId = x.Id, + LinkOrderNo = x.OrderNo, LinkOrderType = input.LinkOrderType }).ToList()); diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index d7cc59e3..dacb87fe 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -32,7 +32,7 @@ public class TrackService : ApplicationService var order = await _orderRepository.GetFirstAsync(x => x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, x => new { - x.Id, x.SubSystemId, x.IsPushCompleted + x.Id, x.SubSystemId, x.IsPushCompleted, x.CustomId }); if (order == default) { @@ -43,6 +43,8 @@ public class TrackService : ApplicationService var @event = ObjectMapper.Map(input); @event.OrderId = order.Id; @event.SubSystemId = order.SubSystemId; + @event.IsPushCompleted = order.IsPushCompleted; + @event.CustomId = order.CustomId; await _trackUpsertEventHandler.UpsertTrackAsync(@event); return true; } diff --git a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs new file mode 100644 index 00000000..468d69a8 --- /dev/null +++ b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs @@ -0,0 +1,38 @@ +using SJZY.Expand.ABP.Core; +using SJZY.Track.Application.Contract.Services; +using SJZY.Track.Domain.Aggregates.TrackPushAggregate; +using SJZY.Track.Domain.Queries; +using Volo.Abp.DependencyInjection; + +namespace SJZY.Track.Application.Services.TrackPush; + +public class TrackPushCacheService:ITrackPushCacheService, ITransientDependency +{ + private readonly IBasicQuery _trackPushConfigQuery; + private string RedisKey(int customId) => GlobalConst.TrackPushKeyPrefix + customId; + + public TrackPushCacheService(IBasicQuery trackPushConfigQuery) + { + _trackPushConfigQuery = trackPushConfigQuery; + } + + public async Task IsPushAsync(int customId) + { + var isPush = + await RedisHelper.Client.GetAsync(RedisKey(customId)); + + if (isPush == null) + { + isPush = await _trackPushConfigQuery.GetFirstAsync(x => x.CustomId == customId, + x => x.IsAutoPush); + await RedisHelper.Client.SetAsync(RedisKey(customId), isPush); + } + + return (bool)isPush; + } + + public async Task UpdateAsync(int customId, bool isPush) + { + await RedisHelper.Client.SetAsync(RedisKey(customId), isPush); + } +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index 35857507..6a330083 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -74,14 +74,14 @@ public class TrackDetailsIndex : IdBaseIndex /// 删除标记 0正常 1 已删除 public bool IsDeleted { get; set; } - /// 创建人id - public int CreateUserId { get; set; } + /// 创建人 + public string? CreateUser { get; set; } /// 创建时间 public DateTime CreateTime { get; set; } - /// 修改人id - public int? UpdateUserId { get; set; } + /// 修改人 + public string? UpdateUser { get; set; } /// 修改时间 public DateTime? UpdateTime { get; set; } diff --git a/src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs b/src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs index 5d1c7327..c0344880 100644 --- a/src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs +++ b/src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs @@ -6,9 +6,29 @@ public class LinkedOrderVO /// 关联订单id /// public int OrderId { get; set; } + + /// + /// 订单号 + /// + public string OrderNo { get; set; } = null!; + + /// + /// 订单类型(主数据枚举TrackOrderType) + /// + public int OrderType { get; set; } /// /// 子系统id /// public int SubSystemId { get; set; } + + /// + /// 订单是否推送完成(异步维护) + /// + public bool IsPushCompleted { get; set; } + + /// + /// 客户id + /// + public int CustomId { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs b/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs index ced59e19..2c2a366d 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs @@ -16,4 +16,9 @@ public class MatchTrackContentDto /// 轨迹状态 /// public string Status { get; set; } = null!; + + /// + /// 是否意味着完成 + /// + public bool IsCompleted { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/GlobalConst.cs b/src/SJZY.Track.Domain/GlobalConst.cs index 77881f20..f4ae0ff0 100644 --- a/src/SJZY.Track.Domain/GlobalConst.cs +++ b/src/SJZY.Track.Domain/GlobalConst.cs @@ -3,12 +3,23 @@ public class GlobalConst { /// - /// 轨迹明细es索引名称 + /// 轨迹明细 es索引名称 /// public const string TrackIndex = "sjzy_track_details"; /// - /// 轨迹新增/更新cap订阅名称 + /// 轨迹新增/更新 mq订阅名称 /// - public const string TrackUpsertSubscribe = "SJZY.Track.Upsert"; + public const string TrackUpsertSubscribe = "SJZY.Track.TrackUpsert"; + + /// + /// 轨迹新增/更新后触发更新订单轨迹 mq订阅名称 + /// + public const string UpdateOrderTrackSubscribe = "SJZY.Track.UpdateOrderTrack"; + + + /// + /// 轨迹要推送的客户redis key前缀 + /// + public const string TrackPushKeyPrefix = "TrackPush:"; } \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Queries/TrackQueries.cs b/src/SJZY.Track.Repository/Queries/TrackQueries.cs index a1e5168a..814649fe 100644 --- a/src/SJZY.Track.Repository/Queries/TrackQueries.cs +++ b/src/SJZY.Track.Repository/Queries/TrackQueries.cs @@ -1,5 +1,6 @@ using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackContentAggregate; +using SJZY.Track.Domain.Aggregates.TrackFlagAggregate; using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Dtos.Order; @@ -66,12 +67,14 @@ public class TrackQueries : ISugarRepository, ITrackQueries, .LeftJoin((x, a) => x.TrackTemplateId == a.TrackTemplateId) .LeftJoin((x, a, b) => a.TrackContentId == b.Id) .LeftJoin((x, a, b, c) => b.TrackStatusId == c.Id) + .LeftJoin((x, a, b, c, d) => b.TrackFlagId == d.Id) .Where((x, a, b) => x.OrderId == orderId && b.Code == code) - .Select((x, a, b, c) => new MatchTrackContentDto + .Select((x, a, b, c,d) => new MatchTrackContentDto { Content = b.Content, EnContent = b.EnContent, - Status = c.Status + Status = c.Status, + IsCompleted = d.IsCompleted }) .FirstAsync(); } diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index 8be1ec1a..a590a496 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -55,13 +55,18 @@ public class OrderRepository : BasicRepository, IOrderRepository, I public async Task> GetLinkedOrdersAsync(int orderId) { - return await Context.Queryable() - .LeftJoin((a, b) => a.Id == b.OrderId) + return await Context.Queryable() + .LeftJoin((a , b) => a.Id == b.OrderId) + .LeftJoin((a, b, c) => b.LinkOrderId == c.Id) .Where(a => a.Id == orderId) - .Select((a, b) => new LinkedOrderVO + .Select((a, b,c) => new LinkedOrderVO { - OrderId = b.LinkOrderId, - SubSystemId = a.SubSystemId + OrderId = c.Id, + OrderType = c.OrderType, + OrderNo = c.OrderNo, + SubSystemId = c.SubSystemId, + IsPushCompleted = c.IsPushCompleted, + CustomId = c.CustomId }) .ToListAsync(); } From 6da3e0748ce6c1931795771bc072165f3504e9db Mon Sep 17 00:00:00 2001 From: moyongzhen <2534173414@qq.com> Date: Sat, 2 Mar 2024 15:52:12 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TrackContents/TrackContentService.cs | 13 ++++++++++++- .../EditTrackContentMapInputValidation.cs | 10 +++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index 9c872bf2..9490f1d3 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -7,6 +7,7 @@ using SJZY.Track.Application.Contract.Dtos.TrackPull; using SJZY.Track.Application.Localization; using SJZY.Track.Domain.Aggregates.TrackContentAggregate; using SJZY.Track.Domain.Aggregates.TrackPullAggregate; +using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Dtos.TrackContents; using SJZY.Track.Domain.Queries; using System.Linq.Expressions; @@ -24,16 +25,19 @@ namespace SJZY.Track.Application.Services.TrackContents private readonly IStringLocalizer _stringLocalizer; private readonly ITrackContentRepository _trackContentRepository; private readonly IBasicQuery _trackContentMapBasicQuery; + private readonly IBasicQuery _trackTemplateContentBasicQuery; public TrackContentService( IStringLocalizer stringLocalizer, ITrackContentRepository trackContentRepository, - IBasicQuery trackContentMapBasicQuery + IBasicQuery trackContentMapBasicQuery, + IBasicQuery trackTemplateContentBasicQuery ) { this._stringLocalizer = stringLocalizer; this._trackContentRepository = trackContentRepository; this._trackContentMapBasicQuery=trackContentMapBasicQuery; + this._trackTemplateContentBasicQuery=trackTemplateContentBasicQuery; } /// @@ -161,6 +165,13 @@ namespace SJZY.Track.Application.Services.TrackContents { #region 业务校验 + //查询是否关联了轨迹模版内容 + var trackTemplateContents = await _trackTemplateContentBasicQuery.GetListAsync(a => a.TrackContentId==input.Id); + if (trackTemplateContents.Any()) + { + throw new BusinessException(message: "该轨迹内容关联轨迹模板,禁止删除"); + } + //需要加个判断,存在内容映射,则出提示 var trackContentMapEntities = await _trackContentMapBasicQuery.GetListAsync(a => a.TrackContentId==input.Id|| a.MapTrackContentId==input.Id); if (trackContentMapEntities.Any()) diff --git a/src/SJZY.Track.Application/Validations/TrackContents/EditTrackContentMapInputValidation.cs b/src/SJZY.Track.Application/Validations/TrackContents/EditTrackContentMapInputValidation.cs index b4cf3ed8..90a334a9 100644 --- a/src/SJZY.Track.Application/Validations/TrackContents/EditTrackContentMapInputValidation.cs +++ b/src/SJZY.Track.Application/Validations/TrackContents/EditTrackContentMapInputValidation.cs @@ -12,7 +12,7 @@ public class EditTrackContentMapInputValidation : AbstractValidator x.Options).IsInEnum().WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_IsInEnum, nameof(EditTrackContentMapInput.Options)]); - RuleFor(x => x.Id).GreaterThan(0).WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_GreaterThan, nameof(EditTrackContentMapInput.Id), 0]); + //RuleFor(x => x.Id).GreaterThan(0).WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_GreaterThan, nameof(EditTrackContentMapInput.Id), 0]); RuleFor(x => x.MapSubSystemId).GreaterThan(0).WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_GreaterThan, nameof(EditTrackContentMapInput.MapSubSystemId), 0]); @@ -22,10 +22,10 @@ public class EditTrackContentMapInputValidation : AbstractValidator x.TrackContentId).GreaterThan(0).WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_GreaterThan, nameof(EditTrackContentMapInput.TrackContentId), 0]); - When(x => x.Options != OptionTypeNoNull.新增, () => - { - RuleFor(x => x.Id).NotNull().WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_NotNull, nameof(EditTrackContentMapInput.Id)]); - }); + //When(x => x.Options != OptionTypeNoNull.新增, () => + //{ + // RuleFor(x => x.Id).NotNull().WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_NotNull, nameof(EditTrackContentMapInput.Id)]); + //}); When(x => x.Options != OptionTypeNoNull.删除, () => {