diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs index 8434072e..92ce75e1 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs @@ -22,6 +22,11 @@ public class TrackPushEvent /// public string OrderNo { get; set; } = null!; + /// + /// 订单类型 + /// + public int OrderType { get; set; } + /// /// 轨迹内容id /// diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index d6fcb03a..c2c2072d 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -48,4 +48,9 @@ public class TrackUpsertEvent : UpsertTrackInput /// 原轨迹报文 /// public string? OriginTrackData { get; set; } + + /// + /// 操作人 + /// + public string? OperationMan { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs b/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs index fbee07b0..8bea9494 100644 --- a/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs +++ b/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs @@ -32,7 +32,7 @@ public class CAPFilter : SubscribeFilter throw new BusinessException(_ERROR_CODE, $"检测到重复消费,消费参数:{argumentJsonStr}"); RedisHelper.Client.Set($"CapExcuteFilter:{hash}", 60 * 10, - TimeSpan.FromDays(1).Seconds); // 1天内不允许一模一样的参数重复消费 + TimeSpan.FromHours(1).Seconds); // 1h内不允许一模一样的参数重复消费 } } diff --git a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs index 58ddb13a..a1f9aba4 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs @@ -44,7 +44,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var isSuccess = res.Code == InterfaceRelayConst.SuccessCode; - // 写推送日志 + // 往es 写推送日志 await _trackPushRecordsRepository.AddAsync(new TrackPushRecordIndex { IndexName = $"{GlobalConst.TrackPushRecordsIndex}-{DateTime.Now:yyyy.MM.dd}", @@ -52,6 +52,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe Message = res.Msg, OptionType = @event.OptionType.ToString(), OrderId = @event.OrderId, + OrderType = @event.OrderType, + OrderNo = @event.OrderNo, TrackStatus = @event.TrackStatus, TrackCode = @event.TrackCode, TrackContent = @event.TrackContent, diff --git a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs index e51481e5..e3276d02 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs @@ -8,7 +8,6 @@ using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Consts; using SJZY.Track.Domain.Queries; -using SJZY.UserCenter.HttpApi.Services; using Volo.Abp.DependencyInjection; namespace SJZY.Track.Application.EventHandlers; @@ -135,7 +134,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe IsCanDelete = trackContent.IsCanDelete, OriginTrackContent = @event.OriginTrackContent, OriginTrackData = @event.OriginTrackData, - CreateUser = CurrentUserRequest.CurrentUser.Name, + CreateUser = @event.OperationMan, CreateTime = DateTime.Now }; @@ -146,7 +145,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe track.TrackPlace = @event.TrackPlace; track.TrackTime = @event.TrackTime!.Value; track.TrackTimeZone = @event.TrackTimeZone!.Value; - track.UpdateUser = CurrentUserRequest.CurrentUser.Name; + track.UpdateUser = @event.OperationMan ?? "系统"; track.UpdateTime = DateTime.Now; } @@ -192,6 +191,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe OptionType = optionType, ServiceProviderCode = config.ServiceProviderCode, OrderNo = track.OrderNo, + OrderType = track.OrderType, OrderId = track.OrderId, TrackContentId = config.TrackContentId, TrackStatus = track.TrackStatus, diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs index 9fd4cd56..f5856f91 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs @@ -86,10 +86,10 @@ public class TrackPullService : ApplicationService } var orders = await _provideQueries.FindOrderWithServiceProviderAsync(config.ServiceProviderId); + var serviceProviderCode = orders.FirstOrDefault()?.ServiceProviderCode; foreach (var group in orders.GroupBy(x => - new TrackRefreshAttach(x.ServiceProviderId, x.ServiceProviderCode, x.SubSystemId, - x.OrderType))) + new { x.SubSystemId, x.OrderType })) { var data = group.Select(x => new { @@ -98,10 +98,13 @@ public class TrackPullService : ApplicationService // 批量获取轨迹 await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( - InterfaceRelayConst.GetTrackInterfaceCode, group.Key.ServiceProviderCode, data, - GlobalConst.TrackRefreshSubscribe, JsonConvert.SerializeObject(group.Key)); + InterfaceRelayConst.GetTrackInterfaceCode, serviceProviderCode, data, + GlobalConst.TrackRefreshSubscribe, + JsonConvert.SerializeObject(new TrackRefreshAttach(config.ServiceProviderId, serviceProviderCode!, + group.Key.SubSystemId, group.Key.OrderType))); } + if (config.PullInterval < 60) config.PullInterval = 60; await RedisHelper.Client.SetExAsync(redisKey, config.PullInterval * 60, orders.Count); } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs index b0972b56..78611294 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs @@ -5,6 +5,7 @@ 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.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Consts; using SJZY.Track.Domain.Enums; using SJZY.UserCenter.HttpApi.Services; @@ -22,16 +23,19 @@ public class TrackPushService : ApplicationService private readonly IOrderRepository _orderRepository; private readonly ITrackPushCacheService _pushCacheService; private readonly ICapPublisher _capPublisher; + private readonly ITrackPushRecordsRepository _trackPushRecordsRepository; public TrackPushService(ITrackPushCacheService pushCacheService, ITrackDetailsRepository trackDetailsRepository , IOrderRepository orderRepository - , ICapPublisher capPublisher) + , ICapPublisher capPublisher + , ITrackPushRecordsRepository trackPushRecordsRepository) { _pushCacheService = pushCacheService; _trackDetailsRepository = trackDetailsRepository; _orderRepository = orderRepository; _capPublisher = capPublisher; + _trackPushRecordsRepository = trackPushRecordsRepository; } /// @@ -47,7 +51,7 @@ public class TrackPushService : ApplicationService var orders = await _orderRepository.GetListAsync(x => x.OrderType == input.OrderType && input.OrderNos.Contains(x.OrderNo), x => new { - x.Id, x.OrderNo, x.SubSystemId, x.CustomId + x.Id, x.OrderNo, x.OrderType, x.SubSystemId, x.CustomId }); if (orders.Count == 0) @@ -75,10 +79,13 @@ public class TrackPushService : ApplicationService await _pushCacheService.GetPushContentConfigAsync(order.SubSystemId, order.CustomId, track.TrackContentId); + if (config == null) continue; + var trackPushEvent = new TrackPushEvent { ServiceProviderCode = config.ServiceProviderCode, OrderNo = order.OrderNo, + OrderType = order.OrderType, OrderId = order.Id, TrackContentId = config.TrackContentId, TrackStatus = track.TrackStatus, @@ -113,14 +120,30 @@ public class TrackPushService : ApplicationService [HttpPost("Track/PushWarnForTask")] public async Task PushWarnForTaskAsync() { - var time = DateTime.Now.Subtract(TimeSpan.FromHours(12)); - var orders = await _orderRepository.GetListAsync(x => - !x.IsCompleted && x.QuestionType == 0 && x.LatestPushTime < time); + var orders = await _orderRepository.GetPushWarnOrdersAsync(); - orders.ForEach(x => { x.QuestionType = (int)TrackProblemType.Warn; }); + var time = DateTime.Now.Subtract(TimeSpan.FromHours(12)); + + orders.ForEach(x => + { + x.QuestionType = x.LatestPushTime == null || x.LatestPushTime < time + ? (int)TrackProblemType.Warn + : (int)TrackProblemType.None; + }); await _orderRepository.UpdateRangeAsync(orders, x => new { x.QuestionType }); - return $"成功将{orders.Select(x => x.OrderNo).JoinAsString(",")}置为预警单"; + return $"成功将:{orders.Count(x => x.QuestionType == (int)TrackProblemType.Warn)}个订单置为预警"; + } + + /// + /// 获取轨迹推送记录 + /// + /// + /// + [HttpGet("Track/GetTrackPushRecords")] + public async Task> GetTrackPushRecordsAsync(OrderNoInfo input) + { + return await _trackPushRecordsRepository.GetTrackPushRecordsAsync(input.OrderNo, input.OrderType); } } \ 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 3e03dc21..c21e2a34 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -6,6 +6,7 @@ using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Consts; using SJZY.Track.Domain.Queries; +using SJZY.UserCenter.HttpApi.Services; namespace SJZY.Track.Application.Services.ProvideServices; @@ -56,6 +57,7 @@ public partial class TrackService : ApplicationService, ITrackService @event.LatestPushTrackContentId = order.LatestPushTrackContentId; @event.CustomId = order.CustomId; @event.IsCompleted = order.IsCompleted; + @event.OperationMan = CurrentUserRequest.CurrentUser.Name; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); return true; } diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs index acc0d4de..10832b40 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs @@ -25,6 +25,11 @@ public interface IOrderRepository : IBasicRepository /// Task DeleteOrderAsync(int orderId); + /// + /// 获取推送预警单 + /// + /// + Task> GetPushWarnOrdersAsync(); #region 订单关联 diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordsRepository.cs index e8115b13..e776b1f4 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordsRepository.cs @@ -15,4 +15,6 @@ public interface ITrackPushRecordsRepository /// /// Task> GetTrackPushRecordsAsync(int orderId); + + Task> GetTrackPushRecordsAsync(string inputOrderNo, int inputOrderType); } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs index 0d178b45..6efa70b5 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs @@ -17,6 +17,16 @@ public class TrackPushRecordIndex : IdBaseIndex /// public int OrderId { get; set; } + /// + /// 订单号 + /// + public string OrderNo { get; set; } = null!; + + /// + /// 订单类型(主数据枚举TrackOrderType) + /// + public int OrderType { get; set; } + /// /// 接口通请求Id /// diff --git a/src/SJZY.Track.Repository/Queries/TrackOrderQueries.cs b/src/SJZY.Track.Repository/Queries/TrackOrderQueries.cs index 8d9d2504..841a3555 100644 --- a/src/SJZY.Track.Repository/Queries/TrackOrderQueries.cs +++ b/src/SJZY.Track.Repository/Queries/TrackOrderQueries.cs @@ -1,6 +1,7 @@ using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Dtos.Order; +using SJZY.Track.Domain.Enums; using SJZY.Track.Domain.Queries; using SJZY.Track.Domain.VEntities; using SJZY.Track.Repository.VData.Entitys; @@ -38,6 +39,7 @@ public class TrackOrderQueries : ISugarRepository, ITrackOrderQueries, .WhereIF(input.CustomerId > 0, (a, b, c) => a.CustomId == input.CustomerId) .WhereIF(input.TrackOrderType > 0, (a, b, c) => a.OrderType == input.TrackOrderType) .WhereIF(input.TabType > 0, (a, b, c) => a.QuestionType == input.TabType) + .WhereIF(input.TabType == (int)TrackProblemType.Warn, (a, b, c) => !a.IsCompleted) .OrderByDescending((a, b, c) => a.CreateTime) .Select((a, b, c) => new TrackOrderVO { diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index 26a8ed2b..bbbdca05 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -1,6 +1,8 @@ using SJZY.Track.Domain; using SJZY.Track.Domain.Aggregates.OrderAggregate; +using SJZY.Track.Domain.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Dtos.Order; +using SJZY.Track.Domain.Enums; namespace SJZY.Track.Repository.Repositories; @@ -53,6 +55,23 @@ public class OrderRepository : BasicRepository, IOrderRepository, I tran.Complete(); } + public async Task> GetPushWarnOrdersAsync() + { + var errorType = (int)TrackProblemType.Error; + + return await Context.Queryable() + .LeftJoin((a, b) => a.SubSystemId == b.SubSystemId && a.CustomId == b.CustomId) + .Where((a, b) => !b.IsCompleted && b.QuestionType != errorType) + .Where("a.CreateTime < DATE_SUB(now(),INTERVAL 12 hour)") // 过滤掉创建时间不足12小时的 + .Select((a, b) => new OrderEntity + { + Id = b.Id, + QuestionType = b.QuestionType, + LatestPushTime = b.LatestPushTime + }) + .ToListAsync(); + } + #region 订单关联 public async Task> GetLinkedOrdersAsync(int orderId) diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs index fa370591..598ab7ba 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs @@ -93,10 +93,12 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract(x => x .Source(s => s.Includes(fd => fd + .Field(f => f.OrderId) .Field(f => f.OrderNo) .Field(f => f.TrackStatus) .Field(f => f.TrackCode) .Field(f => f.TrackContent) + .Field(f => f.TrackContentId) .Field(f => f.TrackPlace) .Field(f => f.TrackTime) .Field(f => f.TrackTimeZone) diff --git a/src/SJZY.Track.Repository/Repositories/TrackPushRecordsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackPushRecordsRepository.cs index b537adb1..3847d786 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackPushRecordsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackPushRecordsRepository.cs @@ -40,4 +40,18 @@ public class TrackPushRecordsRepository : ElasticSearchContextAbstract> GetTrackPushRecordsAsync(string orderNo, int orderType) + { + var data = await Context.SearchAsync(x => x + .Index(GlobalConst.TrackPushRecordsIndex) + .Query(q => + q.Term(t => t.OrderNo.Suffix("keyword"), orderNo) + && q.Term(f => f.OrderType, orderType) + ) + .Size(1000) + .Sort(s => s.Field(f => f.CreateTime, SortOrder.Descending))); + + return data.Documents.ToList(); + } } \ No newline at end of file