diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs
index c2c2072d..1215e1e8 100644
--- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs
+++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs
@@ -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
{
///
/// 订单id
///
public int OrderId { get; set; }
+ ///
+ /// 订单类型
+ ///
+ public int OrderType { get; set; }
+
+ ///
+ /// 订单号
+ ///
+ public string OrderNo { get; set; } = null!;
+
///
/// 订单是否完成
///
@@ -34,11 +42,6 @@ public class TrackUpsertEvent : UpsertTrackInput
///
public int UpSubSystemId { get; set; }
- ///
- /// 已经处理过的订单
- ///
- public List Visited { get; set; } = new();
-
///
/// 原轨迹内容
///
@@ -53,4 +56,34 @@ public class TrackUpsertEvent : UpsertTrackInput
/// 操作人
///
public string? OperationMan { get; set; }
+
+ ///
+ /// true新增,false更新,null表示刷新引发的新增/更新
+ ///
+ public bool? IsAdd { get; set; }
+
+ ///
+ /// 轨迹内容代码
+ ///
+ public string TrackCode { get; set; } = null!;
+
+ ///
+ /// 轨迹发生地
+ ///
+ public string TrackPlace { get; set; } = null!;
+
+ ///
+ /// 轨迹发生时间
+ ///
+ public DateTime TrackTime { get; set; }
+
+ ///
+ /// 轨迹发生时区
+ ///
+ public float TrackTimeZone { get; set; }
+
+ ///
+ /// 已经处理过的订单
+ ///
+ public List Visited { get; set; } = new();
}
\ No newline at end of file
diff --git a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj
index f13ee0b2..13bcd7dd 100644
--- a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj
+++ b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj
@@ -5,7 +5,7 @@
net7.0
True
- 1.0.0
+ 1.0.1
True
diff --git a/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs b/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs
index 8bea9494..feaf198f 100644
--- a/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs
+++ b/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs
@@ -65,15 +65,15 @@ public class CAPFilter : SubscribeFilter
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(context.Exception.ToString());
+ 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-id", out var messageId);
context.DeliverMessage.Headers.TryGetValue("cap-msg-name", out var receiveName);
context.DeliverMessage.Headers.TryGetValue("sjzy-arguments", out var arguments);
@@ -89,16 +89,15 @@ public class CAPFilter : SubscribeFilter
var parsedDate = DateTime.ParseExact(receiveTime, "yyyy-MM-dd HH:mm:ss fff", CultureInfo.InvariantCulture);
var useTime = DateTime.Now - parsedDate;
- var log = $@"
+ if (useTime.Minutes > 20)
+ {
+ var log = $@"
|-消息编号:{messageId}
|-消费者名:{receiveName}
|-跳过执行:{(isFromExecptionFliter ? "是" : "否")}
|-执行时间:{receiveTime}
|-消费耗时:{useTime.Milliseconds}毫秒
|-请求参数:{arguments}";
-
- if (useTime.Minutes > 20)
- {
LogHelper.Error(log);
}
else
diff --git a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs
index be24fbf0..153786a9 100644
--- a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs
+++ b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs
@@ -158,7 +158,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
}
}
- if (matchedContentConfig is null) return;
+ // if (matchedContentConfig is null) return;
// 轨迹发生地
var trackPlace = paramConfig.TrackPlaceName == null
@@ -167,7 +167,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
if (trackPlace.IsNullOrWhiteSpace())
{
Expression> resultExpression =
- (TrackLocationValue?)matchedContentConfig.TrackPlaceValue switch
+ (TrackLocationValue?)matchedContentConfig?.TrackPlaceValue switch
{
TrackLocationValue.ArrivalPort => x => x.ArrivalPort,
TrackLocationValue.ArriveCity => x => x.ArrivalCity,
@@ -191,10 +191,10 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
: trackToken[paramConfig.TrackTimeZoneName]?.Value();
// 新增/更新轨迹
- 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);
}
}
\ No newline at end of file
diff --git a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs
index e3276d02..eab6361e 100644
--- a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs
+++ b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs
@@ -40,6 +40,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
return;
}
+ var isUnProcessed = false;
// 不同子系统需要做内容映射
if (@event.UpSubSystemId != 0 && @event.UpSubSystemId != @event.SubSystemId)
{
@@ -56,13 +57,22 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
@event.TrackCode = mapCode;
}
- var track = await _trackDetailsRepository.GetFirstOrDefaultAsync(@event.OrderId, @event.TrackCode);
- if (track == null && !@event.IsAdd) return;
- if (track != null && @event.IsAdd) return;
+ 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轨迹
track = await UpsertTrackAsync(track, @event);
- if (track == null) return; // 模板没配该轨迹代码,无法入库
+
+ if (track == null || @event.TrackCode == GlobalConst.EmptyString) return; // 模板没配该轨迹代码,不再继续
// step2、触发轨迹推送事件(异步)
await HandleTrackPushAsync(@event, track);
@@ -107,44 +117,64 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
{
if (track == default)
{
- //todo:可以优化
- // 根据轨迹code在订单模板内容中寻找匹配的
- var trackContent = await _provideQueries.MatchTrackContentAsync(@event.OrderId, @event.TrackCode);
- if (trackContent == default)
- {
- // 订单所绑定的模板,没有一条内容可以匹配发生的轨迹
- return null;
- }
-
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,
+ TrackTime = @event.TrackTime,
+ TrackTimeZone = @event.TrackTimeZone,
+ IsCanDelete = false,
OriginTrackContent = @event.OriginTrackContent,
OriginTrackData = @event.OriginTrackData,
CreateUser = @event.OperationMan,
CreateTime = DateTime.Now
};
- track.ZeroTrackTime = track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone));
+ // 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.TrackTime = @event.TrackTime;
+ track.TrackTimeZone = @event.TrackTimeZone;
track.UpdateUser = @event.OperationMan ?? "系统";
track.UpdateTime = DateTime.Now;
}
diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs
index c21e2a34..77199263 100644
--- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs
+++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs
@@ -91,8 +91,8 @@ public partial class TrackService : ApplicationService, ITrackService
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,
diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs
index acd0ed4e..c78d9b2f 100644
--- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs
+++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs
@@ -6,6 +6,8 @@ public interface ITrackDetailsRepository
{
Task GetFirstOrDefaultAsync(int orderId, string trackCode);
+ Task GetFirstOrDefaultAsync(int orderId, DateTime trackTime);
+
Task UpsertAsync(TrackDetailsIndex index);
Task> GetListAsync(int orderType, List orderNos);
diff --git a/src/SJZY.Track.Domain/Consts/GlobalConst.cs b/src/SJZY.Track.Domain/Consts/GlobalConst.cs
new file mode 100644
index 00000000..a7167357
--- /dev/null
+++ b/src/SJZY.Track.Domain/Consts/GlobalConst.cs
@@ -0,0 +1,6 @@
+namespace SJZY.Track.Domain.Consts;
+
+public partial class GlobalConst
+{
+ public const string EmptyString = "--";
+}
\ No newline at end of file
diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs
index 598ab7ba..b39652de 100644
--- a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs
+++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs
@@ -32,6 +32,25 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract GetFirstOrDefaultAsync(int orderId, DateTime trackTime)
+ {
+ var r = await Context.SearchAsync(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())