From 5fa20966ab43a6c9133b781dbed0ab9ec98b4af2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com>
Date: Sat, 2 Mar 2024 15:34:26 +0800
Subject: [PATCH 1/2] =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E5=8F=91=E7=94=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Events/TrackUpsertEvent.cs | 12 ++++-
.../Events/UpdateOrderTrackEvent.cs | 34 +++++++++++++
.../Services/ITrackPushCacheService.cs | 18 +++++++
.../EventHandlers/TrackUpsertEventHandler.cs | 51 +++++++++++++------
.../UpdateOrderTrackEventHandler.cs | 38 ++++++++++++++
.../ProvideServices/OrderLinkService.cs | 20 +++++---
.../Services/ProvideServices/TrackService.cs | 4 +-
.../TrackPush/TrackPushCacheService.cs | 38 ++++++++++++++
.../TrackDetailsIndex.cs | 8 +--
.../Dtos/Order/LinkedOrderVO.cs | 20 ++++++++
.../Dtos/TrackDetails/MatchTrackContentDto.cs | 5 ++
src/SJZY.Track.Domain/GlobalConst.cs | 17 +++++--
.../Queries/TrackQueries.cs | 7 ++-
.../Repositories/OrderRepository.cs | 15 ++++--
14 files changed, 248 insertions(+), 39 deletions(-)
create mode 100644 src/SJZY.Track.Application.Contract/Events/UpdateOrderTrackEvent.cs
create mode 100644 src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs
create mode 100644 src/SJZY.Track.Application/EventHandlers/UpdateOrderTrackEventHandler.cs
create mode 100644 src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs
diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs
index ad0fe356..16d8c9ce 100644
--- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs
+++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs
@@ -8,12 +8,22 @@ public class TrackUpsertEvent : UpsertTrackInput
/// 订单id
///
public int OrderId { get; set; }
-
+
+ ///
+ /// 客户id
+ ///
+ public int CustomId { get; set; }
+
///
/// 子系统id
///
public int SubSystemId { get; set; }
+ ///
+ /// 订单是否推送完成(异步维护)
+ ///
+ public bool IsPushCompleted { get; set; }
+
///
/// 上游子系统id
///
diff --git a/src/SJZY.Track.Application.Contract/Events/UpdateOrderTrackEvent.cs b/src/SJZY.Track.Application.Contract/Events/UpdateOrderTrackEvent.cs
new file mode 100644
index 00000000..a92678d7
--- /dev/null
+++ b/src/SJZY.Track.Application.Contract/Events/UpdateOrderTrackEvent.cs
@@ -0,0 +1,34 @@
+namespace SJZY.Track.Application.Contract.Events;
+
+public class UpdateOrderTrackEvent
+{
+ ///
+ /// 订单Id
+ ///
+ public int OrderId { get; set; }
+
+ ///
+ /// 此次发生的轨迹是否意味完成
+ ///
+ public bool IsCompleted { get; set; }
+
+ ///
+ /// 轨迹内容
+ ///
+ public string TrackContent { get; set; } = null!;
+
+ ///
+ /// 轨迹内容英文
+ ///
+ public string TrackEnContent { get; set; } = null!;
+
+ ///
+ /// 轨迹发生地
+ ///
+ public string TrackPlace { get; set; } = null!;
+
+ ///
+ /// 轨迹发生时间
+ ///
+ public DateTime TrackTime { get; set; }
+}
\ No newline at end of file
diff --git a/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs b/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs
new file mode 100644
index 00000000..04369975
--- /dev/null
+++ b/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs
@@ -0,0 +1,18 @@
+namespace SJZY.Track.Application.Contract.Services;
+
+public interface ITrackPushCacheService
+{
+ ///
+ /// 判断客户是否需要推送
+ ///
+ ///
+ ///
+ Task IsPushAsync(int customId);
+
+ ///
+ /// 更新缓存
+ ///
+ ///
+ ///
+ Task UpdateAsync(int customId, bool isPush);
+}
\ 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 220607ab..5f8d9466 100644
--- a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs
+++ b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs
@@ -1,6 +1,7 @@
using DotNetCore.CAP;
using SJZY.Expand.ABP.Core.PublicMethords;
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.Queries;
@@ -14,29 +15,33 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
private readonly IOrderRepository _orderRepository;
private readonly ITrackQueries _trackQueries;
private readonly ITrackDetailsRepository _trackDetailsRepository;
+ private readonly ITrackPushCacheService _trackPushCacheService;
private readonly ICapPublisher _capPublisher;
public TrackUpsertEventHandler(IOrderRepository orderRepository, ICapPublisher capPublisher,
- ITrackQueries trackQueries, ITrackDetailsRepository trackDetailsRepository)
+ ITrackQueries trackQueries, ITrackDetailsRepository trackDetailsRepository,
+ ITrackPushCacheService trackPushCacheService)
{
_orderRepository = orderRepository;
_capPublisher = capPublisher;
_trackQueries = trackQueries;
_trackDetailsRepository = trackDetailsRepository;
+ _trackPushCacheService = trackPushCacheService;
}
- [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);
+ var mapCode = await _trackQueries
+ .MapTrackContentCodeAsync(@event.UpSubSystemId, @event.SubSystemId, @event.TrackCode);
if (mapCode == default)
{
- throw new BusinessException(message: "订单跨子系统,未配置内容映射,请联系管理员");
+ //throw new BusinessException(message: "订单跨子系统,未配置内容映射,请联系管理员");
+ return;
}
@event.TrackCode = mapCode;
@@ -50,15 +55,17 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
// 不存在则新增轨迹,存在则更新
var track = await _trackDetailsRepository.GetFirstOrDefaultAsync(@event.OrderId, @event.TrackCode);
- var isPush = false; // 推送只做新增的,更新和删除的不做先
+ var orderIsCompleted = 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}");
+ //throw new BusinessException(message: $"订单:{@event.OrderNo} 所绑定的模板,没有一条内容可以匹配轨迹代码:{@event.TrackCode}");
+ return;
}
+ orderIsCompleted = trackContent.IsCompleted;
track = new TrackDetailsIndex
{
@@ -72,22 +79,37 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
TrackPlace = @event.TrackPlace,
TrackTime = @event.TrackTime,
TraceTimeZone = @event.TraceTimeZone,
- CreateUserId = CurrentUserRequest.CurrentUser.UserId,
+ CreateUser = CurrentUserRequest.CurrentUser.Name,
CreateTime = DateTime.Now
};
-
- isPush = true;
+
+ // todo:推送只做新增的,更新和删除的不做先
+ if (!@event.IsPushCompleted && await _trackPushCacheService.IsPushAsync(@event.CustomId))
+ {
+ //await PushTrack();
+ }
}
else
{
track.TrackPlace = @event.TrackPlace;
track.TrackTime = @event.TrackTime;
track.TraceTimeZone = @event.TraceTimeZone;
- track.UpdateUserId = CurrentUserRequest.CurrentUser.UserId;
+ track.UpdateUser = CurrentUserRequest.CurrentUser.Name;
track.UpdateTime = DateTime.Now;
}
await _trackDetailsRepository.UpsertAsync(track);
+
+ // 触发订单主表更新事件
+ await _capPublisher.PublishAsync(GlobalConst.UpdateOrderTrackSubscribe, new UpdateOrderTrackEvent
+ {
+ OrderId = track.OrderId,
+ IsCompleted = orderIsCompleted,
+ TrackContent = track.TrackContent,
+ TrackEnContent = track.TrackEnContent,
+ TrackPlace = track.TrackPlace,
+ TrackTime = track.TrackTime
+ });
// 根据订单关联关系异步向下刷
var linkedOrders = await _orderRepository.GetLinkedOrdersAsync(@event.OrderId);
@@ -95,14 +117,13 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
{
var nextEvent = @event.DeepCopy();
nextEvent.OrderId = linkedOrder.OrderId;
+ nextEvent.OrderType = linkedOrder.OrderType;
+ nextEvent.OrderNo = linkedOrder.OrderNo;
nextEvent.SubSystemId = linkedOrder.SubSystemId;
+ nextEvent.IsPushCompleted = linkedOrder.IsPushCompleted;
+ nextEvent.CustomId = linkedOrder.CustomId;
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/EventHandlers/UpdateOrderTrackEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/UpdateOrderTrackEventHandler.cs
new file mode 100644
index 00000000..b9ec2dd6
--- /dev/null
+++ b/src/SJZY.Track.Application/EventHandlers/UpdateOrderTrackEventHandler.cs
@@ -0,0 +1,38 @@
+using DotNetCore.CAP;
+using SJZY.Track.Application.Contract.Events;
+using SJZY.Track.Domain.Aggregates.OrderAggregate;
+using Volo.Abp.DependencyInjection;
+
+namespace SJZY.Track.Application.EventHandlers;
+
+public class UpdateOrderTrackEventHandler : ITransientDependency, ICapSubscribe
+{
+ private readonly IOrderRepository _orderRepository;
+
+ public UpdateOrderTrackEventHandler(IOrderRepository orderRepository)
+ {
+ _orderRepository = orderRepository;
+ }
+
+ [CapSubscribe(GlobalConst.UpdateOrderTrackSubscribe)]
+ public async Task ConsumerAsync(UpdateOrderTrackEvent @event)
+ {
+ var order = await _orderRepository.GetFirstAsync(x => x.Id == @event.OrderId);
+ if (order == default) return;
+
+ if (order.IsCompleted) return;
+
+ if (order.LatestTrackTime > @event.TrackTime) return;
+
+ order.LatestTrackContent = @event.TrackContent;
+ order.LatestTrackEnContent = @event.TrackEnContent;
+ order.LatestTrackPlace = @event.TrackPlace;
+ order.LatestTrackTime = @event.TrackTime;
+ if (@event.IsCompleted) order.IsCompleted = true;
+
+ await _orderRepository.UpdateColumnAsync(order, x => new
+ {
+ x.IsCompleted, x.LatestTrackContent, x.LatestTrackEnContent, x.LatestTrackPlace, x.LatestTrackTime
+ });
+ }
+}
\ No newline at end of file
diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderLinkService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderLinkService.cs
index f0261697..50490d04 100644
--- a/src/SJZY.Track.Application/Services/ProvideServices/OrderLinkService.cs
+++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderLinkService.cs
@@ -27,9 +27,11 @@ public class OrderLinkService : ApplicationService
[HttpPost("Order/Link")]
public async Task LinkOrderAsync(LinkOrderInput input)
{
- if (!await _orderRepository.IsAnyAsync(x => x.OrderType == input.OrderType && x.OrderNo == input.OrderNo))
+ var orderId = await _orderRepository.GetFirstAsync(x =>
+ x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, x => x.Id);
+ if (orderId == default)
{
- throw new BusinessException(message: $"单号:{input.OrderNo}不存在");
+ throw new BusinessException(message: $"订单:{input.OrderNo}不存在");
}
if (input.LinkOrderNos.Count < 1 || input.LinkOrderType == 0) return true;
@@ -41,10 +43,10 @@ public class OrderLinkService : ApplicationService
if (!input.IsLink) return await UnLinkOrderAsync(input);
// 关联订单
- return await DoLinkOrderAsync(input);
+ return await DoLinkOrderAsync(input, orderId);
}
- private async Task DoLinkOrderAsync(LinkOrderInput input)
+ private async Task DoLinkOrderAsync(LinkOrderInput input, int orderId)
{
// 获取已关联的订单
var linkOrderNos = await _orderLinkQuery.GetListAsync(x =>
@@ -55,15 +57,17 @@ public class OrderLinkService : ApplicationService
var noLinkOrderNos = input.LinkOrderNos.Except(linkOrderNos);
// 过滤掉不存在的订单
- var canLinkOrderNos = await _orderRepository.GetListAsync(x =>
+ var canLinkOrders = await _orderRepository.GetListAsync(x =>
x.OrderType == input.LinkOrderType && noLinkOrderNos.Contains(x.OrderNo),
- x => x.OrderNo);
+ x => new { x.Id, x.OrderNo });
- await _orderRepository.LinkOrderAsync(canLinkOrderNos.Select(x => new OrderLinkEntity
+ await _orderRepository.LinkOrderAsync(canLinkOrders.Select(x => new OrderLinkEntity
{
+ OrderId = orderId,
OrderNo = input.OrderNo,
OrderType = input.OrderType,
- LinkOrderNo = x,
+ LinkOrderId = x.Id,
+ LinkOrderNo = x.OrderNo,
LinkOrderType = input.LinkOrderType
}).ToList());
diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs
index d7cc59e3..dacb87fe 100644
--- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs
+++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs
@@ -32,7 +32,7 @@ public class TrackService : ApplicationService
var order = await _orderRepository.GetFirstAsync(x =>
x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, x => new
{
- x.Id, x.SubSystemId, x.IsPushCompleted
+ x.Id, x.SubSystemId, x.IsPushCompleted, x.CustomId
});
if (order == default)
{
@@ -43,6 +43,8 @@ public class TrackService : ApplicationService
var @event = ObjectMapper.Map(input);
@event.OrderId = order.Id;
@event.SubSystemId = order.SubSystemId;
+ @event.IsPushCompleted = order.IsPushCompleted;
+ @event.CustomId = order.CustomId;
await _trackUpsertEventHandler.UpsertTrackAsync(@event);
return true;
}
diff --git a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs
new file mode 100644
index 00000000..468d69a8
--- /dev/null
+++ b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs
@@ -0,0 +1,38 @@
+using SJZY.Expand.ABP.Core;
+using SJZY.Track.Application.Contract.Services;
+using SJZY.Track.Domain.Aggregates.TrackPushAggregate;
+using SJZY.Track.Domain.Queries;
+using Volo.Abp.DependencyInjection;
+
+namespace SJZY.Track.Application.Services.TrackPush;
+
+public class TrackPushCacheService:ITrackPushCacheService, ITransientDependency
+{
+ private readonly IBasicQuery _trackPushConfigQuery;
+ private string RedisKey(int customId) => GlobalConst.TrackPushKeyPrefix + customId;
+
+ public TrackPushCacheService(IBasicQuery trackPushConfigQuery)
+ {
+ _trackPushConfigQuery = trackPushConfigQuery;
+ }
+
+ public async Task IsPushAsync(int customId)
+ {
+ var isPush =
+ await RedisHelper.Client.GetAsync(RedisKey(customId));
+
+ if (isPush == null)
+ {
+ isPush = await _trackPushConfigQuery.GetFirstAsync(x => x.CustomId == customId,
+ x => x.IsAutoPush);
+ await RedisHelper.Client.SetAsync(RedisKey(customId), isPush);
+ }
+
+ return (bool)isPush;
+ }
+
+ public async Task UpdateAsync(int customId, bool isPush)
+ {
+ await RedisHelper.Client.SetAsync(RedisKey(customId), isPush);
+ }
+}
\ No newline at end of file
diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs
index 35857507..6a330083 100644
--- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs
+++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs
@@ -74,14 +74,14 @@ public class TrackDetailsIndex : IdBaseIndex
/// 删除标记 0正常 1 已删除
public bool IsDeleted { get; set; }
- /// 创建人id
- public int CreateUserId { get; set; }
+ /// 创建人
+ public string? CreateUser { get; set; }
/// 创建时间
public DateTime CreateTime { get; set; }
- /// 修改人id
- public int? UpdateUserId { get; set; }
+ /// 修改人
+ public string? UpdateUser { get; set; }
/// 修改时间
public DateTime? UpdateTime { get; set; }
diff --git a/src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs b/src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs
index 5d1c7327..c0344880 100644
--- a/src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs
+++ b/src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs
@@ -6,9 +6,29 @@ public class LinkedOrderVO
/// 关联订单id
///
public int OrderId { get; set; }
+
+ ///
+ /// 订单号
+ ///
+ public string OrderNo { get; set; } = null!;
+
+ ///
+ /// 订单类型(主数据枚举TrackOrderType)
+ ///
+ public int OrderType { get; set; }
///
/// 子系统id
///
public int SubSystemId { get; set; }
+
+ ///
+ /// 订单是否推送完成(异步维护)
+ ///
+ public bool IsPushCompleted { get; set; }
+
+ ///
+ /// 客户id
+ ///
+ public int CustomId { 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 ced59e19..2c2a366d 100644
--- a/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs
+++ b/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs
@@ -16,4 +16,9 @@ public class MatchTrackContentDto
/// 轨迹状态
///
public string Status { get; set; } = null!;
+
+ ///
+ /// 是否意味着完成
+ ///
+ public bool IsCompleted { get; set; }
}
\ No newline at end of file
diff --git a/src/SJZY.Track.Domain/GlobalConst.cs b/src/SJZY.Track.Domain/GlobalConst.cs
index 77881f20..f4ae0ff0 100644
--- a/src/SJZY.Track.Domain/GlobalConst.cs
+++ b/src/SJZY.Track.Domain/GlobalConst.cs
@@ -3,12 +3,23 @@
public class GlobalConst
{
///
- /// 轨迹明细es索引名称
+ /// 轨迹明细 es索引名称
///
public const string TrackIndex = "sjzy_track_details";
///
- /// 轨迹新增/更新cap订阅名称
+ /// 轨迹新增/更新 mq订阅名称
///
- public const string TrackUpsertSubscribe = "SJZY.Track.Upsert";
+ public const string TrackUpsertSubscribe = "SJZY.Track.TrackUpsert";
+
+ ///
+ /// 轨迹新增/更新后触发更新订单轨迹 mq订阅名称
+ ///
+ public const string UpdateOrderTrackSubscribe = "SJZY.Track.UpdateOrderTrack";
+
+
+ ///
+ /// 轨迹要推送的客户redis key前缀
+ ///
+ public const string TrackPushKeyPrefix = "TrackPush:";
}
\ 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 a1e5168a..814649fe 100644
--- a/src/SJZY.Track.Repository/Queries/TrackQueries.cs
+++ b/src/SJZY.Track.Repository/Queries/TrackQueries.cs
@@ -1,5 +1,6 @@
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackContentAggregate;
+using SJZY.Track.Domain.Aggregates.TrackFlagAggregate;
using SJZY.Track.Domain.Aggregates.TrackStatusAggregate;
using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate;
using SJZY.Track.Domain.Dtos.Order;
@@ -66,12 +67,14 @@ public class TrackQueries : ISugarRepository, ITrackQueries,
.LeftJoin((x, a) => x.TrackTemplateId == a.TrackTemplateId)
.LeftJoin((x, a, b) => a.TrackContentId == b.Id)
.LeftJoin((x, a, b, c) => b.TrackStatusId == c.Id)
+ .LeftJoin((x, a, b, c, d) => b.TrackFlagId == d.Id)
.Where((x, a, b) => x.OrderId == orderId && b.Code == code)
- .Select((x, a, b, c) => new MatchTrackContentDto
+ .Select((x, a, b, c,d) => new MatchTrackContentDto
{
Content = b.Content,
EnContent = b.EnContent,
- Status = c.Status
+ Status = c.Status,
+ IsCompleted = d.IsCompleted
})
.FirstAsync();
}
diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs
index 8be1ec1a..a590a496 100644
--- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs
+++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs
@@ -55,13 +55,18 @@ public class OrderRepository : BasicRepository, IOrderRepository, I
public async Task> GetLinkedOrdersAsync(int orderId)
{
- return await Context.Queryable()
- .LeftJoin((a, b) => a.Id == b.OrderId)
+ return await Context.Queryable()
+ .LeftJoin((a , b) => a.Id == b.OrderId)
+ .LeftJoin((a, b, c) => b.LinkOrderId == c.Id)
.Where(a => a.Id == orderId)
- .Select((a, b) => new LinkedOrderVO
+ .Select((a, b,c) => new LinkedOrderVO
{
- OrderId = b.LinkOrderId,
- SubSystemId = a.SubSystemId
+ OrderId = c.Id,
+ OrderType = c.OrderType,
+ OrderNo = c.OrderNo,
+ SubSystemId = c.SubSystemId,
+ IsPushCompleted = c.IsPushCompleted,
+ CustomId = c.CustomId
})
.ToListAsync();
}
From 6da3e0748ce6c1931795771bc072165f3504e9db Mon Sep 17 00:00:00 2001
From: moyongzhen <2534173414@qq.com>
Date: Sat, 2 Mar 2024 15:52:12 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E5=86=85=E5=AE=B9?=
=?UTF-8?q?=E5=88=A0=E9=99=A4=E6=A0=A1=E9=AA=8C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Services/TrackContents/TrackContentService.cs | 13 ++++++++++++-
.../EditTrackContentMapInputValidation.cs | 10 +++++-----
2 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs
index 9c872bf2..9490f1d3 100644
--- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs
+++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs
@@ -7,6 +7,7 @@ using SJZY.Track.Application.Contract.Dtos.TrackPull;
using SJZY.Track.Application.Localization;
using SJZY.Track.Domain.Aggregates.TrackContentAggregate;
using SJZY.Track.Domain.Aggregates.TrackPullAggregate;
+using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate;
using SJZY.Track.Domain.Dtos.TrackContents;
using SJZY.Track.Domain.Queries;
using System.Linq.Expressions;
@@ -24,16 +25,19 @@ namespace SJZY.Track.Application.Services.TrackContents
private readonly IStringLocalizer _stringLocalizer;
private readonly ITrackContentRepository _trackContentRepository;
private readonly IBasicQuery _trackContentMapBasicQuery;
+ private readonly IBasicQuery _trackTemplateContentBasicQuery;
public TrackContentService(
IStringLocalizer stringLocalizer,
ITrackContentRepository trackContentRepository,
- IBasicQuery trackContentMapBasicQuery
+ IBasicQuery trackContentMapBasicQuery,
+ IBasicQuery trackTemplateContentBasicQuery
)
{
this._stringLocalizer = stringLocalizer;
this._trackContentRepository = trackContentRepository;
this._trackContentMapBasicQuery=trackContentMapBasicQuery;
+ this._trackTemplateContentBasicQuery=trackTemplateContentBasicQuery;
}
///
@@ -161,6 +165,13 @@ namespace SJZY.Track.Application.Services.TrackContents
{
#region 业务校验
+ //查询是否关联了轨迹模版内容
+ var trackTemplateContents = await _trackTemplateContentBasicQuery.GetListAsync(a => a.TrackContentId==input.Id);
+ if (trackTemplateContents.Any())
+ {
+ throw new BusinessException(message: "该轨迹内容关联轨迹模板,禁止删除");
+ }
+
//需要加个判断,存在内容映射,则出提示
var trackContentMapEntities = await _trackContentMapBasicQuery.GetListAsync(a => a.TrackContentId==input.Id|| a.MapTrackContentId==input.Id);
if (trackContentMapEntities.Any())
diff --git a/src/SJZY.Track.Application/Validations/TrackContents/EditTrackContentMapInputValidation.cs b/src/SJZY.Track.Application/Validations/TrackContents/EditTrackContentMapInputValidation.cs
index b4cf3ed8..90a334a9 100644
--- a/src/SJZY.Track.Application/Validations/TrackContents/EditTrackContentMapInputValidation.cs
+++ b/src/SJZY.Track.Application/Validations/TrackContents/EditTrackContentMapInputValidation.cs
@@ -12,7 +12,7 @@ public class EditTrackContentMapInputValidation : AbstractValidator x.Options).IsInEnum().WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_IsInEnum, nameof(EditTrackContentMapInput.Options)]);
- RuleFor(x => x.Id).GreaterThan(0).WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_GreaterThan, nameof(EditTrackContentMapInput.Id), 0]);
+ //RuleFor(x => x.Id).GreaterThan(0).WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_GreaterThan, nameof(EditTrackContentMapInput.Id), 0]);
RuleFor(x => x.MapSubSystemId).GreaterThan(0).WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_GreaterThan, nameof(EditTrackContentMapInput.MapSubSystemId), 0]);
@@ -22,10 +22,10 @@ public class EditTrackContentMapInputValidation : AbstractValidator x.TrackContentId).GreaterThan(0).WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_GreaterThan, nameof(EditTrackContentMapInput.TrackContentId), 0]);
- When(x => x.Options != OptionTypeNoNull.新增, () =>
- {
- RuleFor(x => x.Id).NotNull().WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_NotNull, nameof(EditTrackContentMapInput.Id)]);
- });
+ //When(x => x.Options != OptionTypeNoNull.新增, () =>
+ //{
+ // RuleFor(x => x.Id).NotNull().WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_NotNull, nameof(EditTrackContentMapInput.Id)]);
+ //});
When(x => x.Options != OptionTypeNoNull.删除, () =>
{