From 545efbeaf3636c89860fa248d080cc4ec93275bd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com>
Date: Fri, 1 Mar 2024 17:49:20 +0800
Subject: [PATCH] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Dtos/ProvideServices/TrackUpsertEvent.cs | 6 -
.../Dtos/ProvideServices/UpsertTrackInput.cs | 4 +-
.../Events/TrackUpsertEvent.cs | 19 ++-
.../SJZY.Track.Application.Contract.csproj | 6 +-
.../AutoMapper/TrackAutoMapperProfile.cs | 13 +++
.../EventHandlers/TrackUpsertEventHandler.cs | 108 ++++++++++++++++++
.../SJZY.Track.Application.csproj | 14 +--
.../Services/ProvideServices/TrackCustomer.cs | 9 --
.../ProvideServices/TrackPushService.cs | 10 ++
.../Services/ProvideServices/TrackService.cs | 79 +++----------
.../OrderAggregate/IOrderRepository.cs | 4 +-
.../Aggregates/OrderAggregate/OrderEntity.cs | 6 +
.../TrackContentMapEntity.cs | 30 ++++-
.../ITrackDetailsRepository.cs | 4 +-
.../TrackDetailsIndex.cs | 22 ++--
.../Dtos/Order/LinkedOrderVO.cs | 14 +++
.../Dtos/TrackDetails/MatchTrackContentDto.cs | 6 +-
src/SJZY.Track.Domain/GlobalConst.cs | 14 +++
.../Queries/ITrackQueries.cs | 9 ++
.../Queries/TrackQueries.cs | 9 ++
.../Repositories/OrderRepository.cs | 8 +-
.../Repositories/TrackDetailsRepository.cs | 17 +--
22 files changed, 284 insertions(+), 127 deletions(-)
delete mode 100644 src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackUpsertEvent.cs
create mode 100644 src/SJZY.Track.Application/AutoMapper/TrackAutoMapperProfile.cs
create mode 100644 src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs
delete mode 100644 src/SJZY.Track.Application/Services/ProvideServices/TrackCustomer.cs
create mode 100644 src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs
create mode 100644 src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs
create mode 100644 src/SJZY.Track.Domain/GlobalConst.cs
diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackUpsertEvent.cs
deleted file mode 100644
index b6f64a7a..00000000
--- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackUpsertEvent.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace SJZY.Track.Application.Contract.Dtos.ProvideServices;
-
-public class TrackUpsertEvent
-{
- public int Order { get; set; }
-}
\ No newline at end of file
diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs
index 91d5429c..ef0e67a4 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs
@@ -5,12 +5,12 @@ public class UpsertTrackInput : OrderNoInfo
///
/// 轨迹内容代码
///
- public string TrackCode { get; set; }
+ public string TrackCode { get; set; } = null!;
///
/// 轨迹发生地
///
- public string TrackPlace { get; set; }
+ public string TrackPlace { get; set; } = null!;
///
/// 轨迹发生时间
diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs
index 48784974..ad0fe356 100644
--- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs
+++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs
@@ -1,6 +1,21 @@
-namespace SJZY.Track.Application.Contract.Events;
+using SJZY.Track.Application.Contract.Dtos.ProvideServices;
-public class TrackUpsertEvent
+namespace SJZY.Track.Application.Contract.Events;
+
+public class TrackUpsertEvent : UpsertTrackInput
{
+ ///
+ /// 订单id
+ ///
public int OrderId { get; set; }
+
+ ///
+ /// 子系统id
+ ///
+ public int SubSystemId { get; set; }
+
+ ///
+ /// 上游子系统id
+ ///
+ public int UpSubSystemId { get; set; }
}
\ 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 a7a570d0..de5d1421 100644
--- a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj
+++ b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj
@@ -1,14 +1,14 @@
-
+
net7.0
0.0.2
-
-
+
+
diff --git a/src/SJZY.Track.Application/AutoMapper/TrackAutoMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/TrackAutoMapperProfile.cs
new file mode 100644
index 00000000..b9c185d7
--- /dev/null
+++ b/src/SJZY.Track.Application/AutoMapper/TrackAutoMapperProfile.cs
@@ -0,0 +1,13 @@
+using AutoMapper;
+using SJZY.Track.Application.Contract.Dtos.ProvideServices;
+using SJZY.Track.Application.Contract.Events;
+
+namespace SJZY.Track.Application.AutoMapper;
+
+public class TrackAutoMapperProfile:Profile
+{
+ public TrackAutoMapperProfile()
+ {
+ CreateMap(MemberList.None);
+ }
+}
\ No newline at end of file
diff --git a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs
new file mode 100644
index 00000000..220607ab
--- /dev/null
+++ b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs
@@ -0,0 +1,108 @@
+using DotNetCore.CAP;
+using SJZY.Expand.ABP.Core.PublicMethords;
+using SJZY.Track.Application.Contract.Events;
+using SJZY.Track.Domain.Aggregates.OrderAggregate;
+using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
+using SJZY.Track.Domain.Queries;
+using SJZY.UserCenter.HttpApi.Services;
+using Volo.Abp.DependencyInjection;
+
+namespace SJZY.Track.Application.EventHandlers;
+
+public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
+{
+ private readonly IOrderRepository _orderRepository;
+ private readonly ITrackQueries _trackQueries;
+ private readonly ITrackDetailsRepository _trackDetailsRepository;
+ private readonly ICapPublisher _capPublisher;
+
+ public TrackUpsertEventHandler(IOrderRepository orderRepository, ICapPublisher capPublisher,
+ ITrackQueries trackQueries, ITrackDetailsRepository trackDetailsRepository)
+ {
+ _orderRepository = orderRepository;
+ _capPublisher = capPublisher;
+ _trackQueries = trackQueries;
+ _trackDetailsRepository = trackDetailsRepository;
+ }
+
+ [NonAction]
+ [CapSubscribe(GlobalConst.TrackUpsertSubscribe)]
+ public async Task ConsumerAsync(TrackUpsertEvent @event)
+ {
+ // 不同子系统需要做内容映射
+ if (@event.UpSubSystemId != @event.SubSystemId)
+ {
+ var mapCode = await _trackQueries.MapTrackContentCodeAsync(@event.UpSubSystemId, @event.SubSystemId, @event.TrackCode);
+
+ if (mapCode == default)
+ {
+ throw new BusinessException(message: "订单跨子系统,未配置内容映射,请联系管理员");
+ }
+
+ @event.TrackCode = mapCode;
+ }
+
+ await UpsertTrackAsync(@event);
+ }
+
+ internal async Task UpsertTrackAsync(TrackUpsertEvent @event)
+ {
+ // 不存在则新增轨迹,存在则更新
+ var track = await _trackDetailsRepository.GetFirstOrDefaultAsync(@event.OrderId, @event.TrackCode);
+
+ var isPush = false; // 推送只做新增的,更新和删除的不做先
+ if (track == default)
+ {
+ // 根据轨迹code在订单模板内容中寻找匹配的
+ var trackContent = await _trackQueries.MatchTrackContentAsync(@event.OrderId, @event.TrackCode);
+ if (trackContent == default)
+ {
+ throw new BusinessException(message: $"订单:{@event.OrderNo} 所绑定的模板,没有一条内容可以匹配轨迹代码:{@event.TrackCode}");
+ }
+
+ track = new TrackDetailsIndex
+ {
+ OrderId = @event.OrderId,
+ OrderNo = @event.OrderNo,
+ OrderType = @event.OrderType,
+ TrackStatus = trackContent.Status,
+ TrackCode = @event.TrackCode,
+ TrackContent = trackContent.Content,
+ TrackEnContent = trackContent.EnContent,
+ TrackPlace = @event.TrackPlace,
+ TrackTime = @event.TrackTime,
+ TraceTimeZone = @event.TraceTimeZone,
+ CreateUserId = CurrentUserRequest.CurrentUser.UserId,
+ CreateTime = DateTime.Now
+ };
+
+ isPush = true;
+ }
+ else
+ {
+ track.TrackPlace = @event.TrackPlace;
+ track.TrackTime = @event.TrackTime;
+ track.TraceTimeZone = @event.TraceTimeZone;
+ track.UpdateUserId = CurrentUserRequest.CurrentUser.UserId;
+ track.UpdateTime = DateTime.Now;
+ }
+
+ await _trackDetailsRepository.UpsertAsync(track);
+
+ // 根据订单关联关系异步向下刷
+ var linkedOrders = await _orderRepository.GetLinkedOrdersAsync(@event.OrderId);
+ foreach (var linkedOrder in linkedOrders)
+ {
+ var nextEvent = @event.DeepCopy();
+ nextEvent.OrderId = linkedOrder.OrderId;
+ nextEvent.SubSystemId = linkedOrder.SubSystemId;
+ nextEvent.UpSubSystemId = @event.SubSystemId;
+ await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, nextEvent);
+ }
+
+ if (isPush)
+ {
+ //await PushTrack();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/SJZY.Track.Application/SJZY.Track.Application.csproj b/src/SJZY.Track.Application/SJZY.Track.Application.csproj
index fa25c565..cb744d89 100644
--- a/src/SJZY.Track.Application/SJZY.Track.Application.csproj
+++ b/src/SJZY.Track.Application/SJZY.Track.Application.csproj
@@ -1,6 +1,6 @@
-
+
net7.0
@@ -8,14 +8,14 @@
-
-
-
-
+
+
+
+
-
-
+
+
diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackCustomer.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackCustomer.cs
deleted file mode 100644
index 9f722217..00000000
--- a/src/SJZY.Track.Application/Services/ProvideServices/TrackCustomer.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using DotNetCore.CAP;
-using Volo.Abp.DependencyInjection;
-
-namespace SJZY.Track.Application.Services.ProvideServices;
-
-public class TrackCustomer : ITransientDependency, ICapSubscribe
-{
- public const string CapSubscribe = "SJZY.Track.Upsert";
-}
\ No newline at end of file
diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs
new file mode 100644
index 00000000..5474a9be
--- /dev/null
+++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs
@@ -0,0 +1,10 @@
+namespace SJZY.Track.Application.Services.ProvideServices;
+
+///
+/// 轨迹推送服务
+///
+[ApiExplorerSettings(GroupName = "提供接口")]
+public class TrackPushService: ApplicationService
+{
+
+}
\ No newline at end of file
diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs
index fad211a8..d7cc59e3 100644
--- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs
+++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs
@@ -1,9 +1,7 @@
-using DotNetCore.CAP;
-using SJZY.Track.Application.Contract.Dtos.ProvideServices;
+using SJZY.Track.Application.Contract.Dtos.ProvideServices;
+using SJZY.Track.Application.Contract.Events;
+using SJZY.Track.Application.EventHandlers;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
-using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
-using SJZY.Track.Domain.Queries;
-using SJZY.UserCenter.HttpApi.Services;
namespace SJZY.Track.Application.Services.ProvideServices;
@@ -14,17 +12,12 @@ namespace SJZY.Track.Application.Services.ProvideServices;
public class TrackService : ApplicationService
{
private readonly IOrderRepository _orderRepository;
- private readonly ITrackDetailsRepository _trackDetailsRepository;
- private readonly ITrackQueries _trackQueries;
- private readonly ICapPublisher _capPublisher;
+ private readonly TrackUpsertEventHandler _trackUpsertEventHandler;
- public TrackService(ITrackQueries trackQueries, IOrderRepository orderRepository,
- ITrackDetailsRepository trackDetailsRepository, ICapPublisher capPublisher)
+ public TrackService(IOrderRepository orderRepository, TrackUpsertEventHandler trackUpsertEventHandler)
{
- _trackQueries = trackQueries;
_orderRepository = orderRepository;
- _trackDetailsRepository = trackDetailsRepository;
- _capPublisher = capPublisher;
+ _trackUpsertEventHandler = trackUpsertEventHandler;
}
///
@@ -36,59 +29,21 @@ public class TrackService : ApplicationService
[HttpPost("Track/Upsert")]
public async Task UpsertTrackAsync(UpsertTrackInput input)
{
- var orderId = await _orderRepository.GetFirstAsync(x =>
- x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, x => x.Id);
- if (orderId == default)
+ var order = await _orderRepository.GetFirstAsync(x =>
+ x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, x => new
+ {
+ x.Id, x.SubSystemId, x.IsPushCompleted
+ });
+ if (order == default)
{
throw new BusinessException(message: $"订单:{input.OrderNo}不存在");
}
- // 不存在则新增轨迹,存在则更新
- var track = await _trackDetailsRepository.GetFirstOrDefaultAsync(orderId, input.TrackCode);
- if (track == default)
- {
- var trackContent = await _trackQueries.MatchTrackContentAsync(orderId, input.TrackCode);
- if (trackContent == default)
- {
- throw new BusinessException(message: $"订单:{input.OrderNo} 所绑定的模板,没有一条内容可以匹配轨迹代码:{input.TrackCode}");
- }
-
- track = new TrackDetailsIndex
- {
- OrderId = orderId,
- OrderNo = input.OrderNo,
- OrderType = input.OrderType,
- TrackStatus = trackContent.Status,
- TrackCode = input.TrackCode,
- TrackContent = trackContent.Content,
- TrackEnContent = trackContent.EnContent,
- TrackPlace = input.TrackPlace,
- TrackTime = input.TrackTime,
- TraceTimeZone = input.TraceTimeZone,
- CreateUserId = CurrentUserRequest.CurrentUser.UserId,
- CreateTime = DateTime.Now
- };
- await _trackDetailsRepository.CreateAsync(track);
- }
- else
- {
- track.UpdateUserId = CurrentUserRequest.CurrentUser.UserId;
- track.UpdateTime = DateTime.Now;
- track.TrackPlace = input.TrackPlace;
- track.TrackTime = input.TrackTime;
- track.TraceTimeZone = input.TraceTimeZone;
- await _trackDetailsRepository.UpdateAsync(track);
- }
-
- // 根据订单关联关系向下刷,不同子系统还需要做内容映射
- var linkedOrderIds = await _orderRepository.GetLinkedOrderIdsAsync(orderId);
-
- if (linkedOrderIds.Count > 0)
- {
- await _capPublisher.PublishAsync(TrackCustomer.CapSubscribe, new TrackUpsertEvent { });
- }
-
- // 推送
+ // 新增/更新轨迹
+ var @event = ObjectMapper.Map(input);
+ @event.OrderId = order.Id;
+ @event.SubSystemId = order.SubSystemId;
+ await _trackUpsertEventHandler.UpsertTrackAsync(@event);
return true;
}
}
\ No newline at end of file
diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs
index 136375c5..29b8ae37 100644
--- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs
+++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs
@@ -38,11 +38,11 @@ public interface IOrderRepository : IBasicRepository
#region 订单关联
///
- /// 根据订单id,获取关联的订单id集合
+ /// 根据订单id,获取关联的订单集合
///
///
///
- Task> GetLinkedOrderIdsAsync(int orderId);
+ Task> GetLinkedOrdersAsync(int orderId);
///
/// 关联订单
diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs
index 33e44303..88de3765 100644
--- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs
+++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs
@@ -41,6 +41,12 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot
///
[SugarColumn(ColumnName = "IsCompleted")]
public bool IsCompleted { get; set; }
+
+ ///
+ /// 订单是否推送完成(异步维护)
+ ///
+ [SugarColumn(ColumnName = "IsPushCompleted")]
+ public bool IsPushCompleted { get; set; }
///
/// 最新轨迹内容(异步维护)
diff --git a/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/TrackContentMapEntity.cs b/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/TrackContentMapEntity.cs
index fbeb2e9c..2ce468ed 100644
--- a/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/TrackContentMapEntity.cs
+++ b/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/TrackContentMapEntity.cs
@@ -13,14 +13,38 @@ public class TrackContentMapEntity : IFullAuditedBasicEntitys, IEntity
public int Id { get; set; }
///
- /// 映射轨迹内容id
+ /// 源子系统id
///
- [SugarColumn(ColumnName = "MapTrackContentId")]
- public int MapTrackContentId { get; set; }
+ [SugarColumn(ColumnName = "SubSystemId")]
+ public int SubSystemId { get; set; }
///
/// 源轨迹内容id
///
[SugarColumn(ColumnName = "TrackContentId")]
public int TrackContentId { get; set; }
+
+ ///
+ /// 源轨迹内容code
+ ///
+ [SugarColumn(ColumnName = "TrackContentCode")]
+ public string TrackContentCode { get; set; } = null!;
+
+ ///
+ /// 映射子系统id
+ ///
+ [SugarColumn(ColumnName = "MapSubSystemId")]
+ public int MapSubSystemId { get; set; }
+
+ ///
+ /// 映射轨迹内容id
+ ///
+ [SugarColumn(ColumnName = "MapTrackContentId")]
+ public int MapTrackContentId { get; set; }
+
+ ///
+ /// 映射轨迹内容code
+ ///
+ [SugarColumn(ColumnName = "MapTrackContentCode")]
+ public string MapTrackContentCode { get; set; } = null!;
}
\ No newline at end of file
diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs
index 89d812a1..3ab152d1 100644
--- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs
+++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs
@@ -6,9 +6,7 @@ public interface ITrackDetailsRepository
{
Task GetFirstOrDefaultAsync(int orderId, string inputTrackCode);
- Task UpdateAsync(TrackDetailsIndex index);
-
- Task CreateAsync(TrackDetailsIndex index);
+ Task UpsertAsync(TrackDetailsIndex index);
Task> GetListAsync(int orderType, List orderNos);
diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs
index a8160da6..35857507 100644
--- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs
+++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs
@@ -3,11 +3,9 @@ using SJZY.Expand.ElasticSearch;
namespace SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
-[ElasticsearchType(RelationName = IndexName)]
+[ElasticsearchType(RelationName = GlobalConst.TrackIndex)]
public class TrackDetailsIndex : IdBaseIndex
{
- public const string IndexName = "sjzy_track_details";
-
///
/// 订单Id
///
@@ -16,7 +14,7 @@ public class TrackDetailsIndex : IdBaseIndex
///
/// 订单号
///
- public string OrderNo { get; set; }
+ public string OrderNo { get; set; } = null!;
///
/// 订单类型(主数据枚举TrackOrderType)
@@ -26,42 +24,42 @@ public class TrackDetailsIndex : IdBaseIndex
///
/// 轨迹状态
///
- public string TrackStatus { get; set; }
+ public string TrackStatus { get; set; } = null!;
///
/// 原轨迹状态
///
- public string OriginTrackStatus { get; set; }
+ public string? OriginTrackStatus { get; set; }
///
/// 轨迹内容代码
///
- public string TrackCode { get; set; }
+ public string TrackCode { get; set; } = null!;
///
/// 轨迹内容
///
- public string TrackContent { get; set; }
+ public string TrackContent { get; set; } = null!;
///
/// 原轨迹内容
///
- public string OriginTrackContent { get; set; }
+ public string? OriginTrackContent { get; set; }
///
/// 原轨迹报文
///
- public string OriginTrackData { get; set; }
+ public string? OriginTrackData { get; set; }
///
/// 轨迹内容英文
///
- public string TrackEnContent { get; set; }
+ public string TrackEnContent { get; set; } = null!;
///
/// 轨迹发生地
///
- public string TrackPlace { get; set; }
+ public string? TrackPlace { get; set; }
///
/// 轨迹发生时间
diff --git a/src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs b/src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs
new file mode 100644
index 00000000..5d1c7327
--- /dev/null
+++ b/src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs
@@ -0,0 +1,14 @@
+namespace SJZY.Track.Domain.Dtos.Order;
+
+public class LinkedOrderVO
+{
+ ///
+ /// 关联订单id
+ ///
+ public int OrderId { get; set; }
+
+ ///
+ /// 子系统id
+ ///
+ public int SubSystemId { get; set; }
+}
\ No newline at end of file
diff --git a/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs b/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs
index c6e07352..ced59e19 100644
--- a/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs
+++ b/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs
@@ -5,15 +5,15 @@ public class MatchTrackContentDto
///
/// 轨迹内容
///
- public string Content { get; set; }
+ public string Content { get; set; } = null!;
///
/// 轨迹内容英文
///
- public string EnContent { get; set; }
+ public string EnContent { get; set; } = null!;
///
/// 轨迹状态
///
- public string Status { get; set; }
+ public string Status { get; set; } = null!;
}
\ No newline at end of file
diff --git a/src/SJZY.Track.Domain/GlobalConst.cs b/src/SJZY.Track.Domain/GlobalConst.cs
new file mode 100644
index 00000000..77881f20
--- /dev/null
+++ b/src/SJZY.Track.Domain/GlobalConst.cs
@@ -0,0 +1,14 @@
+namespace SJZY.Track.Domain;
+
+public class GlobalConst
+{
+ ///
+ /// 轨迹明细es索引名称
+ ///
+ public const string TrackIndex = "sjzy_track_details";
+
+ ///
+ /// 轨迹新增/更新cap订阅名称
+ ///
+ public const string TrackUpsertSubscribe = "SJZY.Track.Upsert";
+}
\ No newline at end of file
diff --git a/src/SJZY.Track.Domain/Queries/ITrackQueries.cs b/src/SJZY.Track.Domain/Queries/ITrackQueries.cs
index df41882c..53a9720e 100644
--- a/src/SJZY.Track.Domain/Queries/ITrackQueries.cs
+++ b/src/SJZY.Track.Domain/Queries/ITrackQueries.cs
@@ -31,4 +31,13 @@ public interface ITrackQueries
/// 轨迹代码
///
Task MatchTrackContentAsync(int orderId, string code);
+
+ ///
+ /// 根据子系统内容映射,得到映射后的轨迹code
+ ///
+ ///
+ ///
+ ///
+ ///
+ Task MapTrackContentCodeAsync(int upSubSystemId, int subSystemId, string trackCode);
}
\ No newline at end of file
diff --git a/src/SJZY.Track.Repository/Queries/TrackQueries.cs b/src/SJZY.Track.Repository/Queries/TrackQueries.cs
index da7c4dab..a1e5168a 100644
--- a/src/SJZY.Track.Repository/Queries/TrackQueries.cs
+++ b/src/SJZY.Track.Repository/Queries/TrackQueries.cs
@@ -75,4 +75,13 @@ public class TrackQueries : ISugarRepository, ITrackQueries,
})
.FirstAsync();
}
+
+ public async Task MapTrackContentCodeAsync(int upSubSystemId, int subSystemId, string trackCode)
+ {
+ return await Context.Queryable()
+ .Where(x => x.SubSystemId == upSubSystemId && x.MapSubSystemId == subSystemId &&
+ x.TrackContentCode == trackCode)
+ .Select(x => x.MapTrackContentCode)
+ .FirstAsync();
+ }
}
\ No newline at end of file
diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs
index 8e9106da..8be1ec1a 100644
--- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs
+++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs
@@ -53,12 +53,16 @@ public class OrderRepository : BasicRepository, IOrderRepository, I
#region 订单关联
- public async Task> GetLinkedOrderIdsAsync(int orderId)
+ public async Task> GetLinkedOrdersAsync(int orderId)
{
return await Context.Queryable()
.LeftJoin((a, b) => a.Id == b.OrderId)
.Where(a => a.Id == orderId)
- .Select((a, b) => b.LinkOrderId)
+ .Select((a, b) => new LinkedOrderVO
+ {
+ OrderId = b.LinkOrderId,
+ SubSystemId = a.SubSystemId
+ })
.ToListAsync();
}
diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs
index b5632055..c0ca92e4 100644
--- a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs
+++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs
@@ -1,5 +1,6 @@
using Nest;
using SJZY.Expand.ElasticSearch.Services;
+using SJZY.Track.Domain;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Dtos.TrackDetails;
@@ -8,7 +9,7 @@ namespace SJZY.Track.Repository.Repositories;
internal class TrackDetailsRepository : ElasticSearchContextAbstract, ITrackDetailsRepository,
ITransientDependency
{
- public string IndexName => $"{TrackDetailsIndex.IndexName}-{DateTime.Now:yyyy.MM.dd}";
+ public string IndexName => $"{GlobalConst.TrackIndex}-{DateTime.Now:yyyy.MM.dd}";
public TrackDetailsRepository(ConnectionFactory connectionFactory) : base(connectionFactory)
{
@@ -17,7 +18,7 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract GetFirstOrDefaultAsync(int orderId, string trackCode)
{
var r = await Context.SearchAsync(s => s
- .Index($"{TrackDetailsIndex.IndexName}-{DateTime.Now:yyyy.MM.dd}")
+ .Index(IndexName)
.Query(q =>
q.Term(t => t.Field(f => f.OrderId).Value(orderId))
&& q.Term(t => t.Field(f => f.TrackCode).Value(trackCode))
@@ -32,24 +33,18 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract(index.Id, u => u
.Index(IndexName)
.Doc(index)
- //.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见
+ .DocAsUpsert()
+ //.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见
);
if (!response.IsValid)
throw new Exception($"数据修改失败,原因:{response.DebugInformation}");
}
- public async Task CreateAsync(TrackDetailsIndex index)
- {
- var response = await Context.IndexAsync(index, request => request.Index(IndexName));
- if (!response.IsValid)
- throw new Exception($"数据添加失败,原因:{response.DebugInformation}");
- }
-
public async Task> GetListAsync(int orderType, List orderNos)
{
if (orderNos.Count < 1) return new List();