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