From 545efbeaf3636c89860fa248d080cc4ec93275bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Fri, 1 Mar 2024 17:49:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/ProvideServices/TrackUpsertEvent.cs | 6 - .../Dtos/ProvideServices/UpsertTrackInput.cs | 4 +- .../Events/TrackUpsertEvent.cs | 19 ++- .../SJZY.Track.Application.Contract.csproj | 6 +- .../AutoMapper/TrackAutoMapperProfile.cs | 13 +++ .../EventHandlers/TrackUpsertEventHandler.cs | 108 ++++++++++++++++++ .../SJZY.Track.Application.csproj | 14 +-- .../Services/ProvideServices/TrackCustomer.cs | 9 -- .../ProvideServices/TrackPushService.cs | 10 ++ .../Services/ProvideServices/TrackService.cs | 79 +++---------- .../OrderAggregate/IOrderRepository.cs | 4 +- .../Aggregates/OrderAggregate/OrderEntity.cs | 6 + .../TrackContentMapEntity.cs | 30 ++++- .../ITrackDetailsRepository.cs | 4 +- .../TrackDetailsIndex.cs | 22 ++-- .../Dtos/Order/LinkedOrderVO.cs | 14 +++ .../Dtos/TrackDetails/MatchTrackContentDto.cs | 6 +- src/SJZY.Track.Domain/GlobalConst.cs | 14 +++ .../Queries/ITrackQueries.cs | 9 ++ .../Queries/TrackQueries.cs | 9 ++ .../Repositories/OrderRepository.cs | 8 +- .../Repositories/TrackDetailsRepository.cs | 17 +-- 22 files changed, 284 insertions(+), 127 deletions(-) delete mode 100644 src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackUpsertEvent.cs create mode 100644 src/SJZY.Track.Application/AutoMapper/TrackAutoMapperProfile.cs create mode 100644 src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs delete mode 100644 src/SJZY.Track.Application/Services/ProvideServices/TrackCustomer.cs create mode 100644 src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs create mode 100644 src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs create mode 100644 src/SJZY.Track.Domain/GlobalConst.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackUpsertEvent.cs deleted file mode 100644 index b6f64a7a..00000000 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackUpsertEvent.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace SJZY.Track.Application.Contract.Dtos.ProvideServices; - -public class TrackUpsertEvent -{ - public int Order { get; set; } -} \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs index 91d5429c..ef0e67a4 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs @@ -5,12 +5,12 @@ public class UpsertTrackInput : OrderNoInfo /// /// 轨迹内容代码 /// - public string TrackCode { get; set; } + public string TrackCode { get; set; } = null!; /// /// 轨迹发生地 /// - public string TrackPlace { get; set; } + public string TrackPlace { get; set; } = null!; /// /// 轨迹发生时间 diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index 48784974..ad0fe356 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -1,6 +1,21 @@ -namespace SJZY.Track.Application.Contract.Events; +using SJZY.Track.Application.Contract.Dtos.ProvideServices; -public class TrackUpsertEvent +namespace SJZY.Track.Application.Contract.Events; + +public class TrackUpsertEvent : UpsertTrackInput { + /// + /// 订单id + /// public int OrderId { get; set; } + + /// + /// 子系统id + /// + public int SubSystemId { get; set; } + + /// + /// 上游子系统id + /// + public int UpSubSystemId { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj index a7a570d0..de5d1421 100644 --- a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj +++ b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj @@ -1,14 +1,14 @@ - + net7.0 0.0.2 - - + + diff --git a/src/SJZY.Track.Application/AutoMapper/TrackAutoMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/TrackAutoMapperProfile.cs new file mode 100644 index 00000000..b9c185d7 --- /dev/null +++ b/src/SJZY.Track.Application/AutoMapper/TrackAutoMapperProfile.cs @@ -0,0 +1,13 @@ +using AutoMapper; +using SJZY.Track.Application.Contract.Dtos.ProvideServices; +using SJZY.Track.Application.Contract.Events; + +namespace SJZY.Track.Application.AutoMapper; + +public class TrackAutoMapperProfile:Profile +{ + public TrackAutoMapperProfile() + { + CreateMap(MemberList.None); + } +} \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs new file mode 100644 index 00000000..220607ab --- /dev/null +++ b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs @@ -0,0 +1,108 @@ +using DotNetCore.CAP; +using SJZY.Expand.ABP.Core.PublicMethords; +using SJZY.Track.Application.Contract.Events; +using SJZY.Track.Domain.Aggregates.OrderAggregate; +using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; +using SJZY.Track.Domain.Queries; +using SJZY.UserCenter.HttpApi.Services; +using Volo.Abp.DependencyInjection; + +namespace SJZY.Track.Application.EventHandlers; + +public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe +{ + private readonly IOrderRepository _orderRepository; + private readonly ITrackQueries _trackQueries; + private readonly ITrackDetailsRepository _trackDetailsRepository; + private readonly ICapPublisher _capPublisher; + + public TrackUpsertEventHandler(IOrderRepository orderRepository, ICapPublisher capPublisher, + ITrackQueries trackQueries, ITrackDetailsRepository trackDetailsRepository) + { + _orderRepository = orderRepository; + _capPublisher = capPublisher; + _trackQueries = trackQueries; + _trackDetailsRepository = trackDetailsRepository; + } + + [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); + + if (mapCode == default) + { + throw new BusinessException(message: "订单跨子系统,未配置内容映射,请联系管理员"); + } + + @event.TrackCode = mapCode; + } + + await UpsertTrackAsync(@event); + } + + internal async Task UpsertTrackAsync(TrackUpsertEvent @event) + { + // 不存在则新增轨迹,存在则更新 + var track = await _trackDetailsRepository.GetFirstOrDefaultAsync(@event.OrderId, @event.TrackCode); + + var isPush = 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}"); + } + + track = new TrackDetailsIndex + { + OrderId = @event.OrderId, + OrderNo = @event.OrderNo, + OrderType = @event.OrderType, + TrackStatus = trackContent.Status, + TrackCode = @event.TrackCode, + TrackContent = trackContent.Content, + TrackEnContent = trackContent.EnContent, + TrackPlace = @event.TrackPlace, + TrackTime = @event.TrackTime, + TraceTimeZone = @event.TraceTimeZone, + CreateUserId = CurrentUserRequest.CurrentUser.UserId, + CreateTime = DateTime.Now + }; + + isPush = true; + } + else + { + track.TrackPlace = @event.TrackPlace; + track.TrackTime = @event.TrackTime; + track.TraceTimeZone = @event.TraceTimeZone; + track.UpdateUserId = CurrentUserRequest.CurrentUser.UserId; + track.UpdateTime = DateTime.Now; + } + + await _trackDetailsRepository.UpsertAsync(track); + + // 根据订单关联关系异步向下刷 + var linkedOrders = await _orderRepository.GetLinkedOrdersAsync(@event.OrderId); + foreach (var linkedOrder in linkedOrders) + { + var nextEvent = @event.DeepCopy(); + nextEvent.OrderId = linkedOrder.OrderId; + nextEvent.SubSystemId = linkedOrder.SubSystemId; + 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/SJZY.Track.Application.csproj b/src/SJZY.Track.Application/SJZY.Track.Application.csproj index fa25c565..cb744d89 100644 --- a/src/SJZY.Track.Application/SJZY.Track.Application.csproj +++ b/src/SJZY.Track.Application/SJZY.Track.Application.csproj @@ -1,6 +1,6 @@  - + net7.0 @@ -8,14 +8,14 @@ - - - - + + + + - - + + diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackCustomer.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackCustomer.cs deleted file mode 100644 index 9f722217..00000000 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackCustomer.cs +++ /dev/null @@ -1,9 +0,0 @@ -using DotNetCore.CAP; -using Volo.Abp.DependencyInjection; - -namespace SJZY.Track.Application.Services.ProvideServices; - -public class TrackCustomer : ITransientDependency, ICapSubscribe -{ - public const string CapSubscribe = "SJZY.Track.Upsert"; -} \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs new file mode 100644 index 00000000..5474a9be --- /dev/null +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs @@ -0,0 +1,10 @@ +namespace SJZY.Track.Application.Services.ProvideServices; + +/// +/// 轨迹推送服务 +/// +[ApiExplorerSettings(GroupName = "提供接口")] +public class TrackPushService: ApplicationService +{ + +} \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index fad211a8..d7cc59e3 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -1,9 +1,7 @@ -using DotNetCore.CAP; -using SJZY.Track.Application.Contract.Dtos.ProvideServices; +using SJZY.Track.Application.Contract.Dtos.ProvideServices; +using SJZY.Track.Application.Contract.Events; +using SJZY.Track.Application.EventHandlers; using SJZY.Track.Domain.Aggregates.OrderAggregate; -using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; -using SJZY.Track.Domain.Queries; -using SJZY.UserCenter.HttpApi.Services; namespace SJZY.Track.Application.Services.ProvideServices; @@ -14,17 +12,12 @@ namespace SJZY.Track.Application.Services.ProvideServices; public class TrackService : ApplicationService { private readonly IOrderRepository _orderRepository; - private readonly ITrackDetailsRepository _trackDetailsRepository; - private readonly ITrackQueries _trackQueries; - private readonly ICapPublisher _capPublisher; + private readonly TrackUpsertEventHandler _trackUpsertEventHandler; - public TrackService(ITrackQueries trackQueries, IOrderRepository orderRepository, - ITrackDetailsRepository trackDetailsRepository, ICapPublisher capPublisher) + public TrackService(IOrderRepository orderRepository, TrackUpsertEventHandler trackUpsertEventHandler) { - _trackQueries = trackQueries; _orderRepository = orderRepository; - _trackDetailsRepository = trackDetailsRepository; - _capPublisher = capPublisher; + _trackUpsertEventHandler = trackUpsertEventHandler; } /// @@ -36,59 +29,21 @@ public class TrackService : ApplicationService [HttpPost("Track/Upsert")] public async Task UpsertTrackAsync(UpsertTrackInput input) { - var orderId = await _orderRepository.GetFirstAsync(x => - x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, x => x.Id); - if (orderId == default) + var order = await _orderRepository.GetFirstAsync(x => + x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, x => new + { + x.Id, x.SubSystemId, x.IsPushCompleted + }); + if (order == default) { throw new BusinessException(message: $"订单:{input.OrderNo}不存在"); } - // 不存在则新增轨迹,存在则更新 - var track = await _trackDetailsRepository.GetFirstOrDefaultAsync(orderId, input.TrackCode); - if (track == default) - { - var trackContent = await _trackQueries.MatchTrackContentAsync(orderId, input.TrackCode); - if (trackContent == default) - { - throw new BusinessException(message: $"订单:{input.OrderNo} 所绑定的模板,没有一条内容可以匹配轨迹代码:{input.TrackCode}"); - } - - track = new TrackDetailsIndex - { - OrderId = orderId, - OrderNo = input.OrderNo, - OrderType = input.OrderType, - TrackStatus = trackContent.Status, - TrackCode = input.TrackCode, - TrackContent = trackContent.Content, - TrackEnContent = trackContent.EnContent, - TrackPlace = input.TrackPlace, - TrackTime = input.TrackTime, - TraceTimeZone = input.TraceTimeZone, - CreateUserId = CurrentUserRequest.CurrentUser.UserId, - CreateTime = DateTime.Now - }; - await _trackDetailsRepository.CreateAsync(track); - } - else - { - track.UpdateUserId = CurrentUserRequest.CurrentUser.UserId; - track.UpdateTime = DateTime.Now; - track.TrackPlace = input.TrackPlace; - track.TrackTime = input.TrackTime; - track.TraceTimeZone = input.TraceTimeZone; - await _trackDetailsRepository.UpdateAsync(track); - } - - // 根据订单关联关系向下刷,不同子系统还需要做内容映射 - var linkedOrderIds = await _orderRepository.GetLinkedOrderIdsAsync(orderId); - - if (linkedOrderIds.Count > 0) - { - await _capPublisher.PublishAsync(TrackCustomer.CapSubscribe, new TrackUpsertEvent { }); - } - - // 推送 + // 新增/更新轨迹 + var @event = ObjectMapper.Map(input); + @event.OrderId = order.Id; + @event.SubSystemId = order.SubSystemId; + await _trackUpsertEventHandler.UpsertTrackAsync(@event); return true; } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs index 136375c5..29b8ae37 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs @@ -38,11 +38,11 @@ public interface IOrderRepository : IBasicRepository #region 订单关联 /// - /// 根据订单id,获取关联的订单id集合 + /// 根据订单id,获取关联的订单集合 /// /// /// - Task> GetLinkedOrderIdsAsync(int orderId); + Task> GetLinkedOrdersAsync(int orderId); /// /// 关联订单 diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs index 33e44303..88de3765 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs @@ -41,6 +41,12 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot /// [SugarColumn(ColumnName = "IsCompleted")] public bool IsCompleted { get; set; } + + /// + /// 订单是否推送完成(异步维护) + /// + [SugarColumn(ColumnName = "IsPushCompleted")] + public bool IsPushCompleted { get; set; } /// /// 最新轨迹内容(异步维护) diff --git a/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/TrackContentMapEntity.cs b/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/TrackContentMapEntity.cs index fbeb2e9c..2ce468ed 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/TrackContentMapEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/TrackContentMapEntity.cs @@ -13,14 +13,38 @@ public class TrackContentMapEntity : IFullAuditedBasicEntitys, IEntity public int Id { get; set; } /// - /// 映射轨迹内容id + /// 源子系统id /// - [SugarColumn(ColumnName = "MapTrackContentId")] - public int MapTrackContentId { get; set; } + [SugarColumn(ColumnName = "SubSystemId")] + public int SubSystemId { get; set; } /// /// 源轨迹内容id /// [SugarColumn(ColumnName = "TrackContentId")] public int TrackContentId { get; set; } + + /// + /// 源轨迹内容code + /// + [SugarColumn(ColumnName = "TrackContentCode")] + public string TrackContentCode { get; set; } = null!; + + /// + /// 映射子系统id + /// + [SugarColumn(ColumnName = "MapSubSystemId")] + public int MapSubSystemId { get; set; } + + /// + /// 映射轨迹内容id + /// + [SugarColumn(ColumnName = "MapTrackContentId")] + public int MapTrackContentId { get; set; } + + /// + /// 映射轨迹内容code + /// + [SugarColumn(ColumnName = "MapTrackContentCode")] + public string MapTrackContentCode { get; set; } = null!; } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs index 89d812a1..3ab152d1 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs @@ -6,9 +6,7 @@ public interface ITrackDetailsRepository { Task GetFirstOrDefaultAsync(int orderId, string inputTrackCode); - Task UpdateAsync(TrackDetailsIndex index); - - Task CreateAsync(TrackDetailsIndex index); + Task UpsertAsync(TrackDetailsIndex index); Task> GetListAsync(int orderType, List orderNos); diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index a8160da6..35857507 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -3,11 +3,9 @@ using SJZY.Expand.ElasticSearch; namespace SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; -[ElasticsearchType(RelationName = IndexName)] +[ElasticsearchType(RelationName = GlobalConst.TrackIndex)] public class TrackDetailsIndex : IdBaseIndex { - public const string IndexName = "sjzy_track_details"; - /// /// 订单Id /// @@ -16,7 +14,7 @@ public class TrackDetailsIndex : IdBaseIndex /// /// 订单号 /// - public string OrderNo { get; set; } + public string OrderNo { get; set; } = null!; /// /// 订单类型(主数据枚举TrackOrderType) @@ -26,42 +24,42 @@ public class TrackDetailsIndex : IdBaseIndex /// /// 轨迹状态 /// - public string TrackStatus { get; set; } + public string TrackStatus { get; set; } = null!; /// /// 原轨迹状态 /// - public string OriginTrackStatus { get; set; } + public string? OriginTrackStatus { get; set; } /// /// 轨迹内容代码 /// - public string TrackCode { get; set; } + public string TrackCode { get; set; } = null!; /// /// 轨迹内容 /// - public string TrackContent { get; set; } + public string TrackContent { get; set; } = null!; /// /// 原轨迹内容 /// - public string OriginTrackContent { get; set; } + public string? OriginTrackContent { get; set; } /// /// 原轨迹报文 /// - public string OriginTrackData { get; set; } + public string? OriginTrackData { get; set; } /// /// 轨迹内容英文 /// - public string TrackEnContent { get; set; } + public string TrackEnContent { get; set; } = null!; /// /// 轨迹发生地 /// - public string TrackPlace { get; set; } + public string? TrackPlace { get; set; } /// /// 轨迹发生时间 diff --git a/src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs b/src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs new file mode 100644 index 00000000..5d1c7327 --- /dev/null +++ b/src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs @@ -0,0 +1,14 @@ +namespace SJZY.Track.Domain.Dtos.Order; + +public class LinkedOrderVO +{ + /// + /// 关联订单id + /// + public int OrderId { get; set; } + + /// + /// 子系统id + /// + public int SubSystemId { 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 c6e07352..ced59e19 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs @@ -5,15 +5,15 @@ public class MatchTrackContentDto /// /// 轨迹内容 /// - public string Content { get; set; } + public string Content { get; set; } = null!; /// /// 轨迹内容英文 /// - public string EnContent { get; set; } + public string EnContent { get; set; } = null!; /// /// 轨迹状态 /// - public string Status { get; set; } + public string Status { get; set; } = null!; } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/GlobalConst.cs b/src/SJZY.Track.Domain/GlobalConst.cs new file mode 100644 index 00000000..77881f20 --- /dev/null +++ b/src/SJZY.Track.Domain/GlobalConst.cs @@ -0,0 +1,14 @@ +namespace SJZY.Track.Domain; + +public class GlobalConst +{ + /// + /// 轨迹明细es索引名称 + /// + public const string TrackIndex = "sjzy_track_details"; + + /// + /// 轨迹新增/更新cap订阅名称 + /// + public const string TrackUpsertSubscribe = "SJZY.Track.Upsert"; +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Queries/ITrackQueries.cs b/src/SJZY.Track.Domain/Queries/ITrackQueries.cs index df41882c..53a9720e 100644 --- a/src/SJZY.Track.Domain/Queries/ITrackQueries.cs +++ b/src/SJZY.Track.Domain/Queries/ITrackQueries.cs @@ -31,4 +31,13 @@ public interface ITrackQueries /// 轨迹代码 /// Task MatchTrackContentAsync(int orderId, string code); + + /// + /// 根据子系统内容映射,得到映射后的轨迹code + /// + /// + /// + /// + /// + Task MapTrackContentCodeAsync(int upSubSystemId, int subSystemId, string trackCode); } \ 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 da7c4dab..a1e5168a 100644 --- a/src/SJZY.Track.Repository/Queries/TrackQueries.cs +++ b/src/SJZY.Track.Repository/Queries/TrackQueries.cs @@ -75,4 +75,13 @@ public class TrackQueries : ISugarRepository, ITrackQueries, }) .FirstAsync(); } + + public async Task MapTrackContentCodeAsync(int upSubSystemId, int subSystemId, string trackCode) + { + return await Context.Queryable() + .Where(x => x.SubSystemId == upSubSystemId && x.MapSubSystemId == subSystemId && + x.TrackContentCode == trackCode) + .Select(x => x.MapTrackContentCode) + .FirstAsync(); + } } \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index 8e9106da..8be1ec1a 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -53,12 +53,16 @@ public class OrderRepository : BasicRepository, IOrderRepository, I #region 订单关联 - public async Task> GetLinkedOrderIdsAsync(int orderId) + public async Task> GetLinkedOrdersAsync(int orderId) { return await Context.Queryable() .LeftJoin((a, b) => a.Id == b.OrderId) .Where(a => a.Id == orderId) - .Select((a, b) => b.LinkOrderId) + .Select((a, b) => new LinkedOrderVO + { + OrderId = b.LinkOrderId, + SubSystemId = a.SubSystemId + }) .ToListAsync(); } diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs index b5632055..c0ca92e4 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs @@ -1,5 +1,6 @@ using Nest; using SJZY.Expand.ElasticSearch.Services; +using SJZY.Track.Domain; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Dtos.TrackDetails; @@ -8,7 +9,7 @@ namespace SJZY.Track.Repository.Repositories; internal class TrackDetailsRepository : ElasticSearchContextAbstract, ITrackDetailsRepository, ITransientDependency { - public string IndexName => $"{TrackDetailsIndex.IndexName}-{DateTime.Now:yyyy.MM.dd}"; + public string IndexName => $"{GlobalConst.TrackIndex}-{DateTime.Now:yyyy.MM.dd}"; public TrackDetailsRepository(ConnectionFactory connectionFactory) : base(connectionFactory) { @@ -17,7 +18,7 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract GetFirstOrDefaultAsync(int orderId, string trackCode) { var r = await Context.SearchAsync(s => s - .Index($"{TrackDetailsIndex.IndexName}-{DateTime.Now:yyyy.MM.dd}") + .Index(IndexName) .Query(q => q.Term(t => t.Field(f => f.OrderId).Value(orderId)) && q.Term(t => t.Field(f => f.TrackCode).Value(trackCode)) @@ -32,24 +33,18 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract(index.Id, u => u .Index(IndexName) .Doc(index) - //.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见 + .DocAsUpsert() + //.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见 ); if (!response.IsValid) throw new Exception($"数据修改失败,原因:{response.DebugInformation}"); } - public async Task CreateAsync(TrackDetailsIndex index) - { - var response = await Context.IndexAsync(index, request => request.Index(IndexName)); - if (!response.IsValid) - throw new Exception($"数据添加失败,原因:{response.DebugInformation}"); - } - public async Task> GetListAsync(int orderType, List orderNos) { if (orderNos.Count < 1) return new List();