update: 新增/修改轨迹增加IsToMq参数,标记为true则轨迹操作后一定会推送

update: MQ广播异步改同步
update: 更新契约包版本7.0.10
This commit is contained in:
hardstylewyl 2024-12-27 11:18:20 +08:00
parent a9eaa5e41f
commit 5edaa2f80c
9 changed files with 88 additions and 75 deletions

View File

@ -129,4 +129,9 @@ public class BatchUpsertTrackInput : OrderNosInfo
/// 是否强制推送 /// 是否强制推送
/// </summary> /// </summary>
public bool ForcedPush { get; set; } public bool ForcedPush { get; set; }
/// <summary>
/// 指定是否推送
/// </summary>
public bool IsToMq { get; set; }
} }

View File

@ -133,4 +133,9 @@ public class UpsertTrackInput : OrderNoInfo
/// 是否强制推送 /// 是否强制推送
/// </summary> /// </summary>
public bool ForcedPush { get; set; } public bool ForcedPush { get; set; }
/// <summary>
/// 指定是否推送
/// </summary>
public bool IsToMq { get; set; }
} }

View File

@ -151,6 +151,10 @@ public class TrackUpsertEvent
/// </summary> /// </summary>
public bool ForcedPush { get; set; } public bool ForcedPush { get; set; }
/// <summary>
/// 指定是否推送
/// </summary>
public bool IsToMq { get; set; }
public override string ToString() public override string ToString()
{ {

View File

@ -5,7 +5,7 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net7.0</TargetFramework>
<GenerateDocumentationFile>True</GenerateDocumentationFile> <GenerateDocumentationFile>True</GenerateDocumentationFile>
<Version>7.0.9</Version> <Version>7.0.10</Version>
<GenerateDocumentationFile>True</GenerateDocumentationFile> <GenerateDocumentationFile>True</GenerateDocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@ -69,6 +69,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
if (@event.ForcedPush) if (@event.ForcedPush)
{ {
//当为强制推送,会走手动推送逻辑
await DoPushAsync(@event); await DoPushAsync(@event);
return; return;
} }
@ -95,7 +96,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
var items = new List<TrackPushInput>(); var items = new List<TrackPushInput>();
TrackPushContentConfigDto? config; TrackPushContentConfigDto? config;
var isSystemPush = @event.OperationMan == null; var isSystemPush = @event.OperationMan == null;
if (isSystemPush) if (isSystemPush && !@event.ForcedPush)
{ {
foreach (var order in _orders) foreach (var order in _orders)
{ {
@ -139,13 +140,18 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
if (config == null) return; if (config == null) return;
var tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds, @event.TrackCode); var tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds, @event.TrackCode);
tracks = tracks.DistinctBy(x => x.OrderId).ToList(); // 防止重复推送
if (tracks.Count == 0) return; // 一个能推的轨迹都不存在
// tips:人工推送只要能推就推了,不会校验已推和顺序问题,因为可能是更新 // tips:人工推送只要能推就推了,不会校验已推和顺序问题,因为可能是更新
foreach (var track in tracks) foreach (var order in _orders)
{ {
var order = _orders.First(x => x.Id == track.OrderId); //取订单的下某个code的最新创建时间的轨迹 防止重复推送
var track = tracks
.Where(x => x.OrderId == order.Id && x.TrackCode == @event.TrackCode)
.OrderByDescending(x => x.CreateTime)
.FirstOrDefault();
if (track == null) return; // 一个能推的轨迹都不存在
if (config is { IsAllPush: true }) if (config is { IsAllPush: true })
{ {
// 强制推送只需直接查出配置 // 强制推送只需直接查出配置

View File

@ -49,8 +49,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
var content = await HandleTrackAsync(@event, canNextOrderIds); var content = await HandleTrackAsync(@event, canNextOrderIds);
// 处理广播事件 // 处理广播事件
if (content is { IsToMq: true }) if (content != null && (content.IsToMq || @event.IsToMq))
await _broadcastingService.TrackChangePublicTopicAsync(@event, content); _broadcastingService.TrackChangePublicTopicAsync(@event, content);
if (canNextOrderIds.Count == 0) return; if (canNextOrderIds.Count == 0) return;
// 根据订单关联关系异步向下刷(异步) // 根据订单关联关系异步向下刷(异步)
@ -219,7 +219,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
Extra = @event.Extra Extra = @event.Extra
}, },
ForcedPush = @event.ForcedPush, ForcedPush = @event.ForcedPush,
IsToMq = trackContent.IsToMq IsToMq = (trackContent.IsToMq || @event.IsToMq)
}; };
await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, trackPushEvent); await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, trackPushEvent);

View File

@ -70,7 +70,7 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl
// 推送广播 // 推送广播
if (log.IsToMq) if (log.IsToMq)
await _broadcastingService.TrackPushCompletedPublicTopicAsync(log); _broadcastingService.TrackPushCompletedPublicTopicAsync(log);
// 往es 写推送日志 // 往es 写推送日志
await _trackPushRecordEsRepository.AddAsync(log); await _trackPushRecordEsRepository.AddAsync(log);

View File

@ -26,47 +26,43 @@ public class BroadcastingService : ITransientDependency
/// <param name="eto"></param> /// <param name="eto"></param>
/// <param name="content"></param> /// <param name="content"></param>
/// <returns></returns> /// <returns></returns>
public Task TrackChangePublicTopicAsync(TrackUpsertEvent eto, TrackContentVO content) public void TrackChangePublicTopicAsync(TrackUpsertEvent eto, TrackContentVO content)
{ {
return Task.Run(() => var data = new TrackChangeEto
{ {
var data = new TrackChangeEto EstimatedDeliveryDate = eto.EstimatedDeliveryDate,
{ TrackPlacePostcode = eto.TrackPlacePostcode,
EstimatedDeliveryDate = eto.EstimatedDeliveryDate, TrackPlaceNation = eto.TrackPlaceNation,
TrackPlacePostcode = eto.TrackPlacePostcode, TrackPlaceNationId = eto.TrackPlaceNationId,
TrackPlaceNation = eto.TrackPlaceNation, TrackPlaceProvince = eto.TrackPlaceProvince,
TrackPlaceNationId = eto.TrackPlaceNationId, TrackPlaceProvinceId = eto.TrackPlaceProvinceId,
TrackPlaceProvince = eto.TrackPlaceProvince, TrackPlaceCity = eto.TrackPlaceCity,
TrackPlaceProvinceId = eto.TrackPlaceProvinceId, TrackPlaceCityId = eto.TrackPlaceCityId,
TrackPlaceCity = eto.TrackPlaceCity, Files = eto.Files,
TrackPlaceCityId = eto.TrackPlaceCityId, Remarks = eto.Remarks,
Files = eto.Files, Source = eto.Source,
Remarks = eto.Remarks, IsVisibility = eto.IsVisibility,
Source = eto.Source, TrackTimeZone = eto.TrackTimeZone,
IsVisibility = eto.IsVisibility, TrackTime = eto.TrackTime,
TrackTimeZone = eto.TrackTimeZone, TrackPlace = eto.TrackPlace,
TrackTime = eto.TrackTime, TrackStatusCode = content.TrackStatusCode,
TrackPlace = eto.TrackPlace, EnStatus = eto.EnStatus,
TrackStatusCode = content.TrackStatusCode, Content = eto.Content,
EnStatus = eto.EnStatus, TrackCode = eto.TrackCode,
Content = eto.Content, OperationMan = eto.OperationMan,
TrackCode = eto.TrackCode, OrderIdentifiers = eto.OrderIdentifiers,
OperationMan = eto.OperationMan, CustomId = eto.CustomId,
OrderIdentifiers = eto.OrderIdentifiers, SubSystemId = eto.SubSystemId,
CustomId = eto.CustomId, Extra = eto.Extra
SubSystemId = eto.SubSystemId, };
Extra = eto.Extra
};
if (eto.IsAdd) if (eto.IsAdd)
data.Option = 1; data.Option = 1;
else else
data.Option = 3; data.Option = 3;
_rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{content.SubSystemCode}", _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{content.SubSystemCode}",
Encoding.UTF8.GetBytes(data.ToJson())); Encoding.UTF8.GetBytes(data.ToJson()));
return Task.CompletedTask;
});
} }
/// <summary> /// <summary>
@ -74,34 +70,29 @@ public class BroadcastingService : ITransientDependency
/// </summary> /// </summary>
/// <param name="log"></param> /// <param name="log"></param>
/// <returns></returns> /// <returns></returns>
public Task TrackPushCompletedPublicTopicAsync(TrackPushRecordIndex log) public void TrackPushCompletedPublicTopicAsync(TrackPushRecordIndex log)
{ {
// todo: 不需要异步 var data = new TrackPushCompletedEvent
return Task.Run(() =>
{ {
var data = new TrackPushCompletedEvent RequestId = log.RequestId,
{ IsSuccess = log.IsSuccess,
RequestId = log.RequestId, Message = log.Message,
IsSuccess = log.IsSuccess, OperationMan = log.CreateUser,
Message = log.Message, PushTime = DateTime.Now,
OperationMan = log.CreateUser, OptionType = log.OptionType,
PushTime = DateTime.Now, IsManualPush = !string.Equals(log.CreateUser, GlobalConst.SystemUser), //操作人不为系统用户,则认为是仍推送
OptionType = log.OptionType, PushContent = log.PushContent,
IsManualPush = !string.Equals(log.CreateUser, GlobalConst.SystemUser), //操作人不为系统用户,则认为是仍推送 OrderNo = log.OrderNo,
PushContent = log.PushContent, TrackStatus = log.TrackStatus,
OrderNo = log.OrderNo, TrackContent = log.TrackContent,
TrackStatus = log.TrackStatus, TrackTimeZone = log.TrackTimeZone,
TrackContent = log.TrackContent, TrackTime = log.TrackTime,
TrackTimeZone = log.TrackTimeZone, TrackPlace = log.TrackPlace,
TrackTime = log.TrackTime, TrackCode = log.TrackCode,
TrackPlace = log.TrackPlace, Extra = log.Extra
TrackCode = log.TrackCode, };
Extra = log.Extra
};
_rabbitClientBus.Publish(GlobalConst.TrackPushExchange, $"TrackPush.{log.SubSystemCode}", _rabbitClientBus.Publish(GlobalConst.TrackPushExchange, $"TrackPush.{log.SubSystemCode}",
Encoding.UTF8.GetBytes(data.ToJson())); Encoding.UTF8.GetBytes(data.ToJson()));
return Task.CompletedTask;
});
} }
} }

View File

@ -145,6 +145,7 @@ public partial class TrackService : ApplicationService, ITrackService
{ {
//todo:保留之前的方式 后续可去除 //todo:保留之前的方式 后续可去除
userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(input.OptionUserId); userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(input.OptionUserId);
if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null)
//TODO: log || ex //TODO: log || ex
throw new BusinessException(message: $"调用用户中心,获取用户信息失败:{userInfo.Msg}"); throw new BusinessException(message: $"调用用户中心,获取用户信息失败:{userInfo.Msg}");
@ -477,7 +478,8 @@ public partial class TrackService : ApplicationService, ITrackService
EstimatedDeliveryDate = input.EstimatedDeliveryDate, EstimatedDeliveryDate = input.EstimatedDeliveryDate,
DestinationTimeZone = input.DestinationTimeZone, DestinationTimeZone = input.DestinationTimeZone,
Extra = input.Extra, Extra = input.Extra,
ForcedPush = input.ForcedPush ForcedPush = input.ForcedPush,
IsToMq = input.IsToMq,
}; };
await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event);
} }