diff --git a/src/SJZY.Track.Application/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackDeleteEventHandler.cs index d4e48a10..f70492f4 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackDeleteEventHandler.cs @@ -23,7 +23,7 @@ public class TrackDeleteEventHandler: ITransientDependency, ICapSubscribe _capPublisher = capPublisher; } - [CapSubscribe(GlobalConst.TrackUpsertSubscribe)] + [CapSubscribe(GlobalConst.TrackDeleteSubscribe)] public async Task ConsumerAsync(TrackDeleteEvent @event) { // 不同子系统需要做内容映射 diff --git a/src/SJZY.Track.Application/SJZY.Track.Application.csproj b/src/SJZY.Track.Application/SJZY.Track.Application.csproj index 1e027d10..d2b2eafd 100644 --- a/src/SJZY.Track.Application/SJZY.Track.Application.csproj +++ b/src/SJZY.Track.Application/SJZY.Track.Application.csproj @@ -13,6 +13,10 @@ + + + + diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderLinkService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderLinkService.cs index 50490d04..73c08dd9 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/OrderLinkService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderLinkService.cs @@ -8,6 +8,7 @@ namespace SJZY.Track.Application.Services.ProvideServices; /// 订单关联服务 /// [ApiExplorerSettings(GroupName = "提供接口")] +[Route("/ProviderService")] public class OrderLinkService : ApplicationService { private readonly IOrderRepository _orderRepository; @@ -34,6 +35,12 @@ public class OrderLinkService : ApplicationService throw new BusinessException(message: $"订单:{input.OrderNo}不存在"); } + //todo:循环关联? + if (input.OrderType == input.LinkOrderType) + { + throw new BusinessException(message: "不能同级关联"); + } + if (input.LinkOrderNos.Count < 1 || input.LinkOrderType == 0) return true; // 单号去重 diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs index aaf59008..42c94f23 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs @@ -2,7 +2,6 @@ using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Dtos.Order; -using Volo.Abp.ObjectMapping; namespace SJZY.Track.Application.Services.ProvideServices; @@ -10,6 +9,7 @@ namespace SJZY.Track.Application.Services.ProvideServices; /// 订单服务 /// [ApiExplorerSettings(GroupName = "提供接口")] +[Route("/ProviderService")] public class OrderService : ApplicationService { private readonly IOrderRepository _orderRepository; diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs index 07dd84d3..53cdfd57 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs @@ -9,6 +9,7 @@ namespace SJZY.Track.Application.Services.ProvideServices; /// 轨迹拉取服务 /// [ApiExplorerSettings(GroupName = "提供接口")] +[Route("/ProviderService")] public class TrackPullService : ApplicationService { private readonly IOrderRepository _orderRepository; diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs index 5474a9be..f2b5320f 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs @@ -4,6 +4,7 @@ /// 轨迹推送服务 /// [ApiExplorerSettings(GroupName = "提供接口")] +[Route("/ProviderService")] public class TrackPushService: ApplicationService { diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackQueryService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackQueryService.cs index aa554a9a..96bb5de5 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackQueryService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackQueryService.cs @@ -10,6 +10,7 @@ namespace SJZY.Track.Application.Services.ProvideServices; /// 轨迹查询服务 /// [ApiExplorerSettings(GroupName = "提供接口")] +[Route("/ProviderService")] public class TrackQueryService : ApplicationService { private readonly ITrackDetailsRepository _trackDetailsRepository; diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 9fdbb37e..18adf7fa 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -10,6 +10,7 @@ namespace SJZY.Track.Application.Services.ProvideServices; /// 轨迹服务 /// [ApiExplorerSettings(GroupName = "提供接口")] +[Route("/ProviderService")] public class TrackService : ApplicationService { private readonly IOrderRepository _orderRepository; @@ -85,7 +86,7 @@ public class TrackService : ApplicationService TrackCodes = codes, SubSystemId = order.SubSystemId, }; - await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); + await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, @event); return true; } diff --git a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs index 2e4e0454..2bea18a6 100644 --- a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs +++ b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs @@ -1,4 +1,7 @@ -using SJZY.Expand.ABP.Core.Localization; +using DotNetCore.CAP; +using Microsoft.Extensions.Configuration; +using SJZY.Expand.ABP.Core.Localization; +using SJZY.Expand.ABP.Core.Logger; using SJZY.InterfaceRelay.Application.Contracts; using SJZY.Track.Application.Contract; using SJZY.Track.Application.Localization; @@ -67,19 +70,41 @@ namespace SJZY.Track.Application remoteServiceConfigurationName: "InterfaceForward", asDefaultService: false ); + + //CAP + context.Services.AddCapTableNameService(); + context.Services.AddCap(options => + { + options.UseMySql(configuration["ConnectionStrings:DefaultConnection"]!); + options.UseRabbitMQ(configure => + { + configure.HostName = configuration["RabbitMQ:HostName"]!; + configure.UserName = configuration["RabbitMQ:UserName"]!; + configure.Password = configuration["RabbitMQ:Password"]!; + configure.Port = configuration.GetValue("RabbitMQ:Port"); + }); + options.FailedRetryInterval = 60; + options.FailedRetryCount = 10; + options.UseDashboard(dashboardOptions => + { + dashboardOptions.PathBase = System.Diagnostics.Debugger.IsAttached ? "" : configuration["Swagger:JsonUrlPrefix"]; + }); + options.FailedThresholdCallback = faileCalback => + { + LogHelper.Error($@"{faileCalback.MessageType} 失败了,消息名称: {faileCalback.Message}"); + }; + }); } public override void PreConfigureServices(ServiceConfigurationContext context) { - var configuration = context.Services.GetConfiguration(); PreConfigure(options => { - options.ProxyClientActions.Add(async (remoteName, serviceProvider, httpClient) => + options.ProxyClientActions.Add((_, _, httpClient) => { //如果设置Token,前端需要传入Token 否则引发异常 httpClient.SetTokenHeader(); httpClient.Timeout = TimeSpan.FromMinutes(3); - await Task.CompletedTask; }); }); } diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs index e039c01e..9e8d59eb 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs @@ -9,9 +9,7 @@ public interface IOrderRepository : IBasicRepository /// /// /// - Task CreateOrderAsync(OrderEntity order); - - //Task> GetOrderDetails(GetOrderDetailsInputVO input); + Task CreateOrderAsync(OrderEntity order); /// /// 获取分页的轨迹订单 diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs index e21d6a04..04432d30 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs @@ -114,9 +114,8 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot [SugarColumn(ColumnName = "LeavePort")] public string? LeavePort { get; set; } - [Navigate(NavigateType.OneToMany, nameof(OrderFlightEntity.OrderId))] + [SugarColumn(IsIgnore = true)] public List OrderFlights { get; set; } - - [Navigate(NavigateType.OneToMany, nameof(OrderFlightEntity.OrderId))] + [SugarColumn(IsIgnore = true)] public List OrderTemplates { get; set; } } \ 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 185f0874..d79c78df 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs @@ -11,7 +11,7 @@ public interface ITrackDetailsRepository Task> GetListAsync(int orderType, List orderNos); Task<(List list, long total)> GetListAsync(TrackDetailsQueryInput input); - Task> GetListAsync(int orderId); + Task?> GetListAsync(int orderId); /// /// 删除轨迹 diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index 6a330083..0004343c 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -59,7 +59,7 @@ public class TrackDetailsIndex : IdBaseIndex /// /// 轨迹发生地 /// - public string? TrackPlace { get; set; } + public string TrackPlace { get; set; } = null!; /// /// 轨迹发生时间 diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index f8cd7136..728a0606 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -9,12 +9,17 @@ namespace SJZY.Track.Repository.Repositories; public class OrderRepository : BasicRepository, IOrderRepository, ITransientDependency { - public async Task CreateOrderAsync(OrderEntity order) + public async Task CreateOrderAsync(OrderEntity order) { - return await Context.InsertNav(order) - .Include(x => x.OrderFlights) - .Include(x => x.OrderTemplates) - .ExecuteCommandAsync(); + using var tran = TransactionHelper.GetReadCommitted(); + + var orderId = await InsertReturnIdentityAsync(order); + order.OrderTemplates.ForEach(x => x.OrderId = orderId); + await Context.Insertable(order.OrderTemplates).ExecuteCommandAsync(); + order.OrderFlights.ForEach(x => x.OrderId = orderId); + await Context.Insertable(order.OrderFlights).ExecuteCommandAsync(); + + tran.Complete(); } public async Task UpdateOrderAsync(OrderEntity order) diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs index 590cb749..71779e5d 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs @@ -1,4 +1,6 @@ using Nest; +using SJZY.Expand.ABP.Core.Logger; +using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Expand.ElasticSearch.Services; using SJZY.Track.Domain; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; @@ -9,8 +11,6 @@ namespace SJZY.Track.Repository.Repositories; internal class TrackDetailsRepository : ElasticSearchContextAbstract, ITrackDetailsRepository, ITransientDependency { - public string IndexName => $"{GlobalConst.TrackIndex}-{DateTime.Now:yyyy.MM.dd}"; - public TrackDetailsRepository(ConnectionFactory connectionFactory) : base(connectionFactory) { } @@ -18,32 +18,46 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract GetFirstOrDefaultAsync(int orderId, string trackCode) { var r = await Context.SearchAsync(s => s - .Index(IndexName) + .Source() .Query(q => - q.Term(t => t.Field(f => f.OrderId).Value(orderId)) - && q.Term(t => t.Field(f => f.TrackCode).Value(trackCode)) - && q.Term(t => t.Field(f => f.IsDeleted).Value(true)) + q.Term(f => f.OrderId, orderId) + && q.Term(f => f.TrackCode.Suffix("keyword"), trackCode) + && q.Term(f => f.IsDeleted, false) ) ); - - if (r.IsValid) + + var res= r.Documents.FirstOrDefault(); + if (r.Hits.FirstOrDefault() != default && res != default) { - return r.Documents.FirstOrDefault(); + res.Id = r.Hits.FirstOrDefault()!.Id; } - return default; + return res; } public async Task UpsertAsync(TrackDetailsIndex index) { - var response = await Context.UpdateAsync(index.Id, u => u - .Index(IndexName) - .Doc(index) - .DocAsUpsert() - //.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见 - ); - if (!response.IsValid) - throw new Exception($"数据修改失败,原因:{response.DebugInformation}"); + try + { + if (index.Id.IsNullOrWhiteSpace()) + { + // 按天写入es + await Context.IndexAsync(index, request => request + .Index($"{GlobalConst.TrackIndex}-{DateTime.Now:yyyy.MM.dd}") + ); + } + else + { + await Context.UpdateAsync(index.Id, u => u + .Doc(index) + //.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见 + ); + } + } + catch (Exception ex) + { + LogHelper.Error($"轨迹数据新增/修改失败,原因:{ex.Message}。\n{index.ToJson()}"); + } } public async Task> GetListAsync(int orderType, List orderNos) @@ -61,17 +75,17 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract q.Terms(t => t - .Field(f => f.OrderNo) + .Field(f => f.OrderNo.Suffix("keyword")) .Terms(orderNos)) && q.Term(f => f.OrderType, orderType) - && q.Term(t => t.Field(f => f.IsDeleted).Value(true)) + && q.Term(t => t.Field(f => f.IsDeleted).Value(false)) ) ); return data.Documents.ToList(); } - public async Task> GetListAsync(int orderId) + public async Task?> GetListAsync(int orderId) { var data = await Context.SearchAsync(x => x .Source(s => s.Includes(fd => fd @@ -83,7 +97,7 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract f.TraceTimeZone) )).Query(q => q.Terms(t => t.Field(f => f.OrderId).Terms(orderId)) - && q.Term(t => t.Field(f => f.IsDeleted).Value(true)) + && q.Term(t => t.Field(f => f.IsDeleted).Value(false)) ) ); @@ -98,7 +112,7 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract t.OrderId, orderId) && q.Terms(t => t.Field(f => f.TrackCode).Terms(trackCodes))) .Script(s => s - .Source("ctx._source.IsDeleted = true")) + .Source("ctx._source.isDeleted = true")) ); } @@ -114,7 +128,7 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract t .Field(f => f.OrderNo) .Terms(distinctOrderNumbers)) - && q.Term(t => t.Field(f => f.IsDeleted).Value(true)) + && q.Term(t => t.Field(f => f.IsDeleted).Value(false)) ) .Sort(s => s.Field(f => f.CreateTime, SortOrder.Descending)) .From((input.PageIndex - 1) * input.PageSize) diff --git a/src/SJZY.Track.Repository/SjzyTrackRepositoryModule.cs b/src/SJZY.Track.Repository/SjzyTrackRepositoryModule.cs index 546d80d9..e7ca3b6b 100644 --- a/src/SJZY.Track.Repository/SjzyTrackRepositoryModule.cs +++ b/src/SJZY.Track.Repository/SjzyTrackRepositoryModule.cs @@ -39,6 +39,10 @@ public class SjzyTrackRepositoryModule : AbpModule context.Services.AddElasticSearch(options => { + if (System.Diagnostics.Debugger.IsAttached) + { + options.ShowLogInfo = true; + } options.NodeUrls = configuration.GetSection("ElasticSearch:NodeUrls").Get>()!; options.LoginName = configuration["ElasticSearch:LoginName"]!; options.Password = configuration["ElasticSearch:Password"]!;