diff --git a/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs
index 4a1cb510..a3d1091e 100644
--- a/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs
+++ b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs
@@ -22,6 +22,14 @@ public interface IBroadcastingService : ITransientDependency
///
void TrackChangePublicTopicAsync(TrackDeleteEvent eto, OrderIdentifier[] orderIdentifiers, string trackCode, string trackStatusCode, string subSystemCode);
+ ///
+ /// 轨迹变更广播(删除)
+ ///
+ ///
+ ///
+ ///
+ void TrackChangePublicTopicAsync(TrackChangeEto eto, string subSystemCode);
+
///
/// 轨迹推送完成广播(推送完成回调)
///
diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs
index 7e798eba..1265a4d9 100644
--- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs
+++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs
@@ -1,9 +1,12 @@
+using System.Collections.Immutable;
+using System.Text.Json;
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.Events;
using SJZY.Track.Application.Contract.Services;
+using SJZY.Track.Application.Helpers;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Enums;
@@ -118,7 +121,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
return true;
}
- private async Task PublicTrackTopicAsync(TrackDeleteEvent eto, List trackList)
+ private async Task PublicTrackTopicAsync(TrackDeleteEvent @event, List trackList)
{
var systemIds = trackList.Select(x => x.SubSystemId).Distinct().ToArray();
var trackCodes = trackList.Select(x => x.TrackCode).Distinct().ToArray();
@@ -144,21 +147,63 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
var item = dataItem.First();
var content = contentList.First(m => m.TrackContentCode == item.TrackCode);
- _broadcastingService.TrackChangePublicTopicAsync(eto,
- dataItem.Select(m => new OrderIdentifier
+ // _broadcastingService.TrackChangePublicTopicAsync(track,
+ // dataItem.Select(m => new OrderIdentifier
+ // {
+ // OrderId = m.OrderId,
+ // OrderNo = m.OrderNo,
+ // OrderType = m.OrderType
+ // }).ToArray(),
+ // item.TrackCode,
+ // item.TrackStatusCode,
+ // content.SubSystemCode
+ // );
+
+ //将每个订单的每个轨迹的删除变更发布
+ foreach (var track in dataItem)
+ {
+ _broadcastingService.TrackChangePublicTopicAsync(new TrackChangeEto
{
- OrderId = m.OrderId,
- OrderNo = m.OrderNo,
- OrderType = m.OrderType
- }).ToArray(),
- item.TrackCode,
- item.TrackStatusCode,
- content.SubSystemCode
- );
+ EstimatedDeliveryDate = track.EstimatedDeliveryDate,
+ TrackPlacePostcode = track.TrackPlacePostcode,
+ TrackPlaceNation = track.TrackPlaceNation,
+ TrackPlaceNationId = track.TrackPlaceNationId,
+ TrackPlaceProvince = track.TrackPlaceProvince,
+ TrackPlaceProvinceId = track.TrackPlaceProvinceId,
+ TrackPlaceCity = track.TrackPlaceCity,
+ TrackPlaceCityId = track.TrackPlaceCityId,
+ Files = track.Files?.Select(x => new FileItemDto()
+ {
+ FileName = x.FileName,
+ OssKey = x.OssKey
+ }).ToList(),
+ Remarks = track.Remarks,
+ Source = track.Source,
+ IsVisibility = track.IsVisibility,
+ TrackTimeZone = track.TrackTimeZone,
+ TrackTime = track.TrackTime,
+ TrackPlace = track.TrackPlace,
+ TrackStatusCode = track.TrackStatusCode,
+ EnStatus = track.TrackEnContent,
+ Content = track.TrackContent,
+ TrackCode = track.TrackCode,
+ OperationMan = @event.OperationMan,
+ OrderIdentifiers = new[]
+ {
+ new OrderIdentifier()
+ {
+ OrderId = track.OrderId,
+ OrderNo = track.OrderNo,
+ OrderType = track.OrderType
+ }
+ },
+ SubSystemId = @event.SubSystemId,
+ Extra = track.Extra
+ }, content.SubSystemCode);
+ }
}
}
- // todo:多个相同code的轨迹删除,也需要考虑??
private async Task> DeleteTrackAsync(TrackDeleteEvent @event)
{
List orderIds;
@@ -196,10 +241,40 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
//根据订单查询出所有的轨迹,查所有是因为主单上需要进行回退更新
tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds);
- //构建标识符集合
- var ids = @event.TrackIdentifiers.Select(x => $"{x.TrackCode}{x.TrackTime:G}").ToList();
- //根据标识符选出要删除的轨迹明细
- deleteTracks = tracks.Where(x => ids.Contains($"{x.TrackCode}{x.TrackTime:G}")).ToList();
+ //比较字段为空则使用时间来作为额外的标识key
+ if (string.IsNullOrWhiteSpace(@event.CompareFields))
+ {
+ //构建标识符集合
+ var ids = @event.TrackIdentifiers.Select(x => $"{x.TrackCode}{x.TrackTime:G}").ToHashSet();
+ //根据标识符选出要删除的轨迹明细
+ deleteTracks = tracks.Where(x => ids.Contains($"{x.TrackCode}{x.TrackTime:G}")).ToList();
+ }
+ //否则则使用比较字段,使用扩展字段中的内容进行比较
+ else
+ {
+ var codes = @event.TrackIdentifiers.Select(x => x.TrackCode).ToImmutableHashSet();
+ deleteTracks = tracks
+ .Where(x =>
+ {
+ if (!codes.Contains(x.TrackCode))
+ return false;
+
+ if (string.IsNullOrWhiteSpace(x.Extra))
+ {
+ throw new BusinessException(message: $"当前轨迹不存在扩展信息,无法利用扩展字段:{@event.CompareFields}");
+ }
+
+ var extraDict = GetExtraDictForTextJson(x.Extra);
+ if (extraDict == null || !extraDict.TryGetValue(@event.CompareFields, out var compareValue))
+ {
+ throw new BusinessException(message: $"请检查拓展字段,为什么找不到比较字段:{@event.CompareFields}");
+ }
+
+ return TextJsonHelper.EqJsonElement(compareValue, @event.CompareValue);
+ })
+ .ToList();
+ }
+
if (deleteTracks.Count == 0) return deleteTracks;
@@ -256,21 +331,9 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
order.EstimatedDeliveryDate = track.EstimatedDeliveryDate;
order.DestinationTimeZone = track.DestinationTimeZone;
}
-
-
- // 写入操作日志
- _ = _orderOperationRecordEsRepository.AddAsync(new OrderOperationRecordIndex
- {
- OrderId = order.Id,
- OrderNo = order.OrderNo,
- OptionType = OrderOperationType.删除轨迹.ToString(),
- Content = deleteTracks.Where(m => m.OrderId == order.Id).ToList().ToJson(),
- CreateUserId = @event.OperationManId,
- CreateUserName = @event.OperationMan ?? "",
- CreateTime = DateTime.Now
- });
}
+ //更新订单上冗余轨迹明细的字段
await _orderRepository.UpdateRangeAsync(orders,
x => new
{
@@ -283,6 +346,83 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
x.DestinationTimeZone
});
+ //批量写入订单操作日志
+ _ = _orderOperationRecordEsRepository.AddManyAsync(orders.Select(order => new OrderOperationRecordIndex
+ {
+ OrderId = order.Id,
+ OrderNo = order.OrderNo,
+ OptionType = OrderOperationType.删除轨迹.ToString(),
+ Content = deleteTracks.Where(m => m.OrderId == order.Id).ToList().ToJson(),
+ CreateUserId = @event.OperationManId,
+ CreateUserName = @event.OperationMan ?? "",
+ CreateTime = DateTime.Now
+ }).ToList());
+
return deleteTracks;
}
+
+ private Dictionary? GetExtraDictForTextJson(string? extraStr)
+ {
+ return string.IsNullOrWhiteSpace(extraStr)
+ ? null
+ : System.Text.Json.JsonSerializer.Deserialize>(extraStr);
+ }
+
+ //json Element和object的比较
+ private bool EqJsonElementObject2(object? a, object? b)
+ {
+ if (a == null && b == null)
+ {
+ return true;
+ }
+
+ if (a is JsonElement aJsonElement)
+ {
+ switch (aJsonElement.ValueKind)
+ {
+ case JsonValueKind.Undefined:
+ return false;
+ case JsonValueKind.Object:
+ return false;
+ case JsonValueKind.Array:
+ return false;
+ case JsonValueKind.String:
+ return string.Equals(aJsonElement.GetString(), b as string);
+ case JsonValueKind.Number:
+ {
+ if (b == null) return false;
+
+ if (b is int bInt)
+ {
+ var aInt = aJsonElement.GetInt32();
+ return aInt == bInt;
+ }
+
+ if (b is long bLong)
+ {
+ var aLong = aJsonElement.GetInt64();
+ return aLong == bLong;
+ }
+
+ return false;
+ }
+ case JsonValueKind.True:
+ case JsonValueKind.False:
+ {
+ if (b is bool bl)
+ {
+ return aJsonElement.GetBoolean() == bl;
+ }
+
+ return false;
+ }
+ case JsonValueKind.Null:
+ {
+ return false;
+ }
+ }
+ }
+
+ return false;
+ }
}
diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs
index d695a433..5aa98422 100644
--- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs
+++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs
@@ -123,6 +123,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
TrackPushFailedPublicTopic($"推送顺序异常,下一个要推送的应为[{nextCode}]", @event, order);
continue;
}
+
config = resultConfig;
// 是否自动推送
@@ -316,7 +317,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
{ "descriptionCn", config.TrackContentValue },
{ "code", config.TrackContentCodeValue },
{ "status", config.TrackStatusValue },
- { "extra", DeserializeForTextJson