Merge remote-tracking branch 'origin/S02-轨迹中台第二部分' into dev
This commit is contained in:
commit
354c0a5b86
@ -4,6 +4,11 @@ namespace SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
||||
|
||||
public class BatchUpsertTrackInput : OrderNosInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// true新增,false更新
|
||||
/// </summary>
|
||||
public bool IsAdd { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹内容代码
|
||||
/// </summary>
|
||||
|
||||
@ -4,6 +4,11 @@ namespace SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
||||
|
||||
public class UpsertTrackInput : OrderNoInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// true新增,false更新
|
||||
/// </summary>
|
||||
public bool IsAdd { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹内容代码
|
||||
/// </summary>
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
namespace SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
||||
namespace SJZY.Track.Application.Contract.Dtos.TrackPush;
|
||||
|
||||
public class TrackPushConfigDto
|
||||
{
|
||||
@ -1,6 +1,6 @@
|
||||
namespace SJZY.Track.Application.Contract.Events;
|
||||
|
||||
public class TrackUpsertAfterUpdateOrderEvent
|
||||
public class TrackChangeAfterUpdateOrderEvent
|
||||
{
|
||||
/// <summary>
|
||||
/// 订单Id
|
||||
@ -13,10 +13,15 @@ public class TrackUpsertAfterUpdateOrderEvent
|
||||
public bool IsDelete { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 此次发生的轨迹是否意味完成
|
||||
/// 这条轨迹是否意味着完成
|
||||
/// </summary>
|
||||
public bool IsCompleted { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹代码
|
||||
/// </summary>
|
||||
public string TrackCode { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹内容
|
||||
/// </summary>
|
||||
@ -41,9 +46,4 @@ public class TrackUpsertAfterUpdateOrderEvent
|
||||
/// 轨迹时区
|
||||
/// </summary>
|
||||
public float TrackTimeZone { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹代码
|
||||
/// </summary>
|
||||
public string TrackCode { get; set; } = null!;
|
||||
}
|
||||
@ -22,6 +22,11 @@ public class TrackDeleteEvent
|
||||
/// </summary>
|
||||
public int UpSubSystemId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 操作人
|
||||
/// </summary>
|
||||
public string? OperationMan { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 已经处理过的订单
|
||||
/// </summary>
|
||||
|
||||
@ -22,6 +22,11 @@ public class TrackPushEvent
|
||||
/// </summary>
|
||||
public string OrderNo { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 订单类型
|
||||
/// </summary>
|
||||
public int OrderType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹内容id
|
||||
/// </summary>
|
||||
|
||||
@ -1,14 +1,22 @@
|
||||
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
||||
namespace SJZY.Track.Application.Contract.Events;
|
||||
|
||||
namespace SJZY.Track.Application.Contract.Events;
|
||||
|
||||
public class TrackUpsertEvent : UpsertTrackInput
|
||||
public class TrackUpsertEvent
|
||||
{
|
||||
/// <summary>
|
||||
/// 订单id
|
||||
/// </summary>
|
||||
public int OrderId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 订单类型
|
||||
/// </summary>
|
||||
public int OrderType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 订单号
|
||||
/// </summary>
|
||||
public string OrderNo { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 订单是否完成
|
||||
/// </summary>
|
||||
@ -34,6 +42,46 @@ public class TrackUpsertEvent : UpsertTrackInput
|
||||
/// </summary>
|
||||
public int UpSubSystemId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 原轨迹内容
|
||||
/// </summary>
|
||||
public string? OriginTrackContent { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 原轨迹报文
|
||||
/// </summary>
|
||||
public string? OriginTrackData { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 操作人
|
||||
/// </summary>
|
||||
public string? OperationMan { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// true新增,false更新,null表示刷新引发的新增/更新
|
||||
/// </summary>
|
||||
public bool? IsAdd { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹内容代码
|
||||
/// </summary>
|
||||
public string TrackCode { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹发生地
|
||||
/// </summary>
|
||||
public string TrackPlace { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹发生时间
|
||||
/// </summary>
|
||||
public DateTime TrackTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹发生时区
|
||||
/// </summary>
|
||||
public float TrackTimeZone { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 已经处理过的订单
|
||||
/// </summary>
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<GenerateDocumentationFile>True</GenerateDocumentationFile>
|
||||
<Version>1.0.0</Version>
|
||||
<Version>1.0.1</Version>
|
||||
<GenerateDocumentationFile>True</GenerateDocumentationFile>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
||||
using SJZY.Track.Application.Contract.Dtos.TrackPush;
|
||||
|
||||
namespace SJZY.Track.Application.Contract.Services;
|
||||
|
||||
@ -19,7 +19,7 @@ public interface ITrackPushCacheService
|
||||
/// <param name="customId">服务商id</param>
|
||||
/// <param name="trackContentId"></param>
|
||||
/// <returns></returns>
|
||||
Task<TrackPushContentConfigDto> GetPushContentConfigAsync(int subSystemId, int customId, int trackContentId);
|
||||
Task<TrackPushContentConfigDto?> GetPushContentConfigAsync(int subSystemId, int customId, int trackContentId);
|
||||
|
||||
/// <summary>
|
||||
/// 根据轨迹代码推断下一个(升序)要推送的内容,如果找不到或者已经是最后一个了,返回null
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
using AutoMapper;
|
||||
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
||||
using SJZY.Track.Application.Contract.Dtos.TrackPush;
|
||||
using SJZY.Track.Domain.Aggregates.TrackPullAggregate;
|
||||
using SJZY.Track.Domain.Aggregates.TrackPushAggregate;
|
||||
using SJZY.Track.Domain.Dtos.TrackPush;
|
||||
using Volo.Abp.AutoMapper;
|
||||
|
||||
namespace SJZY.Track.Application.AutoMapper;
|
||||
@ -15,7 +15,6 @@ public class TrackPushAutoMapperProfile : Profile
|
||||
CreateMap<EditTrackPushConfigInput, TrackPushPullParamsConfigEntity>(MemberList.None).Ignore(dest => dest.Id)
|
||||
.ForMember(dest => dest.IsPush, opt => opt.MapFrom(source => true));
|
||||
CreateMap<EditTrackPushContentInput, TrackPushContentConfigEntity>(MemberList.None);
|
||||
CreateMap<TrackPushContentConfigEntity, TrackPushContentConfigDto>(MemberList.None)
|
||||
.ForMember(dest => dest.OrderType, opt => opt.MapFrom(source => source.OrderNoType));
|
||||
CreateMap<TrackPushContentConfigVO, TrackPushContentConfigDto>(MemberList.None);
|
||||
}
|
||||
}
|
||||
108
src/SJZY.Track.Application/EventHandlers/CAPFilter.cs
Normal file
108
src/SJZY.Track.Application/EventHandlers/CAPFilter.cs
Normal file
@ -0,0 +1,108 @@
|
||||
using System.Globalization;
|
||||
using DotNetCore.CAP.Filter;
|
||||
using SJZY.Expand.ABP.Core;
|
||||
using SJZY.Expand.ABP.Core.Logger;
|
||||
using SJZY.Expand.ABP.Core.PublicMethords;
|
||||
|
||||
namespace SJZY.Track.Application.EventHandlers;
|
||||
|
||||
public class CAPFilter : SubscribeFilter
|
||||
{
|
||||
const string _ERROR_CODE = "Error599";
|
||||
|
||||
/// <summary>
|
||||
/// 执行前
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
/// <returns></returns>
|
||||
public override Task OnSubscribeExecutingAsync(ExecutingContext context)
|
||||
{
|
||||
var argumentJsonStr = context.Arguments.ToJson();
|
||||
|
||||
context.DeliverMessage.Headers["sjzy-receive-time"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff");
|
||||
context.DeliverMessage.Headers["sjzy-arguments"] = argumentJsonStr;
|
||||
|
||||
if (!string.IsNullOrEmpty(argumentJsonStr))
|
||||
{
|
||||
var hash = argumentJsonStr.GetHash();
|
||||
using (RedisHelper.Client.Lock("Filter:" + hash, 10))
|
||||
{
|
||||
var isSkip = !string.IsNullOrEmpty(RedisHelper.Client.Get($"CapExcuteFilter:{hash}"));
|
||||
if (isSkip)
|
||||
throw new BusinessException(_ERROR_CODE, $"检测到重复消费,消费参数:{argumentJsonStr}");
|
||||
|
||||
RedisHelper.Client.Set($"CapExcuteFilter:{hash}", 60 * 10,
|
||||
TimeSpan.FromHours(1).Seconds); // 1h内不允许一模一样的参数重复消费
|
||||
}
|
||||
}
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 执行后
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
/// <returns></returns>
|
||||
public override Task OnSubscribeExecutedAsync(ExecutedContext context)
|
||||
{
|
||||
context.DeliverMessage.Headers.TryGetValue("sjzy-receive-time", out var receiveTime);
|
||||
context.DeliverMessage.Headers.TryGetValue("cap-msg-name", out var receiveName);
|
||||
context.DeliverMessage.Headers.TryGetValue("sjzy-arguments", out var arguments);
|
||||
context.DeliverMessage.Headers.TryGetValue("cap-msg-id", out var messageId);
|
||||
|
||||
BuildLog(receiveTime, receiveName, arguments, false, messageId);
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 消费异常事件
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
/// <returns></returns>
|
||||
public override Task OnSubscribeExceptionAsync(ExceptionContext context)
|
||||
{
|
||||
context.ExceptionHandled = true;
|
||||
context.DeliverMessage.Headers.TryGetValue("cap-msg-id", out var messageId);
|
||||
|
||||
if (context.Exception is BusinessException ex && ex.Code == _ERROR_CODE)
|
||||
LogHelper.Warn(ex.ToString());
|
||||
else
|
||||
LogHelper.Error($"cap-msg-id:{messageId}\n{context.Exception}");
|
||||
|
||||
|
||||
context.DeliverMessage.Headers.TryGetValue("sjzy-receive-time", out var receiveTime);
|
||||
context.DeliverMessage.Headers.TryGetValue("cap-msg-name", out var receiveName);
|
||||
context.DeliverMessage.Headers.TryGetValue("sjzy-arguments", out var arguments);
|
||||
|
||||
BuildLog(receiveTime, receiveName, arguments, true, messageId);
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
|
||||
private void BuildLog(string receiveTime, string receiveName, string arguments, bool isFromExecptionFliter,
|
||||
string messageId)
|
||||
{
|
||||
var parsedDate = DateTime.ParseExact(receiveTime, "yyyy-MM-dd HH:mm:ss fff", CultureInfo.InvariantCulture);
|
||||
var useTime = DateTime.Now - parsedDate;
|
||||
|
||||
if (useTime.Minutes > 20)
|
||||
{
|
||||
var log = $@"
|
||||
|-消息编号:{messageId}
|
||||
|-消费者名:{receiveName}
|
||||
|-跳过执行:{(isFromExecptionFliter ? "是" : "否")}
|
||||
|-执行时间:{receiveTime}
|
||||
|-消费耗时:{useTime.Milliseconds}毫秒
|
||||
|-请求参数:{arguments}";
|
||||
LogHelper.Error(log);
|
||||
}
|
||||
else
|
||||
{
|
||||
//LogHelper.Info(log);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,33 +1,39 @@
|
||||
using DotNetCore.CAP;
|
||||
using SJZY.Track.Application.Contract.Events;
|
||||
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
||||
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
||||
using SJZY.Track.Domain.Consts;
|
||||
using Volo.Abp.DependencyInjection;
|
||||
|
||||
namespace SJZY.Track.Application.EventHandlers;
|
||||
|
||||
public class TrackUpsertAfterUpdateOrderEventHandler : ITransientDependency, ICapSubscribe
|
||||
public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICapSubscribe
|
||||
{
|
||||
private readonly IOrderRepository _orderRepository;
|
||||
private readonly ITrackDetailsRepository _trackDetailsRepository;
|
||||
|
||||
public TrackUpsertAfterUpdateOrderEventHandler(IOrderRepository orderRepository)
|
||||
public TrackChangeAfterUpdateOrderEventHandler(IOrderRepository orderRepository,
|
||||
ITrackDetailsRepository trackDetailsRepository)
|
||||
{
|
||||
_orderRepository = orderRepository;
|
||||
_trackDetailsRepository = trackDetailsRepository;
|
||||
}
|
||||
|
||||
[CapSubscribe(GlobalConst.TrackUpsertAfterUpdateOrderSubscribe)]
|
||||
public async Task ConsumerAsync(TrackUpsertAfterUpdateOrderEvent @event)
|
||||
[CapSubscribe(GlobalConst.TrackChangeAfterUpdateOrderSubscribe)]
|
||||
public async Task ConsumerAsync(TrackChangeAfterUpdateOrderEvent @event)
|
||||
{
|
||||
var order = await _orderRepository.GetFirstAsync(x => x.Id == @event.OrderId);
|
||||
if (order == default) return;
|
||||
|
||||
if (@event.IsDelete)
|
||||
{
|
||||
if (@event.TrackTime == default)
|
||||
var track = await _trackDetailsRepository.GetLatestAsync(@event.OrderId);
|
||||
|
||||
// 删除全部轨迹导致的重置行为
|
||||
if (track == default)
|
||||
{
|
||||
if (order.LatestTrackTime == null) return;
|
||||
|
||||
// 删除全部轨迹导致的重置行为
|
||||
// tips:订单是支持从已完成态到未完成态的
|
||||
order.ResetTrackInfo();
|
||||
|
||||
@ -37,14 +43,14 @@ public class TrackUpsertAfterUpdateOrderEventHandler : ITransientDependency, ICa
|
||||
}
|
||||
|
||||
// 删除引发的回退更新
|
||||
if (order.LatestTrackTime != null &&
|
||||
@event.TrackTime.Subtract(TimeSpan.FromHours(@event.TrackTimeZone)) ==
|
||||
order.LatestTrackTime.Value.Subtract(TimeSpan.FromHours(order.LatestTrackTimeZone ?? 0)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
order.IsCompleted = track.IsCompleted;
|
||||
order.LatestTrackContent = track.TrackContent;
|
||||
order.LatestTrackEnContent = track.TrackEnContent;
|
||||
order.LatestTrackPlace = track.TrackPlace;
|
||||
order.LatestTrackTime = track.TrackTime;
|
||||
order.LatestTrackTimeZone = track.TrackTimeZone;
|
||||
}
|
||||
else // upsert引发的更新
|
||||
else
|
||||
{
|
||||
if (order.LatestTrackTime != null &&
|
||||
@event.TrackTime.Subtract(TimeSpan.FromHours(@event.TrackTimeZone)) <
|
||||
@ -52,14 +58,15 @@ public class TrackUpsertAfterUpdateOrderEventHandler : ITransientDependency, ICa
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
order.IsCompleted = @event.IsCompleted;
|
||||
order.LatestTrackContent = @event.TrackContent;
|
||||
order.LatestTrackEnContent = @event.TrackEnContent;
|
||||
order.LatestTrackPlace = @event.TrackPlace;
|
||||
order.LatestTrackTime = @event.TrackTime;
|
||||
order.LatestTrackTimeZone = @event.TrackTimeZone;
|
||||
// upsert引发的更新
|
||||
order.IsCompleted = @event.IsCompleted;
|
||||
order.LatestTrackContent = @event.TrackContent;
|
||||
order.LatestTrackEnContent = @event.TrackEnContent;
|
||||
order.LatestTrackPlace = @event.TrackPlace;
|
||||
order.LatestTrackTime = @event.TrackTime;
|
||||
order.LatestTrackTimeZone = @event.TrackTimeZone;
|
||||
}
|
||||
|
||||
await _orderRepository.UpdateColumnAsync(order, x => new
|
||||
{
|
||||
@ -1,5 +1,6 @@
|
||||
using DotNetCore.CAP;
|
||||
using SJZY.Expand.ABP.Core.Logger;
|
||||
using SJZY.Expand.ABP.Core.PublicMethords;
|
||||
using SJZY.Track.Application.Contract.Events;
|
||||
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
||||
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
||||
@ -13,19 +14,19 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
|
||||
{
|
||||
private readonly IOrderRepository _orderRepository;
|
||||
private readonly IProvideQueries _provideQueries;
|
||||
private readonly ITrackDetailsRepository _trackDetailsRepository;
|
||||
private readonly ICapPublisher _capPublisher;
|
||||
private readonly ITrackDetailsRepository _trackDetailsRepository;
|
||||
|
||||
public TrackDeleteEventHandler(IProvideQueries provideQueries, ITrackDetailsRepository trackDetailsRepository,
|
||||
IOrderRepository orderRepository, ICapPublisher capPublisher)
|
||||
public TrackDeleteEventHandler(IProvideQueries provideQueries,
|
||||
IOrderRepository orderRepository, ICapPublisher capPublisher, ITrackDetailsRepository trackDetailsRepository)
|
||||
{
|
||||
_provideQueries = provideQueries;
|
||||
_trackDetailsRepository = trackDetailsRepository;
|
||||
_orderRepository = orderRepository;
|
||||
_capPublisher = capPublisher;
|
||||
_trackDetailsRepository = trackDetailsRepository;
|
||||
}
|
||||
|
||||
[CapSubscribe(GlobalConst.TrackDeleteSubscribe)]
|
||||
[CapSubscribe(GlobalConst.TrackDeleteSubscribe, Group = GlobalConst.TrackDeleteSubscribe)]
|
||||
public async Task ConsumerAsync(TrackDeleteEvent @event)
|
||||
{
|
||||
if (@event.Visited.Contains(@event.OrderId))
|
||||
@ -34,8 +35,6 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
|
||||
return;
|
||||
}
|
||||
|
||||
@event.Visited.Add(@event.OrderId);
|
||||
|
||||
// 不同子系统需要做内容映射
|
||||
if (@event.UpSubSystemId != 0 && @event.UpSubSystemId != @event.SubSystemId)
|
||||
{
|
||||
@ -59,41 +58,27 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
|
||||
// 删除轨迹
|
||||
var isOk = await _trackDetailsRepository.DeleteTrackAsync(@event.OrderId, @event.TrackCodes);
|
||||
|
||||
// 触发订单主表更新事件
|
||||
if (isOk)
|
||||
{
|
||||
var track = await _trackDetailsRepository.GetLatestAsync(@event.OrderId);
|
||||
var updateOrderEvent = track == default
|
||||
? new TrackUpsertAfterUpdateOrderEvent
|
||||
// 触发订单主表更新事件
|
||||
await _capPublisher.PublishDelayAsync(TimeSpan.FromSeconds(3),
|
||||
GlobalConst.TrackChangeAfterUpdateOrderSubscribe,
|
||||
new TrackChangeAfterUpdateOrderEvent
|
||||
{
|
||||
OrderId = @event.OrderId,
|
||||
IsDelete = true
|
||||
}
|
||||
: new TrackUpsertAfterUpdateOrderEvent
|
||||
{
|
||||
OrderId = @event.OrderId,
|
||||
IsCompleted = track.IsCompleted,
|
||||
TrackContent = track.TrackContent,
|
||||
TrackEnContent = track.TrackEnContent,
|
||||
TrackPlace = track.TrackPlace,
|
||||
TrackTime = track.TrackTime,
|
||||
TrackTimeZone = track.TrackTimeZone,
|
||||
IsDelete = true
|
||||
};
|
||||
await _capPublisher.PublishAsync(GlobalConst.TrackUpsertAfterUpdateOrderSubscribe, updateOrderEvent);
|
||||
});
|
||||
}
|
||||
|
||||
// 根据订单关联关系异步向下刷
|
||||
var linkedOrders = await _orderRepository.GetLinkedOrdersAsync(@event.OrderId);
|
||||
foreach (var linkedOrder in linkedOrders)
|
||||
{
|
||||
var nextEvent = new TrackDeleteEvent
|
||||
{
|
||||
OrderId = linkedOrder.OrderId,
|
||||
TrackCodes = @event.TrackCodes,
|
||||
SubSystemId = linkedOrder.SubSystemId,
|
||||
UpSubSystemId = @event.SubSystemId
|
||||
};
|
||||
var nextEvent = @event.DeepCopy();
|
||||
nextEvent.Visited.Add(@event.OrderId);
|
||||
nextEvent.TrackCodes = @event.TrackCodes;
|
||||
nextEvent.SubSystemId = linkedOrder.SubSystemId;
|
||||
nextEvent.UpSubSystemId = @event.SubSystemId;
|
||||
|
||||
await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, nextEvent);
|
||||
}
|
||||
|
||||
@ -22,7 +22,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
||||
_capPublisher = capPublisher;
|
||||
}
|
||||
|
||||
[CapSubscribe(GlobalConst.TrackPushSubscribe)]
|
||||
[CapSubscribe(GlobalConst.TrackPushSubscribe, Group = GlobalConst.TrackPushSubscribe)]
|
||||
public async Task ConsumerAsync(TrackPushEvent @event)
|
||||
{
|
||||
InterfaceRelayUnifyResultDto res = null!;
|
||||
@ -44,13 +44,16 @@ 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}",
|
||||
RequestId = res.RequestId,
|
||||
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,
|
||||
|
||||
@ -95,6 +95,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
|
||||
TrackUpsertEvent @event)
|
||||
{
|
||||
var trackUpsertEvent = @event.DeepCopy();
|
||||
trackUpsertEvent.OriginTrackData = JsonConvert.SerializeObject(trackToken);
|
||||
var paramConfig = paramWithContentConfig.ParamConfig;
|
||||
var contentConfigs = paramWithContentConfig.ContentConfigs;
|
||||
TrackPullContentConfigDto? matchedContentConfig = null;
|
||||
@ -123,6 +124,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
|
||||
var trackContent = trackToken[paramConfig.TrackContentName]?.Value<string>();
|
||||
if (!trackContent.IsNullOrWhiteSpace())
|
||||
{
|
||||
trackUpsertEvent.OriginTrackContent = trackContent;
|
||||
Debug.Assert(trackContent != null, nameof(trackContent) + " != null");
|
||||
matchedContentConfig = contentConfigs.FirstOrDefault(x => x.TrackContentValue == trackContent);
|
||||
|
||||
@ -165,7 +167,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
|
||||
if (trackPlace.IsNullOrWhiteSpace())
|
||||
{
|
||||
Expression<Func<OrderEntity, string?>> resultExpression =
|
||||
(TrackLocationValue?)matchedContentConfig.TrackPlaceValue switch
|
||||
(TrackLocationValue?)matchedContentConfig?.TrackPlaceValue switch
|
||||
{
|
||||
TrackLocationValue.ArrivalPort => x => x.ArrivalPort,
|
||||
TrackLocationValue.ArriveCity => x => x.ArrivalCity,
|
||||
@ -189,10 +191,10 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
|
||||
: trackToken[paramConfig.TrackTimeZoneName]?.Value<float>();
|
||||
|
||||
// 新增/更新轨迹
|
||||
trackUpsertEvent.TrackCode = matchedContentConfig.TrackContentCode;
|
||||
trackUpsertEvent.TrackPlace = trackPlace ?? "CN";
|
||||
trackUpsertEvent.TrackCode = matchedContentConfig?.TrackContentCode ?? GlobalConst.EmptyString;
|
||||
trackUpsertEvent.TrackPlace = trackPlace ?? GlobalConst.EmptyString;
|
||||
trackUpsertEvent.TrackTime = trackTime ?? DateTime.Now;
|
||||
trackUpsertEvent.TrackTimeZone = trackTimeZone ?? matchedContentConfig.TrackTimeZoneValue ?? 8;
|
||||
trackUpsertEvent.TrackTimeZone = trackTimeZone ?? matchedContentConfig?.TrackTimeZoneValue ?? 8;
|
||||
await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, trackUpsertEvent);
|
||||
}
|
||||
}
|
||||
@ -1,15 +1,13 @@
|
||||
using System.Diagnostics;
|
||||
using DotNetCore.CAP;
|
||||
using DotNetCore.CAP;
|
||||
using SJZY.Expand.ABP.Core.Logger;
|
||||
using SJZY.Expand.ABP.Core.PublicMethords;
|
||||
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
||||
using SJZY.Track.Application.Contract.Dtos.TrackPush;
|
||||
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.Consts;
|
||||
using SJZY.Track.Domain.Queries;
|
||||
using SJZY.UserCenter.HttpApi.Services;
|
||||
using Volo.Abp.DependencyInjection;
|
||||
|
||||
namespace SJZY.Track.Application.EventHandlers;
|
||||
@ -33,7 +31,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
||||
_trackPushCacheService = trackPushCacheService;
|
||||
}
|
||||
|
||||
[CapSubscribe(GlobalConst.TrackUpsertSubscribe)]
|
||||
[CapSubscribe(GlobalConst.TrackUpsertSubscribe, Group = GlobalConst.TrackUpsertSubscribe)]
|
||||
public async Task ConsumerAsync(TrackUpsertEvent @event)
|
||||
{
|
||||
if (@event.Visited.Contains(@event.OrderId))
|
||||
@ -42,8 +40,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
||||
return;
|
||||
}
|
||||
|
||||
@event.Visited.Add(@event.OrderId);
|
||||
|
||||
var isUnProcessed = false;
|
||||
// 不同子系统需要做内容映射
|
||||
if (@event.UpSubSystemId != 0 && @event.UpSubSystemId != @event.SubSystemId)
|
||||
{
|
||||
@ -60,18 +57,29 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
||||
@event.TrackCode = mapCode;
|
||||
}
|
||||
|
||||
var track = await _trackDetailsRepository.GetFirstOrDefaultAsync(@event.OrderId, @event.TrackCode);
|
||||
var track = @event.TrackCode == GlobalConst.EmptyString
|
||||
? await _trackDetailsRepository.GetFirstOrDefaultAsync(@event.OrderId, @event.TrackTime)
|
||||
: await _trackDetailsRepository.GetFirstOrDefaultAsync(@event.OrderId, @event.TrackCode);
|
||||
|
||||
if (@event.TrackCode == GlobalConst.EmptyString && track != null) return; // 无法映射的轨迹只做新增
|
||||
|
||||
if (@event.IsAdd != null) // 手动操作需要做区分
|
||||
{
|
||||
if (track == null && !@event.IsAdd!.Value) return; // 不存在不让改
|
||||
if (track != null && @event.IsAdd!.Value) return; // 存在不让创建
|
||||
}
|
||||
|
||||
// step1、upsert es轨迹
|
||||
await UpsertTrackAsync(track, @event);
|
||||
Debug.Assert(track != null, nameof(track) + " != null");
|
||||
track = await UpsertTrackAsync(track, @event);
|
||||
|
||||
if (track == null || @event.TrackCode == GlobalConst.EmptyString) return; // 模板没配该轨迹代码,不再继续
|
||||
|
||||
// step2、触发轨迹推送事件(异步)
|
||||
await HandleTrackPushAsync(@event, track);
|
||||
|
||||
// step3、触发订单主表更新事件(异步)
|
||||
await _capPublisher.PublishAsync(GlobalConst.TrackUpsertAfterUpdateOrderSubscribe,
|
||||
new TrackUpsertAfterUpdateOrderEvent
|
||||
await _capPublisher.PublishAsync(GlobalConst.TrackChangeAfterUpdateOrderSubscribe,
|
||||
new TrackChangeAfterUpdateOrderEvent
|
||||
{
|
||||
OrderId = track.OrderId,
|
||||
IsCompleted = track.IsCompleted,
|
||||
@ -88,6 +96,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
||||
foreach (var linkedOrder in linkedOrders)
|
||||
{
|
||||
var nextEvent = @event.DeepCopy();
|
||||
nextEvent.Visited.Add(@event.OrderId);
|
||||
nextEvent.OrderId = linkedOrder.OrderId;
|
||||
nextEvent.OrderType = linkedOrder.OrderType;
|
||||
nextEvent.OrderNo = linkedOrder.OrderNo;
|
||||
@ -104,49 +113,75 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
||||
/// </summary>
|
||||
/// <param name="track"></param>
|
||||
/// <param name="event"></param>
|
||||
private async Task UpsertTrackAsync(TrackDetailsIndex? track, TrackUpsertEvent @event)
|
||||
private async Task<TrackDetailsIndex?> UpsertTrackAsync(TrackDetailsIndex? track, TrackUpsertEvent @event)
|
||||
{
|
||||
if (track == default)
|
||||
{
|
||||
//todo:可以优化
|
||||
// 根据轨迹code在订单模板内容中寻找匹配的
|
||||
var trackContent = await _provideQueries.MatchTrackContentAsync(@event.OrderId, @event.TrackCode);
|
||||
if (trackContent == default)
|
||||
{
|
||||
// 订单所绑定的模板,没有一条内容可以匹配发生的轨迹
|
||||
return;
|
||||
}
|
||||
|
||||
track = new TrackDetailsIndex
|
||||
{
|
||||
IndexName = $"{GlobalConst.TrackIndex}-{DateTime.Now:yyyy.MM.dd}",
|
||||
OrderId = @event.OrderId,
|
||||
OrderNo = @event.OrderNo,
|
||||
OrderType = @event.OrderType,
|
||||
TrackStatus = trackContent.Status,
|
||||
TrackCode = @event.TrackCode,
|
||||
TrackContent = trackContent.Content,
|
||||
TrackContentId = trackContent.Id,
|
||||
IsCompleted = trackContent.IsCompleted,
|
||||
TrackEnContent = trackContent.EnContent,
|
||||
TrackPlace = @event.TrackPlace,
|
||||
TrackTime = @event.TrackTime!.Value,
|
||||
TrackTimeZone = @event.TrackTimeZone!.Value,
|
||||
IsCanDelete = trackContent.IsCanDelete,
|
||||
CreateUser = CurrentUserRequest.CurrentUser.Name,
|
||||
TrackTime = @event.TrackTime,
|
||||
TrackTimeZone = @event.TrackTimeZone,
|
||||
IsCanDelete = false,
|
||||
OriginTrackContent = @event.OriginTrackContent,
|
||||
OriginTrackData = @event.OriginTrackData,
|
||||
CreateUser = @event.OperationMan,
|
||||
CreateTime = DateTime.Now
|
||||
};
|
||||
|
||||
// tips:刷新到无法匹配内容的轨迹引起的插入
|
||||
if (@event.TrackCode == GlobalConst.EmptyString)
|
||||
{
|
||||
track.TrackStatus = GlobalConst.EmptyString;
|
||||
track.TrackContent = GlobalConst.EmptyString;
|
||||
track.TrackContentId = 0;
|
||||
track.IsCompleted = false;
|
||||
track.TrackEnContent = GlobalConst.EmptyString;
|
||||
}
|
||||
else
|
||||
{
|
||||
//todo:可以优化
|
||||
// 根据轨迹code在订单模板内容中寻找匹配的
|
||||
var trackContent = await _provideQueries.MatchTrackContentAsync(@event.OrderId, @event.TrackCode);
|
||||
if (trackContent == default)
|
||||
{
|
||||
// 订单所绑定的模板,没有一条内容可以匹配发生的轨迹
|
||||
return null;
|
||||
}
|
||||
|
||||
track = new TrackDetailsIndex
|
||||
{
|
||||
TrackStatus = trackContent.Status,
|
||||
TrackContent = trackContent.Content,
|
||||
TrackContentId = trackContent.Id,
|
||||
IsCompleted = trackContent.IsCompleted,
|
||||
TrackEnContent = trackContent.EnContent,
|
||||
IsCanDelete = trackContent.IsCanDelete
|
||||
};
|
||||
|
||||
track.ZeroTrackTime = track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// tips:刷新到无法匹配内容的轨迹 相同的发生时间不做更新处理
|
||||
if (@event.TrackCode == GlobalConst.EmptyString) return track;
|
||||
|
||||
track.TrackPlace = @event.TrackPlace;
|
||||
track.TrackTime = @event.TrackTime!.Value;
|
||||
track.TrackTimeZone = @event.TrackTimeZone!.Value;
|
||||
track.UpdateUser = CurrentUserRequest.CurrentUser.Name;
|
||||
track.TrackTime = @event.TrackTime;
|
||||
track.TrackTimeZone = @event.TrackTimeZone;
|
||||
track.UpdateUser = @event.OperationMan ?? "系统";
|
||||
track.UpdateTime = DateTime.Now;
|
||||
}
|
||||
|
||||
await _trackDetailsRepository.UpsertAsync(track);
|
||||
|
||||
return track;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -163,7 +198,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
||||
{
|
||||
config = await _trackPushCacheService.GetPushContentConfigAsync(
|
||||
@event.SubSystemId, @event.CustomId, track.TrackContentId);
|
||||
if (!config.IsCanUpdate) return;
|
||||
if (config == null || !config.IsCanUpdate) return;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -186,6 +221,8 @@ 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,
|
||||
TrackCode = track.TrackCode,
|
||||
|
||||
@ -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,11 +98,14 @@ 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)));
|
||||
}
|
||||
|
||||
await RedisHelper.Client.SetExAsync(redisKey, config.PullInterval * 60, 1);
|
||||
if (config.PullInterval < 60) config.PullInterval = 60;
|
||||
await RedisHelper.Client.SetExAsync(redisKey, config.PullInterval * 60, orders.Count);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -1,9 +1,11 @@
|
||||
using DotNetCore.CAP;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
||||
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;
|
||||
@ -21,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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -46,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)
|
||||
@ -74,10 +79,14 @@ 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,
|
||||
TrackCode = track.TrackCode,
|
||||
@ -107,17 +116,34 @@ public class TrackPushService : ApplicationService
|
||||
/// 定时任务推送预警(》12小时没有推送的)
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[AllowAnonymous]
|
||||
[HttpPost("Track/PushWarnForTask")]
|
||||
public async Task<string> 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)}个订单置为预警";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取轨迹推送记录
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
/// <param name="input"></param>
|
||||
[HttpGet("Track/GetTrackPushRecords")]
|
||||
public async Task<List<TrackPushRecordIndex>> GetTrackPushRecordsAsync(OrderNoInfo input)
|
||||
{
|
||||
return await _trackPushRecordsRepository.GetTrackPushRecordsAsync(input.OrderNo, input.OrderType);
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -78,7 +80,7 @@ public partial class TrackService : ApplicationService, ITrackService
|
||||
var orders = await _orderRepository.GetListAsync(x =>
|
||||
x.OrderType == input.OrderType && input.OrderNos.Contains(x.OrderNo), x => new
|
||||
{
|
||||
x.Id, x.OrderNo, x.SubSystemId, x.LatestPushTrackContentId, x.CustomId
|
||||
x.Id, x.OrderNo, x.SubSystemId, x.LatestPushTrackContentId, x.CustomId, x.IsCompleted
|
||||
});
|
||||
|
||||
foreach (var order in orders)
|
||||
@ -86,16 +88,19 @@ public partial class TrackService : ApplicationService, ITrackService
|
||||
// 新增/更新轨迹
|
||||
var @event = new TrackUpsertEvent
|
||||
{
|
||||
IsAdd = input.IsAdd,
|
||||
TrackCode = input.TrackCode,
|
||||
TrackPlace = input.TrackPlace,
|
||||
TrackTime = input.TrackTime,
|
||||
TrackTimeZone = input.TrackTimeZone,
|
||||
TrackTime = input.TrackTime!.Value,
|
||||
TrackTimeZone = input.TrackTimeZone!.Value,
|
||||
OrderType = input.OrderType,
|
||||
OrderNo = order.OrderNo,
|
||||
OrderId = order.Id,
|
||||
SubSystemId = order.SubSystemId,
|
||||
LatestPushTrackContentId = order.LatestPushTrackContentId,
|
||||
CustomId = order.CustomId
|
||||
CustomId = order.CustomId,
|
||||
IsCompleted = order.IsCompleted,
|
||||
OperationMan = CurrentUserRequest.CurrentUser.Name
|
||||
};
|
||||
await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event);
|
||||
}
|
||||
@ -135,6 +140,7 @@ public partial class TrackService : ApplicationService, ITrackService
|
||||
OrderId = order.Id,
|
||||
TrackCodes = codes.Select(x => x.TrackCode).ToList(),
|
||||
SubSystemId = order.SubSystemId,
|
||||
OperationMan = CurrentUserRequest.CurrentUser.Name
|
||||
};
|
||||
await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, @event);
|
||||
|
||||
@ -174,6 +180,7 @@ public partial class TrackService : ApplicationService, ITrackService
|
||||
OrderId = group.Key,
|
||||
TrackCodes = codes.Select(x => x.TrackCode).ToList(),
|
||||
SubSystemId = orders.First(x => x.Id == group.Key).SubSystemId,
|
||||
OperationMan = CurrentUserRequest.CurrentUser.Name
|
||||
};
|
||||
await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, @event);
|
||||
}
|
||||
|
||||
@ -64,7 +64,7 @@ namespace SJZY.Track.Application.Services.TrackContents
|
||||
var detailInfo = await _trackContentRepository.GetDetailAsync(id);
|
||||
if (detailInfo == null)
|
||||
{
|
||||
return new UnifyResultDto<GetTrackContentDetailDto>(false, null, "未查询到轨迹状态");
|
||||
return new UnifyResultDto<GetTrackContentDetailDto>(false, null!, "未查询到轨迹状态");
|
||||
}
|
||||
|
||||
var dto = ObjectMapper.Map<GetTrackContentDetailVO, GetTrackContentDetailDto>(detailInfo);
|
||||
@ -101,18 +101,18 @@ namespace SJZY.Track.Application.Services.TrackContents
|
||||
if (trackContentEntitys.Any())
|
||||
{
|
||||
//throw new BusinessException(message: _stringLocalizer["TrackContentExist"]);
|
||||
var codes = trackContentEntitys.FirstOrDefault(a => a.Code==input.Code);
|
||||
if (codes!=null)
|
||||
var codes = trackContentEntitys.FirstOrDefault(a => a.Code == input.Code);
|
||||
if (codes != null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下轨迹代码已存在");
|
||||
}
|
||||
var contents = trackContentEntitys.FirstOrDefault(a => a.Content==input.Content);
|
||||
if (contents!=null)
|
||||
var contents = trackContentEntitys.FirstOrDefault(a => a.Content == input.Content);
|
||||
if (contents != null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下轨迹内容已存在");
|
||||
}
|
||||
var contentEns = trackContentEntitys.FirstOrDefault(a => a.EnContent==input.EnContent);
|
||||
if (contentEns!=null)
|
||||
var contentEns = trackContentEntitys.FirstOrDefault(a => a.EnContent == input.EnContent);
|
||||
if (contentEns != null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下轨迹内容英文已存在");
|
||||
}
|
||||
@ -138,18 +138,18 @@ namespace SJZY.Track.Application.Services.TrackContents
|
||||
{
|
||||
//throw new BusinessException(message: _stringLocalizer["TrackContentExist"]);
|
||||
//throw new BusinessException(message: "当前子系统下,轨迹代码或轨迹内容或轨迹内容英文存在");
|
||||
var codes = trackContentEntitys.FirstOrDefault(a => a.Code==input.Code);
|
||||
if (codes!=null)
|
||||
var codes = trackContentEntitys.FirstOrDefault(a => a.Code == input.Code);
|
||||
if (codes != null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下轨迹代码已存在");
|
||||
}
|
||||
var contents = trackContentEntitys.FirstOrDefault(a => a.Content==input.Content);
|
||||
if (contents!=null)
|
||||
var contents = trackContentEntitys.FirstOrDefault(a => a.Content == input.Content);
|
||||
if (contents != null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下轨迹内容已存在");
|
||||
}
|
||||
var contentEns = trackContentEntitys.FirstOrDefault(a => a.EnContent==input.EnContent);
|
||||
if (contentEns!=null)
|
||||
var contentEns = trackContentEntitys.FirstOrDefault(a => a.EnContent == input.EnContent);
|
||||
if (contentEns != null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下轨迹内容英文已存在");
|
||||
}
|
||||
|
||||
@ -1,9 +1,10 @@
|
||||
using System.Linq.Expressions;
|
||||
using SJZY.Expand.ABP.Core;
|
||||
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
||||
using SJZY.Track.Application.Contract.Dtos.TrackPush;
|
||||
using SJZY.Track.Application.Contract.Services;
|
||||
using SJZY.Track.Domain.Aggregates.TrackPushAggregate;
|
||||
using SJZY.Track.Domain.Consts;
|
||||
using SJZY.Track.Domain.Dtos.TrackPush;
|
||||
|
||||
namespace SJZY.Track.Application.Services.TrackPush;
|
||||
|
||||
@ -28,12 +29,12 @@ public class TrackPushCacheService : ApplicationService, ITrackPushCacheService
|
||||
}
|
||||
|
||||
[NonAction]
|
||||
public async Task<TrackPushContentConfigDto> GetPushContentConfigAsync(int subSystemId, int customId,
|
||||
public async Task<TrackPushContentConfigDto?> GetPushContentConfigAsync(int subSystemId, int customId,
|
||||
int trackContentId)
|
||||
{
|
||||
var data = await GetPushContentConfigsAsync(subSystemId, customId);
|
||||
|
||||
return data.Single(x => x.TrackContentId == trackContentId);
|
||||
return data?.FirstOrDefault(x => x.TrackContentId == trackContentId);
|
||||
}
|
||||
|
||||
[NonAction]
|
||||
@ -74,16 +75,13 @@ public class TrackPushCacheService : ApplicationService, ITrackPushCacheService
|
||||
var trackPushConfigEntity = await _trackPushConfigRepository.GetFirstAsync(exp);
|
||||
if (trackPushConfigEntity == null) return data;
|
||||
|
||||
var trackPushContentList =
|
||||
await _trackPushConfigRepository.GetContentListAsync(x => x.TrackPushConfigId == trackPushConfigEntity.Id);
|
||||
var trackPushContentList = await _trackPushConfigRepository.GetContentListAsync(trackPushConfigEntity.Id);
|
||||
if (trackPushContentList.Count == 0) return data;
|
||||
|
||||
trackPushContentList = trackPushContentList.OrderBy(x => x.Sort).ToList();
|
||||
|
||||
data.IsAutoPush = trackPushConfigEntity.IsAutoPush;
|
||||
data.ContentConfigs =
|
||||
ObjectMapper.Map<List<TrackPushContentConfigEntity>, List<TrackPushContentConfigDto>>(trackPushContentList);
|
||||
|
||||
ObjectMapper.Map<List<TrackPushContentConfigVO>, List<TrackPushContentConfigDto>>(trackPushContentList);
|
||||
;
|
||||
await RedisHelper.Client.SetAsync(
|
||||
TrackPushContentKey(trackPushConfigEntity.SubSystemId, trackPushConfigEntity.CustomId), data);
|
||||
|
||||
|
||||
@ -6,6 +6,7 @@ using SJZY.Expand.ABP.Core.Logger;
|
||||
using SJZY.Expand.ABP.Core.PublicMethords;
|
||||
using SJZY.InterfaceRelay.Application.Contracts;
|
||||
using SJZY.Track.Application.Contract;
|
||||
using SJZY.Track.Application.EventHandlers;
|
||||
using SJZY.Track.Application.Localization;
|
||||
using SJZY.UserCenter.Contracts;
|
||||
using SJZY.UserCenter.SharedModel;
|
||||
@ -90,7 +91,7 @@ namespace SJZY.Track.Application
|
||||
{
|
||||
dashboardOptions.PathBase = System.Diagnostics.Debugger.IsAttached
|
||||
? ""
|
||||
: configuration["Swagger:JsonUrlPrefix"];
|
||||
: configuration["Swagger:JsonUrlPrefix"]!;
|
||||
});
|
||||
options.FailedThresholdCallback = faileCalback =>
|
||||
{
|
||||
@ -99,15 +100,15 @@ namespace SJZY.Track.Application
|
||||
LogHelper.Error($@"
|
||||
|-CAP失败回调事件:
|
||||
|-处理类型:{(faileCalback.MessageType == DotNetCore.CAP.Messages.MessageType.Subscribe ? "消费消息达到最大重试次数,需要开发人员介入" : "生产消息推送失败")}
|
||||
|-头部信息:{faileCalback?.Message?.Headers?.ToJson()}
|
||||
|-消息内容:{((JsonElement)faileCalback?.Message?.Value).GetRawText()}");
|
||||
|-头部信息:{faileCalback.Message.Headers.ToJson()}
|
||||
|-消息内容:{((JsonElement?)faileCalback.Message.Value)?.GetRawText()}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.Error("【严重】CAP失败回调事件发生未处理异常" + ex);
|
||||
}
|
||||
};
|
||||
});
|
||||
}).AddSubscribeFilter<CAPFilter>();
|
||||
}
|
||||
|
||||
public override void PreConfigureServices(ServiceConfigurationContext context)
|
||||
|
||||
@ -25,6 +25,11 @@ public interface IOrderRepository : IBasicRepository<OrderEntity>
|
||||
/// <returns></returns>
|
||||
Task DeleteOrderAsync(int orderId);
|
||||
|
||||
/// <summary>
|
||||
/// 获取推送预警单
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
Task<List<OrderEntity>> GetPushWarnOrdersAsync();
|
||||
|
||||
#region 订单关联
|
||||
|
||||
|
||||
@ -6,6 +6,8 @@ public interface ITrackDetailsRepository
|
||||
{
|
||||
Task<TrackDetailsIndex?> GetFirstOrDefaultAsync(int orderId, string trackCode);
|
||||
|
||||
Task<TrackDetailsIndex?> GetFirstOrDefaultAsync(int orderId, DateTime trackTime);
|
||||
|
||||
Task UpsertAsync(TrackDetailsIndex index);
|
||||
|
||||
Task<List<TrackDetailsIndex>> GetListAsync(int orderType, List<string> orderNos);
|
||||
|
||||
@ -48,15 +48,10 @@ public class TrackDetailsIndex : IdBaseIndex
|
||||
public int TrackContentId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 这条轨迹是否意味着完成(删除回退需要用到)
|
||||
/// 这条轨迹是否意味着完成
|
||||
/// </summary>
|
||||
public bool IsCompleted { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 原轨迹状态
|
||||
/// </summary>
|
||||
public string? OriginTrackStatus { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 原轨迹内容
|
||||
/// </summary>
|
||||
@ -87,6 +82,11 @@ public class TrackDetailsIndex : IdBaseIndex
|
||||
/// </summary>
|
||||
public float TrackTimeZone { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 转化后的轨迹发生时间
|
||||
/// </summary>
|
||||
public DateTime ZeroTrackTime { get; set; }
|
||||
|
||||
/// <summary>是否可删</summary>
|
||||
public bool IsCanDelete { get; set; }
|
||||
|
||||
|
||||
@ -23,11 +23,16 @@ public interface ITrackPushConfigRepository : IBasicRepository<TrackPushConfigEn
|
||||
|
||||
Task<bool> UpdateContentAsync(TrackPushContentConfigEntity updateObj);
|
||||
|
||||
Task<List<TrackPushContentConfigEntity>> GetContentListAsync(Expression<Func<TrackPushContentConfigEntity, bool>> whereExpression);
|
||||
Task<List<TrackPushContentConfigEntity>> GetContentListAsync(
|
||||
Expression<Func<TrackPushContentConfigEntity, bool>> whereExpression);
|
||||
|
||||
Task<List<TrackPushContentConfigVO>> GetContentListAsync(int configId);
|
||||
|
||||
Task<bool> UpdateContentRangeAsync(List<TrackPushContentConfigEntity> updateObjs);
|
||||
|
||||
Task<T> ContentMaxAsync<T>(Expression<Func<TrackPushContentConfigEntity, T>> columns, Expression<Func<TrackPushContentConfigEntity, bool>> whereExpression);
|
||||
Task<T> ContentMaxAsync<T>(Expression<Func<TrackPushContentConfigEntity, T>> columns,
|
||||
Expression<Func<TrackPushContentConfigEntity, bool>> whereExpression);
|
||||
|
||||
Task<bool> UpdateContentAsync(Expression<Func<TrackPushContentConfigEntity, bool>> columns, Expression<Func<TrackPushContentConfigEntity, bool>> whereExpression);
|
||||
Task<bool> UpdateContentAsync(Expression<Func<TrackPushContentConfigEntity, bool>> columns,
|
||||
Expression<Func<TrackPushContentConfigEntity, bool>> whereExpression);
|
||||
}
|
||||
@ -15,4 +15,6 @@ public interface ITrackPushRecordsRepository
|
||||
/// <param name="orderId"></param>
|
||||
/// <returns></returns>
|
||||
Task<List<TrackPushRecordIndex>> GetTrackPushRecordsAsync(int orderId);
|
||||
|
||||
Task<List<TrackPushRecordIndex>> GetTrackPushRecordsAsync(string inputOrderNo, int inputOrderType);
|
||||
}
|
||||
@ -17,6 +17,16 @@ public class TrackPushRecordIndex : IdBaseIndex
|
||||
/// </summary>
|
||||
public int OrderId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 订单号
|
||||
/// </summary>
|
||||
public string OrderNo { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 订单类型(主数据枚举TrackOrderType)
|
||||
/// </summary>
|
||||
public int OrderType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 接口通请求Id
|
||||
/// </summary>
|
||||
|
||||
@ -23,9 +23,9 @@ public partial class GlobalConst
|
||||
public const string TrackPushSubscribe = "SJZY.Track.TrackPush";
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹新增/更新后触发更新订单主表
|
||||
/// 轨迹新增/更新/删除后触发更新订单主表
|
||||
/// </summary>
|
||||
public const string TrackUpsertAfterUpdateOrderSubscribe = "SJZY.Track.TrackUpsertAfterUpdateOrder";
|
||||
public const string TrackChangeAfterUpdateOrderSubscribe = "SJZY.Track.TrackChangeAfterUpdateOrder";
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹推送后触发更新订单主表
|
||||
|
||||
6
src/SJZY.Track.Domain/Consts/GlobalConst.cs
Normal file
6
src/SJZY.Track.Domain/Consts/GlobalConst.cs
Normal file
@ -0,0 +1,6 @@
|
||||
namespace SJZY.Track.Domain.Consts;
|
||||
|
||||
public partial class GlobalConst
|
||||
{
|
||||
public const string EmptyString = "--";
|
||||
}
|
||||
@ -0,0 +1,59 @@
|
||||
namespace SJZY.Track.Domain.Dtos.TrackPush;
|
||||
|
||||
public class TrackPushContentConfigVO
|
||||
{
|
||||
/// <summary>
|
||||
/// 是否自动推送
|
||||
/// </summary>
|
||||
public bool IsAutoPush { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否支持更新
|
||||
/// </summary>
|
||||
public bool IsCanUpdate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 服务商code
|
||||
/// </summary>
|
||||
public string ServiceProviderCode { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 扩展字段参数值
|
||||
/// </summary>
|
||||
public string? ExpandFieldsValue { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 推送单号类型(主数据枚举TrackOrderType)
|
||||
/// </summary>
|
||||
public int OrderType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹代码参数值
|
||||
/// </summary>
|
||||
public string? TrackContentCodeValue { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹内容id
|
||||
/// </summary>
|
||||
public int TrackContentId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹内容参数值
|
||||
/// </summary>
|
||||
public string? TrackContentValue { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹内容英文参数值
|
||||
/// </summary>
|
||||
public string? TrackEnContentValue { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹状态参数值
|
||||
/// </summary>
|
||||
public string? TrackStatusValue { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹时区GMT
|
||||
/// </summary>
|
||||
public double? TrackTimeZone { get; set; }
|
||||
}
|
||||
@ -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
|
||||
{
|
||||
|
||||
@ -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<OrderEntity>, IOrderRepository, I
|
||||
tran.Complete();
|
||||
}
|
||||
|
||||
public async Task<List<OrderEntity>> GetPushWarnOrdersAsync()
|
||||
{
|
||||
var errorType = (int)TrackProblemType.Error;
|
||||
|
||||
return await Context.Queryable<TrackPushConfigEntity>()
|
||||
.LeftJoin<OrderEntity>((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<List<LinkedOrderVO>> GetLinkedOrdersAsync(int orderId)
|
||||
|
||||
@ -32,6 +32,25 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
|
||||
return res;
|
||||
}
|
||||
|
||||
public async Task<TrackDetailsIndex?> GetFirstOrDefaultAsync(int orderId, DateTime trackTime)
|
||||
{
|
||||
var r = await Context.SearchAsync<TrackDetailsIndex>(s => s
|
||||
.Source()
|
||||
.Query(q =>
|
||||
q.Term(f => f.OrderId, orderId)
|
||||
&& q.Term(f => f.TrackTime, trackTime)
|
||||
)
|
||||
);
|
||||
|
||||
var res = r.Documents.FirstOrDefault();
|
||||
if (res != default && r.Hits.FirstOrDefault() != default)
|
||||
{
|
||||
res.Id = r.Hits.FirstOrDefault()!.Id;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
public async Task UpsertAsync(TrackDetailsIndex index)
|
||||
{
|
||||
if (index.Id.IsNullOrWhiteSpace())
|
||||
@ -93,10 +112,12 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
|
||||
|
||||
var data = await Context.SearchAsync<TrackDetailsIndex>(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)
|
||||
@ -165,7 +186,7 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
|
||||
q.Term(t => t.OrderId, orderId)
|
||||
&& q.Term(t => t.IsCanDelete, true)
|
||||
&& q.Terms(t => t.Field(f => f.TrackCode.Suffix("keyword")).Terms(trackCodes)))
|
||||
.Refresh() // 可选:立即刷新索引使更改立即可见
|
||||
//.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见
|
||||
);
|
||||
|
||||
if (!r.IsValid)
|
||||
|
||||
@ -1,14 +1,13 @@
|
||||
using SJZY.Expand.ABP.Core.PublicMethords;
|
||||
using System.Linq.Expressions;
|
||||
using SJZY.Expand.ABP.Core.PublicMethords;
|
||||
using SJZY.Track.Domain.Aggregates.TrackContentAggregate;
|
||||
using SJZY.Track.Domain.Aggregates.TrackPullAggregate;
|
||||
using SJZY.Track.Domain.Aggregates.TrackPushAggregate;
|
||||
using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate;
|
||||
using SJZY.Track.Domain.Dtos.Common;
|
||||
using SJZY.Track.Domain.Dtos.TrackPush;
|
||||
using SJZY.Track.Domain.Enums;
|
||||
using SJZY.Track.Domain.VEntities;
|
||||
using SJZY.Track.Repository.VData.Entitys;
|
||||
using System.Linq.Expressions;
|
||||
|
||||
namespace SJZY.Track.Repository.Repositories;
|
||||
|
||||
@ -19,11 +18,14 @@ public class TrackPushConfigRepository : BasicRepository<TrackPushConfigEntity>,
|
||||
{
|
||||
return await AsQueryable()
|
||||
.LeftJoin<VSystemEntity>((trackPush, system) => trackPush.SubSystemId == system.Id && !system.IsDeleted)
|
||||
.LeftJoin<VExternalSubjectEntity>((trackPush, system, externalSubject) => trackPush.CustomId == externalSubject.Id && !externalSubject.IsDeleted)
|
||||
.LeftJoin<VExternalSubjectEntity>((trackPush, system, externalSubject) =>
|
||||
trackPush.CustomId == externalSubject.Id && !externalSubject.IsDeleted)
|
||||
.Filter(null, true)
|
||||
.Where(trackPush => !trackPush.IsDeleted)
|
||||
.WhereIF(input.SubSystemId.HasValue, trackPush => trackPush.SubSystemId == input.SubSystemId)
|
||||
.WhereIF(!input.Keywords.IsNullOrWhiteSpace(), (trackPush, system, externalSubject) => externalSubject.Abbreviation.Contains(input.Keywords!) || externalSubject.Name.Contains(input.Keywords!))
|
||||
.WhereIF(!input.Keywords.IsNullOrWhiteSpace(),
|
||||
(trackPush, system, externalSubject) => externalSubject.Abbreviation.Contains(input.Keywords!) ||
|
||||
externalSubject.Name.Contains(input.Keywords!))
|
||||
.OrderByDescending(trackPush => trackPush.CreateTime)
|
||||
.Select((trackPush, system, externalSubject) => new GetTrackPushConfigPageOutputVO
|
||||
{
|
||||
@ -36,11 +38,14 @@ public class TrackPushConfigRepository : BasicRepository<TrackPushConfigEntity>,
|
||||
.ToPagedListAsync(input.PageIndex, input.PageSize);
|
||||
}
|
||||
|
||||
public async Task<UnifyPageResultDto<GetTrackPushContentPageOutputVO>> GetContentPageAsync(GetTrackPushContentPageInputVO input)
|
||||
public async Task<UnifyPageResultDto<GetTrackPushContentPageOutputVO>> GetContentPageAsync(
|
||||
GetTrackPushContentPageInputVO input)
|
||||
{
|
||||
return await Context.Queryable<TrackPushContentConfigEntity>()
|
||||
.InnerJoin<TrackContentEntity>((pushContent, trackContent) => pushContent.TrackContentId == trackContent.Id)
|
||||
.LeftJoin<VEnumValueInfoEntity>((pushContent, trackContent, enumValue) => enumValue.Property == EnumPropertyEnums.单号类型.GetDescription() && pushContent.OrderNoType == enumValue.Enumkey && !enumValue.IsDeleted)
|
||||
.LeftJoin<VEnumValueInfoEntity>((pushContent, trackContent, enumValue) =>
|
||||
enumValue.Property == EnumPropertyEnums.单号类型.GetDescription() &&
|
||||
pushContent.OrderNoType == enumValue.Enumkey && !enumValue.IsDeleted)
|
||||
.Where(pushContent => pushContent.TrackPushConfigId == input.TrackPushConfigId)
|
||||
.OrderBy(pushContent => pushContent.Sort)
|
||||
.Select((pushContent, trackContent, enumValue) => new GetTrackPushContentPageOutputVO
|
||||
@ -56,9 +61,12 @@ public class TrackPushConfigRepository : BasicRepository<TrackPushConfigEntity>,
|
||||
{
|
||||
return await AsQueryable()
|
||||
.LeftJoin<VSystemEntity>((trackPush, system) => trackPush.SubSystemId == system.Id && !system.IsDeleted)
|
||||
.LeftJoin<VExternalSubjectEntity>((trackPush, system, externalSubject) => trackPush.CustomId == externalSubject.Id && !externalSubject.IsDeleted)
|
||||
.LeftJoin<VServiceProviderEntity>((trackPush, system, externalSubject, service) => trackPush.ServiceProviderId == service.Id && !service.IsDeleted)
|
||||
.InnerJoin<TrackPushPullParamsConfigEntity>((trackPush, system, externalSubject, service, paramsConfig) => trackPush.Id == paramsConfig.PullOrPushConfigId && paramsConfig.IsPush && !paramsConfig.IsDeleted)
|
||||
.LeftJoin<VExternalSubjectEntity>((trackPush, system, externalSubject) =>
|
||||
trackPush.CustomId == externalSubject.Id && !externalSubject.IsDeleted)
|
||||
.LeftJoin<VServiceProviderEntity>((trackPush, system, externalSubject, service) =>
|
||||
trackPush.ServiceProviderId == service.Id && !service.IsDeleted)
|
||||
.InnerJoin<TrackPushPullParamsConfigEntity>((trackPush, system, externalSubject, service, paramsConfig) =>
|
||||
trackPush.Id == paramsConfig.PullOrPushConfigId && paramsConfig.IsPush && !paramsConfig.IsDeleted)
|
||||
.Filter(null, true)
|
||||
.Where(trackPush => trackPush.Id == id && !trackPush.IsDeleted)
|
||||
.Select((trackPush, system, externalSubject, service, paramsConfig) => new GetTrackPushConfigDetailOutputVO
|
||||
@ -112,7 +120,32 @@ public class TrackPushConfigRepository : BasicRepository<TrackPushConfigEntity>,
|
||||
return await Context.Updateable(updateObj).ExecuteCommandHasChangeAsync();
|
||||
}
|
||||
|
||||
public async Task<List<TrackPushContentConfigEntity>> GetContentListAsync(Expression<Func<TrackPushContentConfigEntity, bool>> whereExpression)
|
||||
public async Task<List<TrackPushContentConfigVO>> GetContentListAsync(int configId)
|
||||
{
|
||||
return await Context.Queryable<TrackPushConfigEntity>()
|
||||
.LeftJoin<TrackPushContentConfigEntity>((a, b) => a.Id == b.TrackPushConfigId)
|
||||
.LeftJoin<VServiceProviderEntity>((a, b, c) => a.ServiceProviderId == c.Id)
|
||||
.Where(a => a.Id == configId)
|
||||
.OrderBy((a, b) => b.Sort)
|
||||
.Select((a, b, c) => new TrackPushContentConfigVO
|
||||
{
|
||||
IsAutoPush = a.IsAutoPush,
|
||||
IsCanUpdate = a.IsCanUpdate,
|
||||
ServiceProviderCode = c.Code,
|
||||
ExpandFieldsValue = b.ExpandFieldsValue,
|
||||
OrderType = b.OrderNoType,
|
||||
TrackContentCodeValue = b.TrackContentCodeValue,
|
||||
TrackContentId = b.TrackContentId,
|
||||
TrackContentValue = b.TrackContentValue,
|
||||
TrackEnContentValue = b.TrackEnContentValue,
|
||||
TrackStatusValue = b.TrackStatusValue,
|
||||
TrackTimeZone = b.TrackTimeZone
|
||||
})
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
public async Task<List<TrackPushContentConfigEntity>> GetContentListAsync(
|
||||
Expression<Func<TrackPushContentConfigEntity, bool>> whereExpression)
|
||||
{
|
||||
return await Context.Queryable<TrackPushContentConfigEntity>().Where(whereExpression).ToListAsync();
|
||||
}
|
||||
@ -122,13 +155,16 @@ public class TrackPushConfigRepository : BasicRepository<TrackPushConfigEntity>,
|
||||
return await Context.Updateable(updateObjs).ExecuteCommandHasChangeAsync();
|
||||
}
|
||||
|
||||
public async Task<T> ContentMaxAsync<T>(Expression<Func<TrackPushContentConfigEntity, T>> columns, Expression<Func<TrackPushContentConfigEntity, bool>> whereExpression)
|
||||
public async Task<T> ContentMaxAsync<T>(Expression<Func<TrackPushContentConfigEntity, T>> columns,
|
||||
Expression<Func<TrackPushContentConfigEntity, bool>> whereExpression)
|
||||
{
|
||||
return await Context.Queryable<TrackPushContentConfigEntity>().Where(whereExpression).MaxAsync(columns);
|
||||
}
|
||||
|
||||
public async Task<bool> UpdateContentAsync(Expression<Func<TrackPushContentConfigEntity, bool>> columns, Expression<Func<TrackPushContentConfigEntity, bool>> whereExpression)
|
||||
public async Task<bool> UpdateContentAsync(Expression<Func<TrackPushContentConfigEntity, bool>> columns,
|
||||
Expression<Func<TrackPushContentConfigEntity, bool>> whereExpression)
|
||||
{
|
||||
return await Context.Updateable<TrackPushContentConfigEntity>().SetColumns(columns).Where(whereExpression).ExecuteCommandHasChangeAsync();
|
||||
return await Context.Updateable<TrackPushContentConfigEntity>().SetColumns(columns).Where(whereExpression)
|
||||
.ExecuteCommandHasChangeAsync();
|
||||
}
|
||||
}
|
||||
@ -3,6 +3,7 @@ using SJZY.Expand.ABP.Core.Logger;
|
||||
using SJZY.Expand.ElasticSearch.Services;
|
||||
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
||||
using SJZY.Track.Domain.Aggregates.TrackPushAggregate;
|
||||
using SJZY.Track.Domain.Consts;
|
||||
|
||||
namespace SJZY.Track.Repository.Repositories;
|
||||
|
||||
@ -30,6 +31,7 @@ public class TrackPushRecordsRepository : ElasticSearchContextAbstract<TrackDeta
|
||||
public async Task<List<TrackPushRecordIndex>> GetTrackPushRecordsAsync(int orderId)
|
||||
{
|
||||
var data = await Context.SearchAsync<TrackPushRecordIndex>(x => x
|
||||
.Index(GlobalConst.TrackPushRecordsIndex)
|
||||
.Query(q =>
|
||||
q.Term(t => t.OrderId, orderId)
|
||||
)
|
||||
@ -38,4 +40,18 @@ public class TrackPushRecordsRepository : ElasticSearchContextAbstract<TrackDeta
|
||||
|
||||
return data.Documents.ToList();
|
||||
}
|
||||
|
||||
public async Task<List<TrackPushRecordIndex>> GetTrackPushRecordsAsync(string orderNo, int orderType)
|
||||
{
|
||||
var data = await Context.SearchAsync<TrackPushRecordIndex>(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();
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user