From 4f5f8b4cfa2bad160df363326b6daa31f9f67f73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Mon, 21 Oct 2024 09:12:04 +0800 Subject: [PATCH 01/75] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20=5F=3DTask.Ru?= =?UTF-8?q?n()=20=E4=BD=BF=E7=94=A8abp=E7=9A=84ApplicationService=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E7=9A=84LazyServiceProvider=E5=88=9B=E5=BB=BAscope?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=E5=B5=8C=E5=A5=97scope=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E7=9A=84=E5=BC=82=E5=B8=B8=20=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E6=96=B9=E6=B3=95=EF=BC=9A=E4=BF=AE=E6=94=B9=E4=B8=BA?= =?UTF-8?q?IServiceScopeFactory=E5=88=9B=E5=BB=BAscope=E7=9A=84=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TimerTaskss/TrackPullTask.cs | 9 ++++++++- .../Services/TimerTaskss/TrackPushTask.cs | 9 ++++++++- .../Services/TimerTaskss/TrackWarningTask.cs | 7 +++++-- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/SJZY.Track.Application/Services/TimerTaskss/TrackPullTask.cs b/src/SJZY.Track.Application/Services/TimerTaskss/TrackPullTask.cs index 460bd655..6bd0edb1 100644 --- a/src/SJZY.Track.Application/Services/TimerTaskss/TrackPullTask.cs +++ b/src/SJZY.Track.Application/Services/TimerTaskss/TrackPullTask.cs @@ -22,6 +22,13 @@ namespace SJZY.Track.Application.Services.TimerTaskss; [ApiExplorerSettings(GroupName = "定时任务")] public class TrackPullTask : ApplicationService, ISingletonDependency { + private readonly IServiceScopeFactory _serviceScopeFactory; + + public TrackPullTask(IServiceScopeFactory serviceScopeFactory) + { + _serviceScopeFactory = serviceScopeFactory; + } + /// /// 定时任务刷新轨迹 /// @@ -30,7 +37,7 @@ public class TrackPullTask : ApplicationService, ISingletonDependency [HttpPost("/TimerTask/Refresh")] public async Task RefreshForTaskAsync() { - using var serviceScope = LazyServiceProvider.CreateScope(); + using var serviceScope = _serviceScopeFactory.CreateScope(); var provideQueries = serviceScope.ServiceProvider.GetRequiredService(); var configs = await provideQueries.GetAllPullConfigsAsync(); diff --git a/src/SJZY.Track.Application/Services/TimerTaskss/TrackPushTask.cs b/src/SJZY.Track.Application/Services/TimerTaskss/TrackPushTask.cs index 928b54e9..47f150de 100644 --- a/src/SJZY.Track.Application/Services/TimerTaskss/TrackPushTask.cs +++ b/src/SJZY.Track.Application/Services/TimerTaskss/TrackPushTask.cs @@ -13,6 +13,13 @@ namespace SJZY.Track.Application.Services.TimerTaskss; [ApiExplorerSettings(GroupName = "定时任务")] public class TrackPushTask : ApplicationService { + private readonly IServiceScopeFactory _serviceScopeFactory; + + public TrackPushTask(IServiceScopeFactory serviceScopeFactory) + { + _serviceScopeFactory = serviceScopeFactory; + } + /// /// 定时任务推送预警(》12小时没有推送的) /// @@ -21,7 +28,7 @@ public class TrackPushTask : ApplicationService [HttpPost("/TimerTask/PushWarn")] public async Task PushWarnForTaskAsync() { - using var serviceScope = LazyServiceProvider.CreateScope(); + using var serviceScope = _serviceScopeFactory.CreateScope(); var configs = serviceScope.ServiceProvider.GetRequiredService>() .Value; diff --git a/src/SJZY.Track.Application/Services/TimerTaskss/TrackWarningTask.cs b/src/SJZY.Track.Application/Services/TimerTaskss/TrackWarningTask.cs index 655f2995..7696262d 100644 --- a/src/SJZY.Track.Application/Services/TimerTaskss/TrackWarningTask.cs +++ b/src/SJZY.Track.Application/Services/TimerTaskss/TrackWarningTask.cs @@ -16,11 +16,14 @@ public class TrackWarningTask : ApplicationService { private readonly IOptionsSnapshot _options; private readonly IOrderRepository _orderRepository; + private readonly IServiceScopeFactory _serviceScopeFactory; - public TrackWarningTask(IOrderRepository orderRepository, IOptionsSnapshot options) + public TrackWarningTask(IOrderRepository orderRepository, IOptionsSnapshot options, + IServiceScopeFactory serviceScopeFactory) { _orderRepository = orderRepository; _options = options; + _serviceScopeFactory = serviceScopeFactory; } /// @@ -63,7 +66,7 @@ public class TrackWarningTask : ApplicationService { try { - using var serviceScope = LazyServiceProvider.CreateScope(); + using var serviceScope = _serviceScopeFactory.CreateScope(); var forewarningNotifyService = serviceScope.ServiceProvider.GetRequiredService(); From c9a2e8d824c81ddb28254e23504138dabaee7ec3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Tue, 22 Oct 2024 14:34:46 +0800 Subject: [PATCH 02/75] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E7=94=9F=E5=91=BD=E5=91=A8=E6=9C=9F=E5=A3=B0=E6=98=8E?= =?UTF-8?q?=E4=B8=BA=E5=8D=95=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TimerTaskss/TrackWarningTask.cs | 3 ++- .../Services/TrackPush/TrackPushService.cs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/SJZY.Track.Application/Services/TimerTaskss/TrackWarningTask.cs b/src/SJZY.Track.Application/Services/TimerTaskss/TrackWarningTask.cs index 7696262d..3b9a93d3 100644 --- a/src/SJZY.Track.Application/Services/TimerTaskss/TrackWarningTask.cs +++ b/src/SJZY.Track.Application/Services/TimerTaskss/TrackWarningTask.cs @@ -5,6 +5,7 @@ using SJZY.Expand.ABP.Core.Logger; using SJZY.Track.Application.Contract.Services; using SJZY.Track.Application.Track2InterfaceRelay; using SJZY.Track.Domain.Aggregates.OrderAggregate; +using Volo.Abp.DependencyInjection; namespace SJZY.Track.Application.Services.TimerTaskss; @@ -12,7 +13,7 @@ namespace SJZY.Track.Application.Services.TimerTaskss; /// 轨迹运输时效预警定时任务 /// [ApiExplorerSettings(GroupName = "定时任务")] -public class TrackWarningTask : ApplicationService +public class TrackWarningTask : ApplicationService, ISingletonDependency { private readonly IOptionsSnapshot _options; private readonly IOrderRepository _orderRepository; diff --git a/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs b/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs index 93a5e4c7..66e95cf2 100644 --- a/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs +++ b/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs @@ -8,6 +8,7 @@ using SJZY.Track.Application.Localization; using SJZY.Track.Domain.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Dtos.Common; using SJZY.Track.Domain.Dtos.TrackPush; +using Volo.Abp.DependencyInjection; namespace SJZY.Track.Application.Services.TrackPush; @@ -16,7 +17,7 @@ namespace SJZY.Track.Application.Services.TrackPush; /// [ApiExplorerSettings(GroupName = "轨迹推送")] [Route("/Track/PushConfig")] -public class TrackPushService : ApplicationService +public class TrackPushService : ApplicationService, ISingletonDependency { private readonly IStringLocalizer _stringLocalizer; private readonly ITrackPushCacheService _trackPushCacheService; From 07663e2ab056bfac18e340f2ba7c21baa6e94ba8 Mon Sep 17 00:00:00 2001 From: eli Date: Mon, 11 Nov 2024 14:49:21 +0800 Subject: [PATCH 03/75] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/ProvideServices/GetDetailTimelineInput.cs | 0 .../Dtos/ProvideServices/GetDetailTimelineOutput.cs | 0 .../Dtos/TrackContents/GetAvailableContentInput.cs | 0 .../Dtos/TrackContents/GetAvailableContentOutput.cs | 0 .../Dtos/TrackContents/GetTrackContentByCodeInput.cs | 0 .../Dtos/TrackContents/GetTrackContentByCodeOutput.cs | 0 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineInput.cs create mode 100644 src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineOutput.cs create mode 100644 src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentInput.cs create mode 100644 src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs create mode 100644 src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetTrackContentByCodeInput.cs create mode 100644 src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetTrackContentByCodeOutput.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineInput.cs new file mode 100644 index 00000000..e69de29b diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineOutput.cs new file mode 100644 index 00000000..e69de29b diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentInput.cs new file mode 100644 index 00000000..e69de29b diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs new file mode 100644 index 00000000..e69de29b diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetTrackContentByCodeInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetTrackContentByCodeInput.cs new file mode 100644 index 00000000..e69de29b diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetTrackContentByCodeOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetTrackContentByCodeOutput.cs new file mode 100644 index 00000000..e69de29b From 409c2e6281f8da1ffc523c564af6a41b170b4ef3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Wed, 13 Nov 2024 10:33:07 +0800 Subject: [PATCH 04/75] =?UTF-8?q?update:=20=E6=9B=B4=E6=96=B0=EF=BC=88Trac?= =?UTF-8?q?kDetailsIndex=EF=BC=89=E8=BD=A8=E8=BF=B9=E6=98=8E=E7=BB=86ES?= =?UTF-8?q?=E6=8C=81=E4=B9=85=E5=8C=96=E5=AF=B9=E8=B1=A1=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TrackDetailsIndex.cs | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index a89fb67e..4d5361a2 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -106,4 +106,54 @@ public class TrackDetailsIndex : IdBaseIndex /// 修改时间 /// public DateTime? UpdateTime { get; set; } + + /// + /// 客户是否可见 + /// + public int IsVisibility { get; set; } + + /// + /// 数据来源:1外部服务商创建,2内部系统创建,3人工创建 + /// + public int Source { get; set; } + + /// + /// 备注 + /// + public string? Remarks { get; set; } = GlobalConst.EmptyString; + + /// + /// 附件key,多个附件使用(,)分割 + /// + public string? Files { get; set; } = GlobalConst.EmptyString; + + /// + /// 轨迹发生地(城市) + /// + public string? TrackPlaceCity { get; set; } + + /// + /// 轨迹发生地(省/州) + /// + public string? TrackPlaceProvince { get; set; } + + /// + /// 轨迹发生地(国家/地区) + /// + public string? TrackPlaceNation { get; set; } + + /// + /// 轨迹发生地邮编 + /// + public string? TrackPlacePostcode { get; set; } + + /// + /// 预计签收时间 + /// + public DateTime? ExpectedReceiptTime { get; set; } + + /// + /// 签收地时区 + /// + public float? ReceiptTimeZone { get; set; } } From 895238782d3eb3d36e0d081701f25547e66f1a1f Mon Sep 17 00:00:00 2001 From: eli Date: Wed, 13 Nov 2024 10:26:20 +0800 Subject: [PATCH 05/75] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=8F=AF=E7=94=A8=E8=BD=A8=E8=BF=B9=E5=86=85=E5=AE=B9=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SJZY.Track.Api/appsettings.json | 2 +- .../ProvideServices/GetDetailTimelineInput.cs | 19 ++++ .../GetDetailTimelineOutput.cs | 54 +++++++++ .../TrackContents/EditTrackContentInput.cs | 20 ++++ .../TrackContents/GetAvailableContentInput.cs | 25 +++++ .../GetAvailableContentOutput.cs | 29 +++++ .../GetTrackContentByCodeInput.cs | 14 +++ .../GetTrackContentByCodeOutput.cs | 19 ++++ .../TrackContents/TrackContentService.cs | 103 +++++++++++++++++- .../Services/TrackOrders/TrackOrderService.cs | 73 ++++++++++++- .../Aggregates/OrderAggregate/OrderEntity.cs | 12 ++ .../ITrackContentRepository.cs | 2 + .../TrackContentEntity.cs | 30 +++++ .../Repositories/TrackContentRepository.cs | 24 +++- 14 files changed, 420 insertions(+), 6 deletions(-) diff --git a/src/SJZY.Track.Api/appsettings.json b/src/SJZY.Track.Api/appsettings.json index 41fc37c6..ac8a5882 100644 --- a/src/SJZY.Track.Api/appsettings.json +++ b/src/SJZY.Track.Api/appsettings.json @@ -7,7 +7,7 @@ "Apollo": { "AppId": "SJZY.Track.Configuration", "Env": "DEV", - "Namespace": "test", + "Namespace": "dev", "MetaServer": "http://apollo-service-test-apollo-configservice.apollo.svc.cluster.local:8080", "ConfigServer": [ "http://apollo-service-test-apollo-configservice.apollo.svc.cluster.local:8080" diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineInput.cs index e69de29b..9294efc0 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineInput.cs @@ -0,0 +1,19 @@ +namespace SJZY.Track.Application.Contract.Dtos.ProvideServices; + +public class GetDetailTimelineInput +{ + /// + /// 订单编号 + /// + public string OrderNumber { get; set; } + + /// + /// 子系统id + /// + public int SystemId{ get; set; } + + /// + /// 是否客户端,false时展示所有轨迹,true时只展示对外的轨迹 + /// + public bool IsCustomeClient { get; set; } +} diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineOutput.cs index e69de29b..a621240b 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineOutput.cs @@ -0,0 +1,54 @@ +namespace SJZY.Track.Application.Contract.Dtos.ProvideServices; + +public class GetDetailTimelineOutput +{ + /// + /// 轨迹编码 + /// + public string TrackCode { get; set; } + + /// + /// 轨迹内容 + /// + public string Content { get; set; } + + /// + /// 轨迹英文内容 + /// + public string EnContent { get; set; } + + /// + /// 轨迹发生地 + /// + public string TrackPlace { get; set; } = null!; + + /// + /// 轨迹发生时间 + /// + public long TrackTime { get; set; } + + /// + /// 轨迹时间前缀 + /// + public string TrackTimePrefix { get; set; } + + /// + /// 轨迹发生时区 + /// + public string TrackTimeZone { get; set; } + + /// + /// 备注 + /// + public string Remark { get; set; } + + /// + /// 文件 osskey 集合 + /// + public List Files { get; set; } + + /// + /// 是否高亮 + /// + public bool IsHighlight { get; set; } +} diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs index 6b7c663f..14b5461e 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs @@ -46,6 +46,26 @@ public class EditTrackContentInput /// 是否对外 /// public bool IsExternal { get; set; } + + /// + /// 是否可重复 + /// + public bool IsRepeatable { get; set; } + + /// + /// 是否允许手动修改 + /// + public bool IsAllowManuallyUpdate { get; set; } + + /// + /// 是否允许手动创建 + /// + public bool IsAllowManuallyCreate { get; set; } + + /// + /// 是否同步轨迹订单上的预计到达时间 + /// + public bool IsChangeOrderEdd { get; set; } } public class GetTrackContentDetailDto diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentInput.cs index e69de29b..fb6aa163 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentInput.cs @@ -0,0 +1,25 @@ +namespace SJZY.Track.Application.Contract.Dtos.TrackContents; + +public class GetAvailableContentInput +{ + /// + /// 子系统id + /// + public int SystemId { get; set; } + + /// + /// 订单号 + /// + public string? OrderNo { get; set; } + + /// + /// 操作类型 1=创建 2=修改 + /// + public TrackOptionType TrackOptionType { get; set; } +} + +public enum TrackOptionType +{ + 创建 = 1, + 修改 = 2 +} diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs index e69de29b..69e77773 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs @@ -0,0 +1,29 @@ +namespace SJZY.Track.Application.Contract.Dtos.TrackContents; + +public class GetAvailableContentOutput +{ + /// + /// Id + /// + public int Id { get; set; } + + /// + /// 轨迹内容代码 + /// + public string Code { get; set; } + + /// + /// 轨迹内容 + /// + public string Content { get; set; } + + /// + /// 轨迹内容英文 + /// + public string EnContent { get; set; } + + /// + /// 是否对外 + /// + public bool IsExternal { get; set; } +} diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetTrackContentByCodeInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetTrackContentByCodeInput.cs index e69de29b..8f7b1c85 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetTrackContentByCodeInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetTrackContentByCodeInput.cs @@ -0,0 +1,14 @@ +namespace SJZY.Track.Application.Contract.Dtos.TrackContents; + +public class GetTrackContentByCodeInput +{ + /// + /// 子系统id + /// + public int SystemId { get; set; } + + /// + /// 轨迹内容code + /// + public string Code { get; set; } +} diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetTrackContentByCodeOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetTrackContentByCodeOutput.cs index e69de29b..e584522d 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetTrackContentByCodeOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetTrackContentByCodeOutput.cs @@ -0,0 +1,19 @@ +namespace SJZY.Track.Application.Contract.Dtos.TrackContents; + +public class GetTrackContentByCodeOutput +{ + /// + /// 中文内容 + /// + public string Content { get; set; } + + /// + /// 英文内容 + /// + public string EnContent { get; set; } + + /// + /// 是否对外 + /// + public bool IsExternal { get; set; } +} diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index faf3f428..b4bea62f 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -2,9 +2,12 @@ using System.Linq.Expressions; using Microsoft.Extensions.Localization; using SJZY.Expand.ABP.Core.Localization; using SJZY.Expand.ABP.Core.PublicMethords; +using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Dtos.TrackContents; using SJZY.Track.Application.Localization; +using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackContentAggregate; +using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackFlagAggregate; using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; using SJZY.Track.Domain.Dtos.TrackContents; @@ -23,17 +26,23 @@ public class TrackContentService : ApplicationService private readonly ITrackContentRepository _trackContentRepository; private readonly IBasicQuery _trackFlagBasicQuery; private readonly IBasicQuery _trackStatusBasicQuery; + private readonly IOrderRepository _orderRepository; + private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; public TrackContentService( IStringLocalizer stringLocalizer, ITrackContentRepository trackContentRepository, IBasicQuery trackStatusBasicQuery, - IBasicQuery trackFlagBasicQuery) + IBasicQuery trackFlagBasicQuery, + IOrderRepository orderRepository, + ITrackDetailsEsRepository trackDetailsEsRepository) { _stringLocalizer = stringLocalizer; _trackContentRepository = trackContentRepository; _trackStatusBasicQuery = trackStatusBasicQuery; _trackFlagBasicQuery = trackFlagBasicQuery; + _orderRepository = orderRepository; + _trackDetailsEsRepository = trackDetailsEsRepository; } /// @@ -96,8 +105,7 @@ public class TrackContentService : ApplicationService /// /// [HttpPost("GetList")] - public async Task> GetPageTrackContent( - GetPageTrackContentInput input) + public async Task> GetPageTrackContent(GetPageTrackContentInput input) { var vo = ObjectMapper.Map(input); var resultDto = await _trackContentRepository.GetPageTrackContent(vo); @@ -181,6 +189,95 @@ public class TrackContentService : ApplicationService return true; } + /// + /// 根据轨迹内容code获取轨迹内容 + /// + /// + /// + [HttpPost("GetTrackContentByCode")] + public async Task> GetTrackContentByCodeAsync([FromBody] GetTrackContentByCodeInput input) + { + if (input.SystemId <= 0) + return new UnifyResultDto(false, "子系统Id必须大于等于0"); + + if (string.IsNullOrEmpty(input.Code)) + return new UnifyResultDto(false, "轨迹内容code不能为空"); + + var content = await _trackContentRepository.GetByCodeAsync(input.SystemId, input.Code); + if (content == null) + return new UnifyResultDto(false, "在当前子系统中未找到指定code的轨迹内容"); + + var res = new UnifyResultDto(true) + { + Data = new GetTrackContentByCodeOutput + { + Content = content.Content, + EnContent = content.EnContent, + IsExternal = content.IsExternal + } + }; + + return res; + } + + /// + /// 创建轨迹时获取可用的轨迹内容 + /// + /// + /// + [HttpPost("GetAvailableContent")] + public async Task>> GetAvailableContent(GetAvailableContentInput input) + { + if (input.SystemId <= 0) + return new UnifyResultDto>(false, "系统id需大于0!"); + + if (string.IsNullOrEmpty(input.OrderNo)) + return new UnifyResultDto>(false, "单号不能为空!"); + + //获取当前订单下已有的轨迹内容 + var orderId = await _orderRepository.GetFirstAsync(x => x.OrderNo == input.OrderNo && x.SubSystemId == input.SystemId, x => x.Id); + if (orderId == default) + throw new BusinessException(message: "订单不存在!"); + + //获取轨迹详情 + var trackDetails = await _trackDetailsEsRepository.GetListAsync(orderId); + + + //获取当前子系统下所有的轨迹内容 + var contentList = await _trackContentRepository.GetListBySystemIdAsync(input.SystemId); + if (contentList == null) + throw new BusinessException(message: "当前子系统下未找到任何可用的轨迹内容!"); + + + var res = new UnifyResultDto>(true) + { + Data = new List() + }; + + foreach (var item in contentList) + { + if (!item.IsRepeatable && trackDetails?.Any(m => m.TrackCode == item.Code) == true) //跳过已存在轨迹内容 + continue; + + if (!item.IsAllowManuallyCreate && input.TrackOptionType == TrackOptionType.创建) //跳过不允许手动创建的轨迹内容 + continue; + + if (!item.IsAllowManuallyUpdate && input.TrackOptionType == TrackOptionType.修改) //跳过不允许手动创建的轨迹内容 + continue; + + res.Data.Add(new GetAvailableContentOutput() + { + IsExternal = item.IsExternal, + EnContent = item.EnContent, + Content = item.Content, + Code = item.Code, + Id = item.Id + }); + } + + return res; + } + #region 私有方法 private async Task AddAsync(EditTrackContentInput input) diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index 7c7950dd..b1fff209 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -4,6 +4,7 @@ using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackContentAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackPushAggregate; +using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; using SJZY.Track.Domain.Dtos.Order; namespace SJZY.Track.Application.Services.TrackOrders; @@ -18,6 +19,7 @@ public class TrackOrderService : ApplicationService private readonly IOrderOperationRecordEsRepository _orderOperationRecordEsRepository; private readonly IOrderRepository _orderRepository; private readonly ITrackContentRepository _trackContentRepository; + private readonly ITrackStatusRepository _trackStatusRepository; private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; private readonly ITrackPushRecordEsRepository _trackPushRecordEsRepository; @@ -26,13 +28,15 @@ public class TrackOrderService : ApplicationService ITrackDetailsEsRepository trackDetailsEsRepository, ITrackContentRepository trackContentRepository, ITrackPushRecordEsRepository trackPushRecordEsRepository, - IOrderOperationRecordEsRepository orderOperationRecordEsRepository) + IOrderOperationRecordEsRepository orderOperationRecordEsRepository, + ITrackStatusRepository trackStatusRepository) { _orderRepository = orderRepository; _trackDetailsEsRepository = trackDetailsEsRepository; _trackContentRepository = trackContentRepository; _trackPushRecordEsRepository = trackPushRecordEsRepository; _orderOperationRecordEsRepository = orderOperationRecordEsRepository; + _trackStatusRepository = trackStatusRepository; } #region 轨迹订单列表 @@ -164,6 +168,73 @@ public class TrackOrderService : ApplicationService return list; } + + /// + /// 按时间轴获取轨迹内容 + /// + /// + /// + [HttpPost("GetDetailTimeline")] + public async Task>> GetDetailTimeline(GetDetailTimelineInput input) + { + var res = new UnifyResultDto>(true); + + var order = await _orderRepository.GetFirstAsync(m => m.OrderNo == input.OrderNumber); + if (order == null) + return new UnifyResultDto>(false, "订单不存在"); + + if (input.SystemId <= 0) + return new UnifyResultDto>(false, "子系统id不合法"); + + var trackStatus = await _trackStatusRepository.GetListAsync(m => m.SubSystemId == input.SystemId); + + var trackDetails = await _trackDetailsEsRepository.GetListAsync(order.Id); + res.Data = new List(); + var isCompleted = false; + foreach (var item in trackDetails) + { + //是否完结 + isCompleted = trackStatus.Any(m => m.IsCompleted && m.Code == item.TrackStatus); + + + + res.Data.Add(new GetDetailTimelineOutput() + { + IsHighlight = true, + Files = new List(), + //Remark = item.Remark, + //TrackTimeZone = item.TrackTimeZone, + TrackTime = ToUnixTimestamp(item.TrackTime), + TrackPlace = item.TrackPlace, + EnContent = item.TrackEnContent, + Content = item.TrackContent, + TrackCode = item.TrackCode + }); + } + + //如果轨迹状态没完结则追加最后一个默认节点 + if (!isCompleted) + { + res.Data.Add(new GetDetailTimelineOutput() + { + Content = "签收", + IsHighlight = false, + TrackTimeZone = $"GMT{(order.DestinationTimeZone >= 0 ? "+" : "-")}{order.DestinationTimeZone}", + TrackTime = ToUnixTimestamp(order.EstimatedDeliveryDate), + TrackTimePrefix = "预计签收时间:", + }); + } + + return res; + } + + public static long ToUnixTimestamp(DateTime time) + { + //var sTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + var sTime = TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1), TimeZoneInfo.Utc, TimeZoneInfo.Local); + return (long) (time - sTime).TotalMilliseconds; + } + /// /// 根据轨迹id删除单条轨迹 /// diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs index 9a24699e..492555ec 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs @@ -172,6 +172,18 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot [SugarColumn(IsIgnore = true)] public List OrderPullStatus { get; set; } + /// + /// 目的地时区 + /// + [SugarColumn(ColumnName = "DestinationTimeZone")] + public float DestinationTimeZone { get; set; } + + /// + /// 预计到达时间 + /// + [SugarColumn(ColumnName = "EstimatedDeliveryDate")] + public DateTime EstimatedDeliveryDate { get; set; } + public void ResetTrackInfo() { IsCompleted = false; diff --git a/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/ITrackContentRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/ITrackContentRepository.cs index 000dbe3b..b321e87b 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/ITrackContentRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/ITrackContentRepository.cs @@ -26,4 +26,6 @@ public interface ITrackContentRepository : IBasicRepository Expression> whereExpression); Task GetTemplateIsExist(int trackContentId); + Task GetByCodeAsync(int systemId, string code); + Task> GetListBySystemIdAsync(int systemId); } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/TrackContentEntity.cs b/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/TrackContentEntity.cs index ee797ce1..d5b41963 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/TrackContentEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/TrackContentEntity.cs @@ -36,6 +36,12 @@ public class TrackContentEntity : IFullAuditedBasicEntitys, IAggregateRoot [SugarColumn(ColumnName = "SubSystemId")] public int SubSystemId { get; set; } + /// + /// 子系统名称 + /// + [SugarColumn(IsIgnore = true)] + public string SubSystem { get; set; } + /// /// 轨迹标记id,多个逗号分隔 /// @@ -53,4 +59,28 @@ public class TrackContentEntity : IFullAuditedBasicEntitys, IAggregateRoot /// [SugarColumn(ColumnName = "IsExternal")] public bool IsExternal { get; set; } + + /// + /// 是否可重复 + /// + [SugarColumn(ColumnName = "IsRepeatable")] + public bool IsRepeatable { get; set; } + + /// + /// 是否允许手动修改 + /// + [SugarColumn(ColumnName = "IsAllowManuallyUpdate")] + public bool IsAllowManuallyUpdate { get; set; } + + /// + /// 是否允许手动创建 + /// + [SugarColumn(ColumnName = "IsAllowManuallyCreate")] + public bool IsAllowManuallyCreate { get; set; } + + /// + /// 是否同步轨迹订单上的预计到达时间 + /// + [SugarColumn(ColumnName = "IsChangeOrderEdd")] + public bool IsChangeOrderEdd { get; set; } } diff --git a/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs index c1399c6a..a4fe71cd 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs @@ -113,7 +113,6 @@ public class TrackContentRepository : BasicRepository, ITrac return false; } - public async Task> GetMapPageAsync( GetTrackContentMapPageInputVO input) { @@ -220,4 +219,27 @@ public class TrackContentRepository : BasicRepository, ITrac return await Context.Updateable().SetColumns(columns).Where(whereExpression) .ExecuteCommandAsync() > 0; } + + public Task GetByCodeAsync(int systemId, string code) + { + return Context.Queryable().FirstAsync(m => m.SubSystemId == systemId && m.Code == code); + } + + public Task> GetListBySystemIdAsync(int systemId) + { + return Context.Queryable() + .Where(content => content.SubSystemId == systemId && !content.IsDeleted) + .Select((content) => new TrackContentEntity + { + Id = content.Id, + Code = content.Code, + IsExternal = content.IsExternal, + EnContent = content.EnContent, + Content = content.Content, + IsRepeatable = content.IsRepeatable, + IsAllowManuallyCreate = content.IsAllowManuallyCreate, + IsAllowManuallyUpdate = content.IsAllowManuallyUpdate, + }) + .ToListAsync(); + } } From bd817acea3bba328d215771b5e781598ffd0e8d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Wed, 13 Nov 2024 10:33:07 +0800 Subject: [PATCH 06/75] =?UTF-8?q?update:=20=E6=9B=B4=E6=96=B0=EF=BC=88Trac?= =?UTF-8?q?kDetailsIndex=EF=BC=89=E8=BD=A8=E8=BF=B9=E6=98=8E=E7=BB=86ES?= =?UTF-8?q?=E6=8C=81=E4=B9=85=E5=8C=96=E5=AF=B9=E8=B1=A1=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TrackDetailsIndex.cs | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index a89fb67e..4d5361a2 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -106,4 +106,54 @@ public class TrackDetailsIndex : IdBaseIndex /// 修改时间 /// public DateTime? UpdateTime { get; set; } + + /// + /// 客户是否可见 + /// + public int IsVisibility { get; set; } + + /// + /// 数据来源:1外部服务商创建,2内部系统创建,3人工创建 + /// + public int Source { get; set; } + + /// + /// 备注 + /// + public string? Remarks { get; set; } = GlobalConst.EmptyString; + + /// + /// 附件key,多个附件使用(,)分割 + /// + public string? Files { get; set; } = GlobalConst.EmptyString; + + /// + /// 轨迹发生地(城市) + /// + public string? TrackPlaceCity { get; set; } + + /// + /// 轨迹发生地(省/州) + /// + public string? TrackPlaceProvince { get; set; } + + /// + /// 轨迹发生地(国家/地区) + /// + public string? TrackPlaceNation { get; set; } + + /// + /// 轨迹发生地邮编 + /// + public string? TrackPlacePostcode { get; set; } + + /// + /// 预计签收时间 + /// + public DateTime? ExpectedReceiptTime { get; set; } + + /// + /// 签收地时区 + /// + public float? ReceiptTimeZone { get; set; } } From e969bed42e3789a06f3a0396d69cbe4f208c6c6c Mon Sep 17 00:00:00 2001 From: eli Date: Wed, 13 Nov 2024 11:51:37 +0800 Subject: [PATCH 07/75] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E8=BF=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProvideServices/GetDetailTimelineInput.cs | 4 +-- .../GetDetailTimelineOutput.cs | 30 +++++++++++++++---- .../Services/TrackOrders/TrackOrderService.cs | 28 ++++++++++------- .../Aggregates/OrderAggregate/OrderEntity.cs | 2 +- .../TrackDetailsIndex.cs | 2 +- 5 files changed, 47 insertions(+), 19 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineInput.cs index 9294efc0..94067c80 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineInput.cs @@ -13,7 +13,7 @@ public class GetDetailTimelineInput public int SystemId{ get; set; } /// - /// 是否客户端,false时展示所有轨迹,true时只展示对外的轨迹 + /// 是否 /// - public bool IsCustomeClient { get; set; } + public bool IsClient { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineOutput.cs index a621240b..d5d56c9b 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineOutput.cs @@ -17,11 +17,6 @@ public class GetDetailTimelineOutput /// public string EnContent { get; set; } - /// - /// 轨迹发生地 - /// - public string TrackPlace { get; set; } = null!; - /// /// 轨迹发生时间 /// @@ -51,4 +46,29 @@ public class GetDetailTimelineOutput /// 是否高亮 /// public bool IsHighlight { get; set; } + + /// + /// 是否显示悬停效果 + /// + public bool IsShowHover { get; set; } + + /// + /// 轨迹发生地 + /// + public string TrackPlace { get; set; } + + /// + /// 轨迹发生地(城市) + /// + public string? TrackPlaceCity { get; set; } + + /// + /// 轨迹发生地(省/州) + /// + public string? TrackPlaceProvince { get; set; } + + /// + /// 轨迹发生地(国家/地区) + /// + public string? TrackPlaceNation { get; set; } } diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index b1fff209..9b3cbae7 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -191,24 +191,32 @@ public class TrackOrderService : ApplicationService var trackDetails = await _trackDetailsEsRepository.GetListAsync(order.Id); res.Data = new List(); var isCompleted = false; - foreach (var item in trackDetails) + foreach (var item in trackDetails.OrderBy(m => m.CreateTime).ToList()) { + var currentTrackStatus = trackStatus.FirstOrDefault(m => m.Code == item.TrackStatus); + //是否完结 - isCompleted = trackStatus.Any(m => m.IsCompleted && m.Code == item.TrackStatus); - + isCompleted = currentTrackStatus?.IsCompleted == true; + //如果是客户端,且轨迹内容不对外则跳过这条轨迹内容 + if (input.IsClient && item.IsVisibility) + continue; res.Data.Add(new GetDetailTimelineOutput() { IsHighlight = true, - Files = new List(), - //Remark = item.Remark, - //TrackTimeZone = item.TrackTimeZone, + IsShowHover = true, + Remark = item.Remarks == null || item.Remarks == "--" ? "" : item.Remarks, + TrackTimeZone = $"GMT{(item.TrackTimeZone >= 0 ? "+" : "-")}{item.TrackTimeZone}", TrackTime = ToUnixTimestamp(item.TrackTime), TrackPlace = item.TrackPlace, EnContent = item.TrackEnContent, + Files = string.IsNullOrEmpty(item.Files) || item.Files == "--" ? new List() : item.Files.Split(",").ToList(), Content = item.TrackContent, - TrackCode = item.TrackCode + TrackCode = item.TrackCode, + TrackPlaceNation = item.TrackPlaceNation, + TrackPlaceProvince = item.TrackPlaceProvince, + TrackPlaceCity = item.TrackPlaceCity, }); } @@ -219,9 +227,9 @@ public class TrackOrderService : ApplicationService { Content = "签收", IsHighlight = false, - TrackTimeZone = $"GMT{(order.DestinationTimeZone >= 0 ? "+" : "-")}{order.DestinationTimeZone}", - TrackTime = ToUnixTimestamp(order.EstimatedDeliveryDate), - TrackTimePrefix = "预计签收时间:", + TrackTimeZone = order.EstimatedDeliveryDate.HasValue ? $"GMT{(order.DestinationTimeZone >= 0 ? "+" : "-")}{order.DestinationTimeZone}" : "", + TrackTime = order.EstimatedDeliveryDate.HasValue ? ToUnixTimestamp(DateTime.Parse(order.EstimatedDeliveryDate.ToString()!)) : 0, + TrackTimePrefix = order.EstimatedDeliveryDate.HasValue ? "预计签收时间:" : "", }); } diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs index 492555ec..45c49e45 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs @@ -182,7 +182,7 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot /// 预计到达时间 /// [SugarColumn(ColumnName = "EstimatedDeliveryDate")] - public DateTime EstimatedDeliveryDate { get; set; } + public DateTime? EstimatedDeliveryDate { get; set; } public void ResetTrackInfo() { diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index 4d5361a2..c3532fdb 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -110,7 +110,7 @@ public class TrackDetailsIndex : IdBaseIndex /// /// 客户是否可见 /// - public int IsVisibility { get; set; } + public bool IsVisibility { get; set; } /// /// 数据来源:1外部服务商创建,2内部系统创建,3人工创建 From 4f376c75a369b14027235ccf4ae83a9a267be2c5 Mon Sep 17 00:00:00 2001 From: eli Date: Wed, 13 Nov 2024 11:56:47 +0800 Subject: [PATCH 08/75] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E5=8F=AF=E7=94=A8=E6=95=B0=E6=8D=AE=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackContents/EditTrackContentInput.cs | 5 ----- .../Aggregates/TrackContentAggregate/TrackContentEntity.cs | 6 ------ .../Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs | 2 +- 3 files changed, 1 insertion(+), 12 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs index 14b5461e..94ed8b56 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs @@ -61,11 +61,6 @@ public class EditTrackContentInput /// 是否允许手动创建 /// public bool IsAllowManuallyCreate { get; set; } - - /// - /// 是否同步轨迹订单上的预计到达时间 - /// - public bool IsChangeOrderEdd { get; set; } } public class GetTrackContentDetailDto diff --git a/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/TrackContentEntity.cs b/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/TrackContentEntity.cs index d5b41963..b6809891 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/TrackContentEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/TrackContentEntity.cs @@ -77,10 +77,4 @@ public class TrackContentEntity : IFullAuditedBasicEntitys, IAggregateRoot /// [SugarColumn(ColumnName = "IsAllowManuallyCreate")] public bool IsAllowManuallyCreate { get; set; } - - /// - /// 是否同步轨迹订单上的预计到达时间 - /// - [SugarColumn(ColumnName = "IsChangeOrderEdd")] - public bool IsChangeOrderEdd { get; set; } } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index 4d5361a2..c3532fdb 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -110,7 +110,7 @@ public class TrackDetailsIndex : IdBaseIndex /// /// 客户是否可见 /// - public int IsVisibility { get; set; } + public bool IsVisibility { get; set; } /// /// 数据来源:1外部服务商创建,2内部系统创建,3人工创建 From 3d230a8b27b2526cd96d0c1fea119d59f25d4063 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Wed, 13 Nov 2024 15:59:42 +0800 Subject: [PATCH 09/75] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3TrackDetailsInde?= =?UTF-8?q?x=E5=AD=97=E6=AE=B5=E5=91=BD=E5=90=8D=20ExpectedReceiptTime=20?= =?UTF-8?q?=3D>=20EstimatedDeliveryDate=20ReceiptTimeZone=20=3D>=20Destina?= =?UTF-8?q?tionTimeZone?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index c3532fdb..60e0c808 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -150,10 +150,10 @@ public class TrackDetailsIndex : IdBaseIndex /// /// 预计签收时间 /// - public DateTime? ExpectedReceiptTime { get; set; } + public DateTime? EstimatedDeliveryDate { get; set; } /// /// 签收地时区 /// - public float? ReceiptTimeZone { get; set; } + public float? DestinationTimeZone { get; set; } } From 695380e97d4c0677629da1cfbdf9bda8a95b1dfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Wed, 13 Nov 2024 16:26:49 +0800 Subject: [PATCH 10/75] =?UTF-8?q?add-entity:=20=E5=A2=9E=E5=8A=A0=E5=A4=96?= =?UTF-8?q?=E9=83=A8=E5=8D=95=E5=8F=B7=E5=85=B3=E8=81=94=E8=A1=A8=E5=AE=9E?= =?UTF-8?q?=E4=BD=93OrderPlatformNumberEntity=EF=BC=8C=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E4=B8=BB=E5=8D=95=E5=85=B3=E8=81=94=E5=AF=B9=E4=B8=AA=E5=A4=96?= =?UTF-8?q?=E9=83=A8=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update-entity: OrderEntity,增加OrderPlatformNumbers导航属性用于SqlSugar的Include关联加载 OrderPullStatusEntity,增加Order(第三方单号)字段,当作拉取轨迹的首选项 入参模型更新: UpdateOrderInput:轨迹订单创建/更新入参,增加【预计到达时间】【目的地时区】用于初始化 反参模型更新: TrackOrderDto:用于轨迹订单查询的反参,增加【预计到达时间】【目的地时区】【第三方单号(格式化拼接后的字符串)】 feat: - 实现轨迹订单查询支持三方单号查询,并将多个关联三方单号按(平台名称-三方单号)格式使用(、)拼接返回 - 创建/修改订单增加校验,规则为:【预计到达时间】【目的地时区】入参字段只允许全有值或全无值。 --- .../ProvideServices/GetPageTrackOrderInput.cs | 15 +++++++++ .../Dtos/ProvideServices/UpdateOrderInput.cs | 15 +++++++++ .../Services/ProvideServices/OrderService.cs | 26 +++++++++++++++ .../Aggregates/OrderAggregate/OrderEntity.cs | 23 +++++++------ .../OrderPlatformNumberEntity.cs | 32 +++++++++++++++++++ .../OrderTrackPullStatusEntity.cs | 6 ++++ .../Dtos/Order/GetPageTrackOrderInputVO.cs | 16 ++++++++++ .../Repositories/OrderRepository.cs | 27 ++++++++++++++-- 8 files changed, 148 insertions(+), 12 deletions(-) create mode 100644 src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderPlatformNumberEntity.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs index 61d9fb82..324e9c48 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs @@ -152,4 +152,19 @@ public class TrackOrderDto ///// 问题描述名称 ///// //public string? ProblemDescriptionName { get; set; } + + /// + /// 预计到达时间 + /// + public DateTime? EstimatedDeliveryDate { get; set; } + + /// + /// 目的地时区 + /// + public float? DestinationTimeZone { get; set; } + + /// + /// 第三方单号,服务商-轨迹0000000、轨迹服务商-0000000 + /// + public string? ThirdPartyOrderNumber { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpdateOrderInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpdateOrderInput.cs index 02f025e8..b46ff5be 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpdateOrderInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpdateOrderInput.cs @@ -57,6 +57,16 @@ public class UpdateOrderInput : OrderNoInfo /// public string? ProductCode { get; set; } + /// + /// 预计到达时间 + /// + public DateTime? EstimatedDeliveryDate { get; set; } + + /// + /// 目的地时区 + /// + public float? DestinationTimeZone { get; set; } + /// /// 拉取配置信息 /// @@ -76,6 +86,11 @@ public class PullConfigInfo [Required] public string ServiceCode { get; set; } + /// + /// api服务商订单号(第三方单号) + /// + public string? OrderNo { get; set; } + /// /// 开始轨迹code /// diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs index fd7f723e..07859810 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs @@ -36,6 +36,13 @@ public partial class OrderService : ApplicationService, IOrderService [HttpPost("Order/Upsert")] public async Task> UpsertAsync(UpsertOrderInput input) { + // 校验预计到达时间是否不是同时存在或同时不存在 + if ((input.EstimatedDeliveryDate.HasValue && input.DestinationTimeZone.HasValue == false) || + (input.EstimatedDeliveryDate.HasValue == false && input.DestinationTimeZone.HasValue)) + { + throw new BusinessException(message: "【目的地时区】和【预计到达时间】必须同时输入"); + } + // 校验订单是否已存在,存在则更新 var order = await _orderRepository.GetFirstAsync(x => x.SubSystemId == input.SubSystemId && x.OrderType == input.OrderType && x.OrderNo == input.OrderNo); @@ -64,6 +71,7 @@ public partial class OrderService : ApplicationService, IOrderService order.SubSystemId = input.SubSystemId; order.OrderFlights = ObjectMapper.Map, List>(input.FlightInfos); order.OrderPullStatus = BuiltOrderPullStatus(input.PullConfigInfos); + order.OrderPlatformNumbers = BuiltOrderPlatformNumbers(input.PullConfigInfos); var orderId = await _orderRepository.CreateOrderAsync(order); @@ -128,6 +136,7 @@ public partial class OrderService : ApplicationService, IOrderService var status = new OrderPullStatusEntity { ServiceProviderCode = x.ServiceCode, + OrderNo = x.OrderNo, PullStatus = TrackPullStatus.Init, StartTrackCode = x.StartCode ?? GlobalConst.EmptyString, EndTrackCode = x.EndCode ?? GlobalConst.EmptyString, @@ -144,6 +153,23 @@ public partial class OrderService : ApplicationService, IOrderService status.StartTime = DateTime.Now.AddHours(x.SilenceTime); } + return status; + }).ToList(); + } + private List BuiltOrderPlatformNumbers(List? pullConfigInfos) + { + if (pullConfigInfos == null) return new List(); + + return pullConfigInfos.Select(x => + { + var status = new OrderPlatformNumberEntity + { + //三方单号 + OrderNumber = x.OrderNo, + //三方平台名称,目前认为是服务商code + Platform = x.ServiceCode, + }; + return status; }).ToList(); } diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs index 45c49e45..b2e3a5ba 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs @@ -168,22 +168,25 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot [SugarColumn(ColumnName = "ArrivalProvince")] public string? ArrivalProvince { get; set; } - [SugarColumn(IsIgnore = true)] public List OrderFlights { get; set; } - - [SugarColumn(IsIgnore = true)] public List OrderPullStatus { get; set; } - - /// - /// 目的地时区 - /// - [SugarColumn(ColumnName = "DestinationTimeZone")] - public float DestinationTimeZone { get; set; } - /// /// 预计到达时间 /// [SugarColumn(ColumnName = "EstimatedDeliveryDate")] public DateTime? EstimatedDeliveryDate { get; set; } + /// + /// 目的地时区 + /// + [SugarColumn(ColumnName = "DestinationTimeZone")] + public float? DestinationTimeZone { get; set; } + + [SugarColumn(IsIgnore = true)] public List OrderFlights { get; set; } + + [SugarColumn(IsIgnore = true)] public List OrderPullStatus { get; set; } + + [Navigate(NavigateType.OneToMany, nameof(OrderPlatformNumberEntity.OrderId))] + [SugarColumn(IsIgnore = true)] public List OrderPlatformNumbers { get; set; } + public void ResetTrackInfo() { IsCompleted = false; diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderPlatformNumberEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderPlatformNumberEntity.cs new file mode 100644 index 00000000..07a331db --- /dev/null +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderPlatformNumberEntity.cs @@ -0,0 +1,32 @@ +namespace SJZY.Track.Domain.Aggregates.OrderAggregate; + +/// +/// 外部单号关联表 +/// +[SugarTable("t_order_platform_number")] +public class OrderPlatformNumberEntity : IFullAuditedBasicEntitys, IEntity +{ + /// + /// 自增主键 + /// + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)] + public int Id { get; set; } + + /// + /// 订单id + /// + [SugarColumn(ColumnName = "OrderId")] + public int OrderId { get; set; } + + /// + /// 外部单号 + /// + [SugarColumn(ColumnName = "OrderNumber")] + public string OrderNumber { get; set; } + + /// + /// 平台名称 + /// + [SugarColumn(ColumnName = "Platform")] + public string? Platform { get; set; } +} diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderTrackPullStatusEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderTrackPullStatusEntity.cs index 29215b28..b4db417c 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderTrackPullStatusEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderTrackPullStatusEntity.cs @@ -18,6 +18,12 @@ public class OrderPullStatusEntity : ICreateBaicEntity, IUpdateBasicEntity, IEnt [SugarColumn(ColumnName = "OrderId")] public int OrderId { get; set; } + /// + /// api服务商订单号(第三方单号) + /// + [SugarColumn(ColumnName = "OrderNo")] + public string? OrderNo { get; set; } + /// /// 服务商code /// diff --git a/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs b/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs index 7d473d1f..b57037a0 100644 --- a/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs +++ b/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs @@ -68,6 +68,7 @@ public class TrackOrderVO /// public string? OrderNumber { get; set; } + /// /// 客户简称 /// @@ -137,4 +138,19 @@ public class TrackOrderVO /// 问题类型名称 /// public string? QuestionTypeName { get; set; } + + /// + /// 预计到达时间 + /// + public DateTime? EstimatedDeliveryDate { get; set; } + + /// + /// 目的地时区 + /// + public float? DestinationTimeZone { get; set; } + + /// + /// 第三方单号,服务商-轨迹0000000、轨迹服务商-0000000 + /// + public string? ThirdPartyOrderNumber { get; set; } } diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index eb62e350..e3172b1f 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -12,11 +12,14 @@ public class OrderRepository : BasicRepository, IOrderRepository, I { public async Task> GetTrackOrderPagedList(GetPageTrackOrderInputVO input) { + //查询完去重 var pageList = await Context.Queryable() + .Includes(a => a.OrderPlatformNumbers) .LeftJoin((a, b) => a.CustomId == b.Id && b.IsDeleted == false) .LeftJoin((a, b, c) => a.SubSystemId == c.Id && c.IsDeleted == false) + .LeftJoin((a, b, c, d) => a.Id == d.OrderId && d.IsDeleted == false) .WhereIF(input.SubSystemId > 0, (a, b, c) => a.SubSystemId == input.SubSystemId) - .WhereIF(!input.OrderNos.IsNullOrEmpty(), (a, b, c) => input.OrderNos!.Contains(a.OrderNo)) + .WhereIF(!input.OrderNos.IsNullOrEmpty(), (a, b, c, d) => input.OrderNos!.Contains(a.OrderNo) || input.OrderNos!.Contains(d.OrderNumber)) .WhereIF(input.CreateTimeStart.HasValue && input.CreateTimeEnd.HasValue, (a, b, c) => a.CreateTime >= input.CreateTimeStart && a.CreateTime <= input.CreateTimeEnd) .WhereIF(input.CreateTimeStart.HasValue && (!input.CreateTimeEnd.HasValue), @@ -28,6 +31,7 @@ public class OrderRepository : BasicRepository, IOrderRepository, I .WhereIF(input.TabType > 0, (a, b, c) => a.QuestionType == input.TabType) .WhereIF(input.TabType == (int) TrackProblemType.Warn, (a, b, c) => !a.IsCompleted) .OrderByDescending((a, b, c) => a.CreateTime) + .Distinct() .Select((a, b, c) => new TrackOrderVO { Id = a.Id, @@ -44,7 +48,10 @@ public class OrderRepository : BasicRepository, IOrderRepository, I IsFinish = a.IsCompleted, CreateTime = a.CreateTime, SubSystem = c.CnName, - SubSystemId = c.Id + SubSystemId = c.Id, + DestinationTimeZone = a.DestinationTimeZone, + EstimatedDeliveryDate = a.EstimatedDeliveryDate, + ThirdPartyOrderNumber = BuildThirdPartyOrderNumber(a.OrderPlatformNumbers) }) .ToPagedListAsync(input.PageIndex, input.PageSize); @@ -60,6 +67,8 @@ public class OrderRepository : BasicRepository, IOrderRepository, I await Context.Insertable(order.OrderFlights).ExecuteCommandAsync(); order.OrderPullStatus.ForEach(x => x.OrderId = orderId); await Context.Insertable(order.OrderPullStatus).ExecuteCommandAsync(); + order.OrderPlatformNumbers.ForEach(x => x.OrderId = orderId); + await Context.Insertable(order.OrderPlatformNumbers).ExecuteCommandAsync(); tran.Complete(); @@ -174,6 +183,20 @@ public class OrderRepository : BasicRepository, IOrderRepository, I }); } + /// + /// 拼接多个三方单号,默认使用分隔符默认(、) + /// 第三方单号,服务商-轨迹0000000、轨迹服务商-0000000 + /// + /// + /// + private static string BuildThirdPartyOrderNumber(List orderPlatformNumberEntities) + { + const string separator = "、"; + var thirdPartyOrderNumbers = orderPlatformNumberEntities + .Select(x => $"{x.Platform}-{x.OrderNumber}").ToList(); + return string.Join(separator, thirdPartyOrderNumbers); + } + #region 订单关联 public async Task> GetLinkedOrdersAsync(int[] orderIds) From d3d84c97da524a8be4d47b5db1c1b3dc7317899f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Thu, 14 Nov 2024 15:01:56 +0800 Subject: [PATCH 11/75] =?UTF-8?q?update:=20=E6=9B=B4=E6=96=B0=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=98=8E=E7=BB=86=E5=AE=9E=E4=BD=93=20-=20=E9=99=84?= =?UTF-8?q?=E4=BB=B6=E7=B1=BB=E5=9E=8B=E5=8F=98=E6=9B=B4=E4=B8=BAList=20ListItem:{OssKey:string,FileName:string}?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/ProvideServices/FileItemDto.cs | 14 ++++++++++++++ .../Aggregates/TrackDetailsAggregate/FileItem.cs | 14 ++++++++++++++ .../TrackDetailsAggregate/TrackDetailsIndex.cs | 4 ++-- 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 src/SJZY.Track.Application.Contract/Dtos/ProvideServices/FileItemDto.cs create mode 100644 src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/FileItem.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/FileItemDto.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/FileItemDto.cs new file mode 100644 index 00000000..f483a7ab --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/FileItemDto.cs @@ -0,0 +1,14 @@ +namespace SJZY.Track.Application.Contract.Dtos.ProvideServices; + +public class FileItemDto +{ + /// + /// 文件osskey + /// + public string OssKey { get; set; } + + /// + /// 文件名称 + /// + public string FileName { get; set; } +} diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/FileItem.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/FileItem.cs new file mode 100644 index 00000000..2d2dc4a3 --- /dev/null +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/FileItem.cs @@ -0,0 +1,14 @@ +namespace SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; + +public class FileItem +{ + /// + /// 文件osskey + /// + public string OssKey { get; set; } + + /// + /// 文件名称 + /// + public string FileName { get; set; } +} diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index 60e0c808..99ea5e25 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -123,9 +123,9 @@ public class TrackDetailsIndex : IdBaseIndex public string? Remarks { get; set; } = GlobalConst.EmptyString; /// - /// 附件key,多个附件使用(,)分割 + /// 附件集合 /// - public string? Files { get; set; } = GlobalConst.EmptyString; + public List? Files { get; set; } /// /// 轨迹发生地(城市) From 531e14538b58d0874cddf6fbae3056d6e6a3034b Mon Sep 17 00:00:00 2001 From: eli Date: Thu, 14 Nov 2024 14:55:44 +0800 Subject: [PATCH 12/75] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E7=99=BB=E9=99=86=E4=BA=BA=E5=AD=90=E7=B3=BB=E7=BB=9F=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProvideServices/GetDetailTimelineInput.cs | 4 --- .../GetDetailTimelineOutput.cs | 20 +++++++++++++- .../TrackContents/TrackContentService.cs | 1 - .../Services/TrackOrders/TrackOrderService.cs | 26 +++++++++++++++---- .../OrderAggregate/IOrderRepository.cs | 8 ++++++ .../Repositories/OrderRepository.cs | 5 ++++ 6 files changed, 53 insertions(+), 11 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineInput.cs index 94067c80..d6dbc062 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineInput.cs @@ -12,8 +12,4 @@ public class GetDetailTimelineInput /// public int SystemId{ get; set; } - /// - /// 是否 - /// - public bool IsClient { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineOutput.cs index d5d56c9b..4febf2c1 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineOutput.cs @@ -40,7 +40,7 @@ public class GetDetailTimelineOutput /// /// 文件 osskey 集合 /// - public List Files { get; set; } + public List Files { get; set; } /// /// 是否高亮 @@ -72,3 +72,21 @@ public class GetDetailTimelineOutput /// public string? TrackPlaceNation { get; set; } } + +public class FileItem +{ + /// + /// 文件osskey + /// + public string OssKey { get; set; } + + /// + /// 文件名称 + /// + public string FileName { get; set; } + + /// + /// 文件url + /// + public string Url { get; set; } +} diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index b4bea62f..dca95c7e 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -242,7 +242,6 @@ public class TrackContentService : ApplicationService //获取轨迹详情 var trackDetails = await _trackDetailsEsRepository.GetListAsync(orderId); - //获取当前子系统下所有的轨迹内容 var contentList = await _trackContentRepository.GetListBySystemIdAsync(input.SystemId); if (contentList == null) diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index 9b3cbae7..467bfd14 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -186,6 +186,10 @@ public class TrackOrderService : ApplicationService if (input.SystemId <= 0) return new UnifyResultDto>(false, "子系统id不合法"); + var system = await _orderRepository.GetSystemInfoById(input.SystemId); + if (system == null) + return new UnifyResultDto>(false, "未找到制定id的子系统"); + var trackStatus = await _trackStatusRepository.GetListAsync(m => m.SubSystemId == input.SystemId); var trackDetails = await _trackDetailsEsRepository.GetListAsync(order.Id); @@ -198,8 +202,8 @@ public class TrackOrderService : ApplicationService //是否完结 isCompleted = currentTrackStatus?.IsCompleted == true; - //如果是客户端,且轨迹内容不对外则跳过这条轨迹内容 - if (input.IsClient && item.IsVisibility) + //如果是内部系统,且轨迹内容不对外则跳过这条轨迹内容 + if (system.SystemProperty == 1 && item.IsVisibility) continue; res.Data.Add(new GetDetailTimelineOutput() @@ -207,11 +211,11 @@ public class TrackOrderService : ApplicationService IsHighlight = true, IsShowHover = true, Remark = item.Remarks == null || item.Remarks == "--" ? "" : item.Remarks, - TrackTimeZone = $"GMT{(item.TrackTimeZone >= 0 ? "+" : "-")}{item.TrackTimeZone}", + TrackTimeZone = $"GMT {(item.TrackTimeZone >= 0 ? "+" : "-")}{GetTimeZoneStr(item.TrackTimeZone)}", TrackTime = ToUnixTimestamp(item.TrackTime), TrackPlace = item.TrackPlace, EnContent = item.TrackEnContent, - Files = string.IsNullOrEmpty(item.Files) || item.Files == "--" ? new List() : item.Files.Split(",").ToList(), + //Files = string.IsNullOrEmpty(item.Files) || item.Files == "--" ? new List() : item.Files.Split(",").ToList(), Content = item.TrackContent, TrackCode = item.TrackCode, TrackPlaceNation = item.TrackPlaceNation, @@ -238,11 +242,23 @@ public class TrackOrderService : ApplicationService public static long ToUnixTimestamp(DateTime time) { - //var sTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); var sTime = TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1), TimeZoneInfo.Utc, TimeZoneInfo.Local); return (long) (time - sTime).TotalMilliseconds; } + private string GetTimeZoneStr(float timeZone) + { + var time = timeZone.ToString().Split('.'); + if (time.Length > 1 && time[1] != "0") //如果时区有小数点 + { + return time[0] + ":30"; + } + else + { + return time[0] + ":00"; + } + } + /// /// 根据轨迹id删除单条轨迹 /// diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs index be928230..ad8d9607 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs @@ -1,4 +1,5 @@ using SJZY.Track.Domain.Dtos.Order; +using SJZY.Track.Domain.VEntities; namespace SJZY.Track.Domain.Aggregates.OrderAggregate; @@ -131,4 +132,11 @@ public interface IOrderRepository : IBasicRepository Task UpdateOrderPullConfigForServiceProviderAsync(UpdateOrderPullConfigsInputVo inputVo); #endregion + + /// + /// 根据id获取子系统信息 + /// + /// + /// + Task GetSystemInfoById(int id); } diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index eb62e350..c5488f36 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -163,6 +163,11 @@ public class OrderRepository : BasicRepository, IOrderRepository, I return res.Select(x => (x.Key, x.Id)).ToList(); } + public Task GetSystemInfoById(int id) + { + return Context.Queryable().FirstAsync(m => m.IsDeleted == false && m.Id == id); + } + private int UpdateOrderQuestionType(int questionType, IEnumerable ids) { var idsString = string.Join(",", ids); From 2399297e43b615a608b06576d8e53b463f9c7522 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Wed, 13 Nov 2024 15:59:42 +0800 Subject: [PATCH 13/75] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3TrackDetailsInde?= =?UTF-8?q?x=E5=AD=97=E6=AE=B5=E5=91=BD=E5=90=8D=20ExpectedReceiptTime=20?= =?UTF-8?q?=3D>=20EstimatedDeliveryDate=20ReceiptTimeZone=20=3D>=20Destina?= =?UTF-8?q?tionTimeZone?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index c3532fdb..60e0c808 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -150,10 +150,10 @@ public class TrackDetailsIndex : IdBaseIndex /// /// 预计签收时间 /// - public DateTime? ExpectedReceiptTime { get; set; } + public DateTime? EstimatedDeliveryDate { get; set; } /// /// 签收地时区 /// - public float? ReceiptTimeZone { get; set; } + public float? DestinationTimeZone { get; set; } } From e09b8ac482f34c622def55f5a7d9fdf87737a0fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Wed, 13 Nov 2024 16:26:49 +0800 Subject: [PATCH 14/75] =?UTF-8?q?add-entity:=20=E5=A2=9E=E5=8A=A0=E5=A4=96?= =?UTF-8?q?=E9=83=A8=E5=8D=95=E5=8F=B7=E5=85=B3=E8=81=94=E8=A1=A8=E5=AE=9E?= =?UTF-8?q?=E4=BD=93OrderPlatformNumberEntity=EF=BC=8C=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E4=B8=BB=E5=8D=95=E5=85=B3=E8=81=94=E5=AF=B9=E4=B8=AA=E5=A4=96?= =?UTF-8?q?=E9=83=A8=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update-entity: OrderEntity,增加OrderPlatformNumbers导航属性用于SqlSugar的Include关联加载 OrderPullStatusEntity,增加Order(第三方单号)字段,当作拉取轨迹的首选项 入参模型更新: UpdateOrderInput:轨迹订单创建/更新入参,增加【预计到达时间】【目的地时区】用于初始化 反参模型更新: TrackOrderDto:用于轨迹订单查询的反参,增加【预计到达时间】【目的地时区】【第三方单号(格式化拼接后的字符串)】 feat: - 实现轨迹订单查询支持三方单号查询,并将多个关联三方单号按(平台名称-三方单号)格式使用(、)拼接返回 - 创建/修改订单增加校验,规则为:【预计到达时间】【目的地时区】入参字段只允许全有值或全无值。 --- .../ProvideServices/GetPageTrackOrderInput.cs | 15 +++++++++ .../Dtos/ProvideServices/UpdateOrderInput.cs | 15 +++++++++ .../Services/ProvideServices/OrderService.cs | 26 +++++++++++++++ .../Aggregates/OrderAggregate/OrderEntity.cs | 23 +++++++------ .../OrderPlatformNumberEntity.cs | 32 +++++++++++++++++++ .../OrderTrackPullStatusEntity.cs | 6 ++++ .../Dtos/Order/GetPageTrackOrderInputVO.cs | 16 ++++++++++ .../Repositories/OrderRepository.cs | 27 ++++++++++++++-- 8 files changed, 148 insertions(+), 12 deletions(-) create mode 100644 src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderPlatformNumberEntity.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs index 61d9fb82..324e9c48 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs @@ -152,4 +152,19 @@ public class TrackOrderDto ///// 问题描述名称 ///// //public string? ProblemDescriptionName { get; set; } + + /// + /// 预计到达时间 + /// + public DateTime? EstimatedDeliveryDate { get; set; } + + /// + /// 目的地时区 + /// + public float? DestinationTimeZone { get; set; } + + /// + /// 第三方单号,服务商-轨迹0000000、轨迹服务商-0000000 + /// + public string? ThirdPartyOrderNumber { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpdateOrderInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpdateOrderInput.cs index 02f025e8..b46ff5be 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpdateOrderInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpdateOrderInput.cs @@ -57,6 +57,16 @@ public class UpdateOrderInput : OrderNoInfo /// public string? ProductCode { get; set; } + /// + /// 预计到达时间 + /// + public DateTime? EstimatedDeliveryDate { get; set; } + + /// + /// 目的地时区 + /// + public float? DestinationTimeZone { get; set; } + /// /// 拉取配置信息 /// @@ -76,6 +86,11 @@ public class PullConfigInfo [Required] public string ServiceCode { get; set; } + /// + /// api服务商订单号(第三方单号) + /// + public string? OrderNo { get; set; } + /// /// 开始轨迹code /// diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs index fd7f723e..07859810 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs @@ -36,6 +36,13 @@ public partial class OrderService : ApplicationService, IOrderService [HttpPost("Order/Upsert")] public async Task> UpsertAsync(UpsertOrderInput input) { + // 校验预计到达时间是否不是同时存在或同时不存在 + if ((input.EstimatedDeliveryDate.HasValue && input.DestinationTimeZone.HasValue == false) || + (input.EstimatedDeliveryDate.HasValue == false && input.DestinationTimeZone.HasValue)) + { + throw new BusinessException(message: "【目的地时区】和【预计到达时间】必须同时输入"); + } + // 校验订单是否已存在,存在则更新 var order = await _orderRepository.GetFirstAsync(x => x.SubSystemId == input.SubSystemId && x.OrderType == input.OrderType && x.OrderNo == input.OrderNo); @@ -64,6 +71,7 @@ public partial class OrderService : ApplicationService, IOrderService order.SubSystemId = input.SubSystemId; order.OrderFlights = ObjectMapper.Map, List>(input.FlightInfos); order.OrderPullStatus = BuiltOrderPullStatus(input.PullConfigInfos); + order.OrderPlatformNumbers = BuiltOrderPlatformNumbers(input.PullConfigInfos); var orderId = await _orderRepository.CreateOrderAsync(order); @@ -128,6 +136,7 @@ public partial class OrderService : ApplicationService, IOrderService var status = new OrderPullStatusEntity { ServiceProviderCode = x.ServiceCode, + OrderNo = x.OrderNo, PullStatus = TrackPullStatus.Init, StartTrackCode = x.StartCode ?? GlobalConst.EmptyString, EndTrackCode = x.EndCode ?? GlobalConst.EmptyString, @@ -144,6 +153,23 @@ public partial class OrderService : ApplicationService, IOrderService status.StartTime = DateTime.Now.AddHours(x.SilenceTime); } + return status; + }).ToList(); + } + private List BuiltOrderPlatformNumbers(List? pullConfigInfos) + { + if (pullConfigInfos == null) return new List(); + + return pullConfigInfos.Select(x => + { + var status = new OrderPlatformNumberEntity + { + //三方单号 + OrderNumber = x.OrderNo, + //三方平台名称,目前认为是服务商code + Platform = x.ServiceCode, + }; + return status; }).ToList(); } diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs index 45c49e45..b2e3a5ba 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs @@ -168,22 +168,25 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot [SugarColumn(ColumnName = "ArrivalProvince")] public string? ArrivalProvince { get; set; } - [SugarColumn(IsIgnore = true)] public List OrderFlights { get; set; } - - [SugarColumn(IsIgnore = true)] public List OrderPullStatus { get; set; } - - /// - /// 目的地时区 - /// - [SugarColumn(ColumnName = "DestinationTimeZone")] - public float DestinationTimeZone { get; set; } - /// /// 预计到达时间 /// [SugarColumn(ColumnName = "EstimatedDeliveryDate")] public DateTime? EstimatedDeliveryDate { get; set; } + /// + /// 目的地时区 + /// + [SugarColumn(ColumnName = "DestinationTimeZone")] + public float? DestinationTimeZone { get; set; } + + [SugarColumn(IsIgnore = true)] public List OrderFlights { get; set; } + + [SugarColumn(IsIgnore = true)] public List OrderPullStatus { get; set; } + + [Navigate(NavigateType.OneToMany, nameof(OrderPlatformNumberEntity.OrderId))] + [SugarColumn(IsIgnore = true)] public List OrderPlatformNumbers { get; set; } + public void ResetTrackInfo() { IsCompleted = false; diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderPlatformNumberEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderPlatformNumberEntity.cs new file mode 100644 index 00000000..07a331db --- /dev/null +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderPlatformNumberEntity.cs @@ -0,0 +1,32 @@ +namespace SJZY.Track.Domain.Aggregates.OrderAggregate; + +/// +/// 外部单号关联表 +/// +[SugarTable("t_order_platform_number")] +public class OrderPlatformNumberEntity : IFullAuditedBasicEntitys, IEntity +{ + /// + /// 自增主键 + /// + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)] + public int Id { get; set; } + + /// + /// 订单id + /// + [SugarColumn(ColumnName = "OrderId")] + public int OrderId { get; set; } + + /// + /// 外部单号 + /// + [SugarColumn(ColumnName = "OrderNumber")] + public string OrderNumber { get; set; } + + /// + /// 平台名称 + /// + [SugarColumn(ColumnName = "Platform")] + public string? Platform { get; set; } +} diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderTrackPullStatusEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderTrackPullStatusEntity.cs index 29215b28..b4db417c 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderTrackPullStatusEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderTrackPullStatusEntity.cs @@ -18,6 +18,12 @@ public class OrderPullStatusEntity : ICreateBaicEntity, IUpdateBasicEntity, IEnt [SugarColumn(ColumnName = "OrderId")] public int OrderId { get; set; } + /// + /// api服务商订单号(第三方单号) + /// + [SugarColumn(ColumnName = "OrderNo")] + public string? OrderNo { get; set; } + /// /// 服务商code /// diff --git a/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs b/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs index 7d473d1f..b57037a0 100644 --- a/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs +++ b/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs @@ -68,6 +68,7 @@ public class TrackOrderVO /// public string? OrderNumber { get; set; } + /// /// 客户简称 /// @@ -137,4 +138,19 @@ public class TrackOrderVO /// 问题类型名称 /// public string? QuestionTypeName { get; set; } + + /// + /// 预计到达时间 + /// + public DateTime? EstimatedDeliveryDate { get; set; } + + /// + /// 目的地时区 + /// + public float? DestinationTimeZone { get; set; } + + /// + /// 第三方单号,服务商-轨迹0000000、轨迹服务商-0000000 + /// + public string? ThirdPartyOrderNumber { get; set; } } diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index c5488f36..bb7d8dd3 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -12,11 +12,14 @@ public class OrderRepository : BasicRepository, IOrderRepository, I { public async Task> GetTrackOrderPagedList(GetPageTrackOrderInputVO input) { + //查询完去重 var pageList = await Context.Queryable() + .Includes(a => a.OrderPlatformNumbers) .LeftJoin((a, b) => a.CustomId == b.Id && b.IsDeleted == false) .LeftJoin((a, b, c) => a.SubSystemId == c.Id && c.IsDeleted == false) + .LeftJoin((a, b, c, d) => a.Id == d.OrderId && d.IsDeleted == false) .WhereIF(input.SubSystemId > 0, (a, b, c) => a.SubSystemId == input.SubSystemId) - .WhereIF(!input.OrderNos.IsNullOrEmpty(), (a, b, c) => input.OrderNos!.Contains(a.OrderNo)) + .WhereIF(!input.OrderNos.IsNullOrEmpty(), (a, b, c, d) => input.OrderNos!.Contains(a.OrderNo) || input.OrderNos!.Contains(d.OrderNumber)) .WhereIF(input.CreateTimeStart.HasValue && input.CreateTimeEnd.HasValue, (a, b, c) => a.CreateTime >= input.CreateTimeStart && a.CreateTime <= input.CreateTimeEnd) .WhereIF(input.CreateTimeStart.HasValue && (!input.CreateTimeEnd.HasValue), @@ -28,6 +31,7 @@ public class OrderRepository : BasicRepository, IOrderRepository, I .WhereIF(input.TabType > 0, (a, b, c) => a.QuestionType == input.TabType) .WhereIF(input.TabType == (int) TrackProblemType.Warn, (a, b, c) => !a.IsCompleted) .OrderByDescending((a, b, c) => a.CreateTime) + .Distinct() .Select((a, b, c) => new TrackOrderVO { Id = a.Id, @@ -44,7 +48,10 @@ public class OrderRepository : BasicRepository, IOrderRepository, I IsFinish = a.IsCompleted, CreateTime = a.CreateTime, SubSystem = c.CnName, - SubSystemId = c.Id + SubSystemId = c.Id, + DestinationTimeZone = a.DestinationTimeZone, + EstimatedDeliveryDate = a.EstimatedDeliveryDate, + ThirdPartyOrderNumber = BuildThirdPartyOrderNumber(a.OrderPlatformNumbers) }) .ToPagedListAsync(input.PageIndex, input.PageSize); @@ -60,6 +67,8 @@ public class OrderRepository : BasicRepository, IOrderRepository, I await Context.Insertable(order.OrderFlights).ExecuteCommandAsync(); order.OrderPullStatus.ForEach(x => x.OrderId = orderId); await Context.Insertable(order.OrderPullStatus).ExecuteCommandAsync(); + order.OrderPlatformNumbers.ForEach(x => x.OrderId = orderId); + await Context.Insertable(order.OrderPlatformNumbers).ExecuteCommandAsync(); tran.Complete(); @@ -179,6 +188,20 @@ public class OrderRepository : BasicRepository, IOrderRepository, I }); } + /// + /// 拼接多个三方单号,默认使用分隔符默认(、) + /// 第三方单号,服务商-轨迹0000000、轨迹服务商-0000000 + /// + /// + /// + private static string BuildThirdPartyOrderNumber(List orderPlatformNumberEntities) + { + const string separator = "、"; + var thirdPartyOrderNumbers = orderPlatformNumberEntities + .Select(x => $"{x.Platform}-{x.OrderNumber}").ToList(); + return string.Join(separator, thirdPartyOrderNumbers); + } + #region 订单关联 public async Task> GetLinkedOrdersAsync(int[] orderIds) From 69ca5f9bd79833bad5ebcfc0891c9aa2829f865c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Thu, 14 Nov 2024 15:01:56 +0800 Subject: [PATCH 15/75] =?UTF-8?q?update:=20=E6=9B=B4=E6=96=B0=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=98=8E=E7=BB=86=E5=AE=9E=E4=BD=93=20-=20=E9=99=84?= =?UTF-8?q?=E4=BB=B6=E7=B1=BB=E5=9E=8B=E5=8F=98=E6=9B=B4=E4=B8=BAList=20ListItem:{OssKey:string,FileName:string}?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/ProvideServices/FileItemDto.cs | 14 ++++++++++++++ .../Aggregates/TrackDetailsAggregate/FileItem.cs | 14 ++++++++++++++ .../TrackDetailsAggregate/TrackDetailsIndex.cs | 4 ++-- 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 src/SJZY.Track.Application.Contract/Dtos/ProvideServices/FileItemDto.cs create mode 100644 src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/FileItem.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/FileItemDto.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/FileItemDto.cs new file mode 100644 index 00000000..f483a7ab --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/FileItemDto.cs @@ -0,0 +1,14 @@ +namespace SJZY.Track.Application.Contract.Dtos.ProvideServices; + +public class FileItemDto +{ + /// + /// 文件osskey + /// + public string OssKey { get; set; } + + /// + /// 文件名称 + /// + public string FileName { get; set; } +} diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/FileItem.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/FileItem.cs new file mode 100644 index 00000000..2d2dc4a3 --- /dev/null +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/FileItem.cs @@ -0,0 +1,14 @@ +namespace SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; + +public class FileItem +{ + /// + /// 文件osskey + /// + public string OssKey { get; set; } + + /// + /// 文件名称 + /// + public string FileName { get; set; } +} diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index 60e0c808..99ea5e25 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -123,9 +123,9 @@ public class TrackDetailsIndex : IdBaseIndex public string? Remarks { get; set; } = GlobalConst.EmptyString; /// - /// 附件key,多个附件使用(,)分割 + /// 附件集合 /// - public string? Files { get; set; } = GlobalConst.EmptyString; + public List? Files { get; set; } /// /// 轨迹发生地(城市) From 0f11a3b68b8a6ea7e5674ed019b4bb50d7504b43 Mon Sep 17 00:00:00 2001 From: eli Date: Thu, 14 Nov 2024 16:11:27 +0800 Subject: [PATCH 16/75] =?UTF-8?q?=E6=B7=BB=E5=8A=A0oss?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProvideServices/GetDetailTimelineInput.cs | 8 ++++++-- .../ProvideServices/GetDetailTimelineOutput.cs | 4 ++-- .../SJZY.Track.Application.csproj | 1 + .../Services/TrackOrders/TrackOrderService.cs | 17 ++++++++++++++--- .../SjzyTrackApplicationModule.cs | 11 +++++++++++ 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineInput.cs index d6dbc062..21ec867c 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineInput.cs @@ -8,8 +8,12 @@ public class GetDetailTimelineInput public string OrderNumber { get; set; } /// - /// 子系统id + /// 订单所属子系统id /// - public int SystemId{ get; set; } + public int SystemId { get; set; } + /// + /// 当前用户登陆子系统id + /// + public int CurrenUserSystemId { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineOutput.cs index 4febf2c1..4441323c 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetDetailTimelineOutput.cs @@ -40,7 +40,7 @@ public class GetDetailTimelineOutput /// /// 文件 osskey 集合 /// - public List Files { get; set; } + public List Files { get; set; } /// /// 是否高亮 @@ -73,7 +73,7 @@ public class GetDetailTimelineOutput public string? TrackPlaceNation { get; set; } } -public class FileItem +public class TrackFileItem { /// /// 文件osskey diff --git a/src/SJZY.Track.Application/SJZY.Track.Application.csproj b/src/SJZY.Track.Application/SJZY.Track.Application.csproj index 926a7d69..0bcf26d3 100644 --- a/src/SJZY.Track.Application/SJZY.Track.Application.csproj +++ b/src/SJZY.Track.Application/SJZY.Track.Application.csproj @@ -10,6 +10,7 @@ + diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index 467bfd14..4d0aea12 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -1,3 +1,4 @@ +using SJZY.Expand.AliyunOSS; using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Dtos.TrackOrder; using SJZY.Track.Domain.Aggregates.OrderAggregate; @@ -186,7 +187,10 @@ public class TrackOrderService : ApplicationService if (input.SystemId <= 0) return new UnifyResultDto>(false, "子系统id不合法"); - var system = await _orderRepository.GetSystemInfoById(input.SystemId); + if (input.CurrenUserSystemId <= 0) + return new UnifyResultDto>(false, "当前登陆用户子系统id不合法"); + + var system = await _orderRepository.GetSystemInfoById(input.CurrenUserSystemId); if (system == null) return new UnifyResultDto>(false, "未找到制定id的子系统"); @@ -211,11 +215,18 @@ public class TrackOrderService : ApplicationService IsHighlight = true, IsShowHover = true, Remark = item.Remarks == null || item.Remarks == "--" ? "" : item.Remarks, - TrackTimeZone = $"GMT {(item.TrackTimeZone >= 0 ? "+" : "-")}{GetTimeZoneStr(item.TrackTimeZone)}", + TrackTimeZone = $"GMT{(item.TrackTimeZone >= 0 ? "+" : "-")}{GetTimeZoneStr(item.TrackTimeZone)}", TrackTime = ToUnixTimestamp(item.TrackTime), TrackPlace = item.TrackPlace, EnContent = item.TrackEnContent, - //Files = string.IsNullOrEmpty(item.Files) || item.Files == "--" ? new List() : item.Files.Split(",").ToList(), + Files = item.Files?.Any() == true + ? new List() + : item.Files!.Select(m => new TrackFileItem() + { + OssKey = m.OssKey, + FileName = m.FileName, + Url = m.OssKey.GetUrlByKey(), + }).ToList(), Content = item.TrackContent, TrackCode = item.TrackCode, TrackPlaceNation = item.TrackPlaceNation, diff --git a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs index 9a8cc79b..44486d40 100644 --- a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs +++ b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs @@ -6,6 +6,7 @@ using RabbitMQ.Client; using SJZY.Expand.ABP.Core.Localization; using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.PublicMethords; +using SJZY.Expand.AliyunOSS; using SJZY.InterfaceRelay.Application.Contracts; using SJZY.Track.Application.CAP; using SJZY.Track.Application.Contract; @@ -148,6 +149,16 @@ public class SjzyTrackApplicationModule : AbpModule context.Services.Configure(configuration.GetSection("TrackApp")); context.Services.Configure( configuration.GetSection("InterfaceRelayParamsConfig")); + + //注册阿里云OSS服务 + context.Services.AddAliOSS(option => + { + option.AccessKeyId = configuration["OSS:AccessKeyId"]; + option.AccessKeySecret = configuration["OSS:AccessKeySecret"]; + option.Endpoint = configuration["OSS:Endpoint"]; + option.BucketName = configuration["OSS:BucketName"]; + option.ReturnHttpsUrl = true; + }); } public override void PreConfigureServices(ServiceConfigurationContext context) From 6a2faf90a2596e609019ebb5ab0eb2ab2894cd66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Thu, 14 Nov 2024 17:05:45 +0800 Subject: [PATCH 17/75] =?UTF-8?q?=E5=85=A5=E5=8F=82=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=9A=20UpsertTrackInput=EF=BC=88?= =?UTF-8?q?=E6=96=B0=E5=A2=9E/=E6=9B=B4=E6=96=B0=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E6=9D=A5=E6=BA=90=E8=BD=A8=E8=BF=B9=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E6=96=B0=E5=A2=9E=E7=9A=84=E7=9B=B8=E5=85=B3=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=20BatchUpsertTrackInput=EF=BC=88=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=9B=B4=E6=96=B0/=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E6=9D=A5=E6=BA=90=E8=BD=A8=E8=BF=B9=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E6=96=B0=E5=A2=9E=E7=9A=84=E7=9B=B8=E5=85=B3=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 反参模型更新: TrackOrderDetailDto(查询轨迹明细) feat: - 增加(新增/更新轨迹)(单个/批量)入参【目的地时区】和【预计到达时间】的校验 - 增加(删除轨迹)(单个/批量)外部来源不允许删除的约束(异常后同步返回) - 当(新增/更新轨迹)(单个/批量)时如果输入【目的地时区】和【预计到达时间】则同步到订单主表 - 支持【轨迹内容】【轨迹内容英文】的二次修改,修改内容来源于请求 - 【批量新增轨迹】增加当内容不允许重复时,更新相同code的轨迹明细的轨迹内容,并限制不允许更改轨迹来源 --- .../ProvideServices/BatchUpsertTrackInput.cs | 63 +++++++++++++++ .../ProvideServices/GetOrderDetailsInput.cs | 50 ++++++++++++ .../Dtos/ProvideServices/UpsertTrackInput.cs | 63 +++++++++++++++ .../TrackChangeAfterUpdateOrderEvent.cs | 10 +++ .../Events/TrackUpsertEvent.cs | 62 +++++++++++++++ .../AutoMapper/OrderAutoMapperProfile.cs | 1 + ...TrackChangeAfterUpdateOrderEventHandler.cs | 45 ++++++++--- .../EventHandlers/TrackUpsertEventHandler.cs | 79 ++++++++++++++++++- .../Services/ProvideServices/TrackService.cs | 43 +++++++++- .../ITrackDetailsEsRepository.cs | 3 + .../Enums/TrackSourceEnum.cs | 24 ++++++ .../Repositories/TrackDetailsEsRepository.cs | 48 +++++++++++ 12 files changed, 476 insertions(+), 15 deletions(-) create mode 100644 src/SJZY.Track.Domain/Enums/TrackSourceEnum.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs index d8cab392..337d02a7 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs @@ -35,4 +35,67 @@ public class BatchUpsertTrackInput : OrderNosInfo [Required] [Range(-12, 12)] public float TrackTimeZone { get; set; } + + /// + /// 客户是否可见 + /// + [Required] + public bool IsVisibility { get; set; } + + /// + /// 数据来源:1外部服务商创建,2内部系统创建,3人工创建 + /// + [Required] + public int Source { get; set; } + + /// + /// 轨迹备注 + /// + public string? Remarks { get; set; } + + /// + /// 附件集合 + /// + public List? Files { get; set; } + + /// + /// 轨迹内容,若为空则取轨迹内容表中该轨迹Code对应的轨迹内容 + /// + public string? Content { get; set; } + + /// + /// 轨迹内容英文,若为空则取轨迹内容表中该轨迹Code对应的轨迹英文内容 + /// + public string? EnStatus { get; set; } + + /// + /// 轨迹发生地(城市) + /// + public string? TrackPlaceCity { get; set; } + + /// + /// 轨迹发生地(省/州) + /// + public string? TrackPlaceProvince { get; set; } + + /// + /// 轨迹发生地(国家/地区) + /// + public string? TrackPlaceNation { get; set; } + + /// + /// 轨迹发生地邮编 + /// + public string? TrackPlacePostcode { get; set; } + + /// + /// 预计到达时间 + /// + public DateTime? EstimatedDeliveryDate { get; set; } + + /// + /// 目的地时区 + /// + [Range(-12, 12)] + public float? DestinationTimeZone { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetOrderDetailsInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetOrderDetailsInput.cs index 265723e8..23cdaec4 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetOrderDetailsInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetOrderDetailsInput.cs @@ -86,4 +86,54 @@ public class TrackOrderDetailDto /// 创建人 /// public string? CreateUser { get; set; } + + /// + /// 客户是否可见 + /// + public bool IsVisibility { get; set; } + + /// + /// 数据来源:1外部服务商创建,2内部系统创建,3人工创建 + /// + public int Source { get; set; } + + /// + /// 备注 + /// + public string? Remarks { get; set; } + + /// + /// 附件集合 + /// + public List? Files { get; set; } + + /// + /// 轨迹发生地(城市) + /// + public string? TrackPlaceCity { get; set; } + + /// + /// 轨迹发生地(省/州) + /// + public string? TrackPlaceProvince { get; set; } + + /// + /// 轨迹发生地(国家/地区) + /// + public string? TrackPlaceNation { get; set; } + + /// + /// 轨迹发生地邮编 + /// + public string? TrackPlacePostcode { get; set; } + + /// + /// 预计到达时间 + /// + public DateTime? EstimatedDeliveryDate { get; set; } + + /// + /// 目的地时区 + /// + public float? DestinationTimeZone { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs index 945a973b..d38a19e4 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs @@ -35,4 +35,67 @@ public class UpsertTrackInput : OrderNoInfo [Required] [Range(-12, 12)] public float? TrackTimeZone { get; set; } + + /// + /// 客户是否可见 + /// + [Required] + public bool IsVisibility { get; set; } + + /// + /// 数据来源:1外部服务商创建,2内部系统创建,3人工创建 + /// + [Required] + public int Source { get; set; } + + /// + /// 轨迹备注 + /// + public string? Remarks { get; set; } + + /// + /// 附件集合 + /// + public List? Files { get; set; } + + /// + /// 轨迹内容,若为空则取轨迹内容表中该轨迹Code对应的轨迹内容 + /// + public string? Content { get; set; } + + /// + /// 轨迹内容英文,若为空则取轨迹内容表中该轨迹Code对应的轨迹英文内容 + /// + public string? EnStatus { get; set; } + + /// + /// 轨迹发生地(城市) + /// + public string? TrackPlaceCity { get; set; } + + /// + /// 轨迹发生地(省/州) + /// + public string? TrackPlaceProvince { get; set; } + + /// + /// 轨迹发生地(国家/地区) + /// + public string? TrackPlaceNation { get; set; } + + /// + /// 轨迹发生地邮编 + /// + public string? TrackPlacePostcode { get; set; } + + /// + /// 预计到达时间 + /// + public DateTime? EstimatedDeliveryDate { get; set; } + + /// + /// 目的地时区 + /// + [Range(-12, 12)] + public float? DestinationTimeZone { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs index 037c5a8c..90c807d0 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs @@ -41,4 +41,14 @@ public class TrackChangeAfterUpdateOrderEvent /// 时区缺失和发生地缺失标记,1表示时区,2表示发生地,3表示两种 /// public int DeficiencyTagValue { get; set; } + + /// + /// 预计到达时间 + /// + public DateTime? EstimatedDeliveryDate { get; set; } + + /// + /// 签收地时区 + /// + public float? DestinationTimeZone { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index 1bd4b033..07fa4f95 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -1,3 +1,5 @@ +using SJZY.Track.Application.Contract.Dtos.ProvideServices; + namespace SJZY.Track.Application.Contract.Events; public class TrackUpsertEvent @@ -54,6 +56,66 @@ public class TrackUpsertEvent public TrackRefreshStruct TrackRefreshData { get; set; } + /// + /// 客户是否可见 + /// + public bool IsVisibility { get; set; } + + /// + /// 数据来源:1外部服务商创建,2内部系统创建,3人工创建 + /// + public int Source { get; set; } + + /// + /// 轨迹备注 + /// + public string? Remarks { get; set; } + + /// + /// 附件集合 + /// + public List? Files { get; set; } + + /// + /// 轨迹内容,若为空则取轨迹内容表中该轨迹Code对应的轨迹内容 + /// + public string? Content { get; set; } + + /// + /// 轨迹内容英文,若为空则取轨迹内容表中该轨迹Code对应的轨迹英文内容 + /// + public string? EnStatus { get; set; } + + /// + /// 轨迹发生地(城市) + /// + public string? TrackPlaceCity { get; set; } + + /// + /// 轨迹发生地(省/州) + /// + public string? TrackPlaceProvince { get; set; } + + /// + /// 轨迹发生地(国家/地区) + /// + public string? TrackPlaceNation { get; set; } + + /// + /// 轨迹发生地邮编 + /// + public string? TrackPlacePostcode { get; set; } + + /// + /// 预计到达时间 + /// + public DateTime? EstimatedDeliveryDate { get; set; } + + /// + /// 目的地时区 + /// + public float? DestinationTimeZone { get; set; } + public override string ToString() { return diff --git a/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs index 8fc8a9d4..f1a32d4d 100644 --- a/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs +++ b/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs @@ -33,6 +33,7 @@ public class OrderAutoMapperProfile : Profile .ForMember(dest => dest.Content, opt => opt.MapFrom(m => m.TrackContent)) .ForMember(dest => dest.EnContent, opt => opt.MapFrom(m => m.TrackEnContent)) .ForMember(dest => dest.TrackTimeZoneValue, opt => opt.MapFrom(m => m.TrackTimeZone)); + CreateMap(MemberList.None); CreateMap(MemberList.None); } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs index 153e9700..1f32a4e3 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs @@ -26,6 +26,8 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa return; } + //指示是否需要更新【预计签收时间】【签收地时区】 + var isNeedUpdate = false; var updateOrders = new List(); foreach (var order in orders) { @@ -55,20 +57,43 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa order.LatestTrackPlace = @event.TrackPlace; order.LatestTrackTime = @event.TrackTime; order.LatestTrackTimeZone = @event.TrackTimeZone; + //当【预计签收时间】【签收地时区】同时存在时则更新主表 + if (@event.EstimatedDeliveryDate.HasValue && @event.DestinationTimeZone.HasValue) + { + order.EstimatedDeliveryDate = @event.EstimatedDeliveryDate.Value; + order.DestinationTimeZone = @event.DestinationTimeZone.Value; + isNeedUpdate = true; + } + updateOrders.Add(order); } await _orderRepository.UpdateRangeAsync(updateOrders, - x => new - { - x.IsCompleted, - x.LatestTrackContent, - x.LatestTrackEnContent, - x.LatestTrackPlace, - x.LatestTrackTime, - x.LatestTrackTimeZone, - x.DeficiencyTag - }); + isNeedUpdate + ? x => new + { + x.IsCompleted, + x.LatestTrackContent, + x.LatestTrackEnContent, + x.LatestTrackPlace, + x.LatestTrackTime, + x.LatestTrackTimeZone, + x.DeficiencyTag, + //当标识指示需要更新时添加更新列 + x.EstimatedDeliveryDate, + x.DestinationTimeZone + } + : x => new + { + x.IsCompleted, + x.LatestTrackContent, + x.LatestTrackEnContent, + x.LatestTrackPlace, + x.LatestTrackTime, + x.LatestTrackTimeZone, + x.DeficiencyTag, + } + ); } private async Task> GetOrdersAsync(int[] orderIds) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index f30f51fc..ef68e72f 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -5,6 +5,7 @@ using SJZY.Track.Application.Contract.Events; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Dtos.TrackContents; +using SJZY.Track.Domain.Enums; using SJZY.Track.Domain.Queries; using Volo.Abp.DependencyInjection; using OrderIdentifier = SJZY.Track.Application.Contract.Events.OrderIdentifier; @@ -171,6 +172,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackPlace = @event.TrackPlace, TrackTime = @event.TrackTime, TrackTimeZone = @event.TrackTimeZone, + DestinationTimeZone = @event.DestinationTimeZone, + EstimatedDeliveryDate = @event.EstimatedDeliveryDate }); // 触发轨迹推送事件(异步) @@ -200,16 +203,21 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe var orderIds = @event.OrderIdentifiers.Select(x => x.OrderId).ToArray(); // important:轨迹code相同,时间、发生地不同的,可能存在多条!! + //todo:查出多条轨迹,同订单同code也可能出现多条, + //按同code找轨迹如果有多条则不允许修改,如果没有则进行新增 var tracks = await _trackDetailsEsRepository.GetListAsync(orderIds, @event.TrackCode, true); var insertTracks = new List(); var updateTracks = new List(); + //todo:标识轨迹内容是否是重复的,将来需要替换会从轨迹内容中获取 + var isRepeatable = true; foreach (var order in @event.OrderIdentifiers) { TrackDetailsIndex? track; if (!@event.IsAdd) { + //同一订单同轨迹code如果有多条轨迹明细则不允许修改 var existTracks = tracks.Where(x => x.OrderId == order.OrderId).ToArray(); if (existTracks.Length > 1) { @@ -220,13 +228,39 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe track = existTracks.FirstOrDefault(); if (track == null) continue; // 不存在不让改 + + //来源与外部服务商不允许修改 + if (track.Source == (int) TrackSourceEnum.ExternalServiceProvide) continue; } else { - track = tracks.FirstOrDefault(x => - x.OrderId == order.OrderId && x.TrackTime == @event.TrackTime && x.TrackPlace == @event.TrackPlace); + // 【批量新增】所有可能遇到的场景 + // 标识:允许重复,不允许重复,零条,一条,多条; + // 场景A:允许重复,零条 => 新增 + // 场景B:允许重复,一条 => 新增(约束受限新增,否则跳过新增) + // 场景C:允许重复,多条 => 新增(约束受限新增,否则跳过新增) + // 场景D:不允许重复,零条 => 新增 + // 场景E:不允许重复,一条 => 更新 + // 场景F:不允许重复,(理想不会出现多条) => 跳过 + var existTracks = tracks.Where(x => x.OrderId == order.OrderId).ToArray(); + track = existTracks.FirstOrDefault(); - if (track != null) continue; // 存在不让创建 + if (isRepeatable && existTracks.Length >= 1) + { + if (existTracks.Any(x => x.TrackPlace == @event.TrackPlace && x.TrackTime == @event.TrackTime)) + { + //允许重复,出现【轨迹发生地】,【轨迹发生时间】的都重复,则不允许新增 + continue; + } + + // 设置null后面执行新增逻辑 + track = null; + } + + if (!isRepeatable && existTracks.Length > 1) + { + continue; + } } if (track == default) @@ -246,9 +280,25 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe OriginTrackDataHash = @event.TrackRefreshData.OriginTrackDataHash ?? GlobalConst.EmptyString, CreateUser = @event.OperationMan ?? GlobalConst.SystemUser, CreateTime = DateTime.Now, + //来源轨迹内容,第一次新增的时候使用轨迹内容表提供的 TrackStatus = trackContent.TrackStatus, TrackContent = trackContent.TrackContent, - TrackEnContent = trackContent.TrackEnContent + TrackEnContent = trackContent.TrackEnContent, + //新增轨迹明细字段 + IsVisibility = @event.IsVisibility, + Source = @event.Source, + Remarks = @event.Remarks ?? GlobalConst.EmptyString, + Files = @event.Files?.Select(x => new FileItem + { + OssKey = x.OssKey, + FileName = x.FileName + }).ToList(), + TrackPlaceCity = @event.TrackPlaceCity ?? GlobalConst.EmptyString, + TrackPlaceProvince = @event.TrackPlaceProvince ?? GlobalConst.EmptyString, + TrackPlaceNation = @event.TrackPlaceNation ?? GlobalConst.EmptyString, + TrackPlacePostcode = @event.TrackPlacePostcode ?? GlobalConst.EmptyString, + DestinationTimeZone = @event.DestinationTimeZone, + EstimatedDeliveryDate = @event.EstimatedDeliveryDate, }; track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 @@ -267,6 +317,27 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe track.UpdateUser = @event.OperationMan ?? GlobalConst.SystemUser; track.UpdateTime = DateTime.Now; + //允许二次修改,在修改了轨迹内容后进行修改轨迹操作,如果输入的轨迹内容和英文则进行更改 + track.TrackStatus = trackContent.TrackStatus; //todo?允许修改状么? + track.TrackContent = @event.Content ?? trackContent.TrackContent; + track.TrackEnContent = @event.EnStatus ?? trackContent.TrackEnContent; + + //todo:修改轨迹增加字段(其中某些字段不允许更改) + track.IsVisibility = @event.IsVisibility; + //track.Source = @event.Source; //来源不允许更改 + track.Remarks = @event.Remarks ?? GlobalConst.EmptyString; + track.Files = @event.Files?.Select(x => new FileItem + { + OssKey = x.OssKey, + FileName = x.FileName + }).ToList(); + track.TrackPlaceCity = @event.TrackPlaceCity ?? GlobalConst.EmptyString; + track.TrackPlaceProvince = @event.TrackPlaceProvince ?? GlobalConst.EmptyString; + track.TrackPlaceNation = @event.TrackPlaceNation ?? GlobalConst.EmptyString; + track.TrackPlacePostcode = @event.TrackPlacePostcode ?? GlobalConst.EmptyString; + track.DestinationTimeZone = @event.DestinationTimeZone; + track.EstimatedDeliveryDate = @event.EstimatedDeliveryDate; + updateTracks.Add(track); } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 63fdd064..1b99555b 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -5,6 +5,7 @@ using SJZY.Track.Application.Contract.Services.ProvideServices; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackContentAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; +using SJZY.Track.Domain.Enums; using SJZY.UserCenter.HttpApi.Services; using Volo.Abp.Http.Client.DynamicProxying; @@ -59,6 +60,12 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: "轨迹时间不合法"); } + if ((input.EstimatedDeliveryDate.HasValue == false && input.DestinationTimeZone.HasValue) || + (input.EstimatedDeliveryDate.HasValue && input.DestinationTimeZone.HasValue == false)) + { + throw new BusinessException(message: "【目的地时区】和【预计到达时间】必须同时输入"); + } + var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(); if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) { @@ -112,6 +119,14 @@ public partial class TrackService : ApplicationService, ITrackService var name = userInfo.Data.UserName; + //删除轨迹约束,只要其中有一条来源是外部的就立即返回错误 + var tracks = await _trackDetailsEsRepository + .GetListAsync(new[] { orderId }, input.TrackCodes, TrackSourceEnum.ExternalServiceProvide); + if (tracks.Count > 0) + { + throw new BusinessException(message: "存在来源于外部服务商的轨迹,不允许删除"); + } + // 删除轨迹 var @event = new TrackDeleteEvent { @@ -153,6 +168,14 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: $"调用用户中心,获取用户信息失败:{userInfo.Msg}"); } + //删除轨迹约束,只要其中有一条来源是外部的就立即返回错误 + var tracks = await _trackDetailsEsRepository + .GetListAsync(orderIds.ToArray(), input.TrackCodes, TrackSourceEnum.ExternalServiceProvide); + if (tracks.Count > 0) + { + throw new BusinessException(message: "存在来源于外部服务商的轨迹,不允许删除"); + } + // 删除轨迹 var @event = new TrackDeleteEvent { @@ -191,6 +214,12 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: "订单一个都不存在"); } + if ((input.EstimatedDeliveryDate.HasValue == false && input.DestinationTimeZone.HasValue) || + (input.EstimatedDeliveryDate.HasValue && input.DestinationTimeZone.HasValue == false)) + { + throw new BusinessException(message: "【目的地时区】和【预计到达时间】必须同时输入"); + } + // 获取用户name var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(); if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) @@ -216,7 +245,19 @@ public partial class TrackService : ApplicationService, ITrackService TrackPlace = input.TrackPlace, TrackTime = input.TrackTime, TrackTimeZone = input.TrackTimeZone, - OperationMan = userInfo.Data.UserName + OperationMan = userInfo.Data.UserName, + IsVisibility = input.IsVisibility, + Source = input.Source, + Remarks = input.Remarks, + Files = input.Files, + Content = input.Content, + EnStatus = input.EnStatus, + TrackPlaceCity = input.TrackPlaceCity, + TrackPlaceProvince = input.TrackPlaceProvince, + TrackPlaceNation = input.TrackPlaceNation, + TrackPlacePostcode = input.TrackPlacePostcode, + EstimatedDeliveryDate = input.EstimatedDeliveryDate, + DestinationTimeZone = input.DestinationTimeZone }; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs index b52f5f20..f68269ff 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs @@ -1,4 +1,5 @@ using SJZY.Expand.ElasticSearch.Services; +using SJZY.Track.Domain.Enums; namespace SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; @@ -22,6 +23,8 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService> GetListAsync(int orderId); + Task> GetListAsync(int[] orderIds, List trackCodes, TrackSourceEnum source); + Task> DeleteTrackAsync(int[] orderIds, List trackCodes); Task DeleteTrackByIdAsync(string id, string indexName); diff --git a/src/SJZY.Track.Domain/Enums/TrackSourceEnum.cs b/src/SJZY.Track.Domain/Enums/TrackSourceEnum.cs new file mode 100644 index 00000000..021616af --- /dev/null +++ b/src/SJZY.Track.Domain/Enums/TrackSourceEnum.cs @@ -0,0 +1,24 @@ +using System.ComponentModel; + +namespace SJZY.Track.Domain.Enums; + +/// +/// 轨迹来源 +/// +public enum TrackSourceEnum +{ + /// + /// 外部服务商创建 + /// + [Description("外部服务商创建")] ExternalServiceProvide = 1, + + /// + /// 内部系统创建 + /// + [Description("内部系统创建")] InternalService = 2, + + /// + /// 人工创建 + /// + [Description("人工创建")] Artificial = 3, +} diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index 44715ae6..262d9d32 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -3,6 +3,7 @@ using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Expand.ElasticSearch.Services; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Consts; +using SJZY.Track.Domain.Enums; namespace SJZY.Track.Repository.Repositories; @@ -174,6 +175,19 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract p .Add("trackPlace", track.TrackPlace) @@ -181,6 +195,19 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract> GetListAsync(int[] orderIds, List trackCodes, TrackSourceEnum source) + { + var r = await Context.SearchAsync(x => x + .Index(GlobalConst.TrackDetailsIndex) + .Query(q => + q.Terms(t => t.Field(f => f.OrderId).Terms(orderIds)) + && q.Terms(t => t.Field(f => f.TrackCode.Suffix("keyword")).Terms(trackCodes)) + && q.Term(t => t.Source, (int) source) + ) + .Size(SafelyLimit) + .Sort(s => s.Field(f => f.ZeroTrackTime, SortOrder.Descending))); + + if (!r.IsValid) + { + throw new InvalidOperationException($"轨迹查询失败,orderIds:[{string.Join(',', orderIds)}],原因:{r.DebugInformation}。"); + } + + return r.ToIdList(); + } + public async Task> DeleteTrackAsync(int[] orderIds, List trackCodes) { // var deleteResponse = await Context.DeleteByQueryAsync(d => d @@ -334,6 +381,7 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract new { doc.OrderId, From 89a6874c6aef2e9e8235dd49dc49d0c6633c21c2 Mon Sep 17 00:00:00 2001 From: eli Date: Thu, 14 Nov 2024 17:37:50 +0800 Subject: [PATCH 18/75] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=9B=9E=E6=98=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackContents/EditTrackContentInput.cs | 15 +++++++++++++++ .../CAP/EventHandlers/TrackUpsertEventHandler.cs | 1 + .../Services/TrackOrders/TrackOrderService.cs | 9 +++++---- .../TrackDetailsAggregate/TrackDetailsIndex.cs | 5 +++++ .../Dtos/TrackContents/GetTrackContentDetailVO.cs | 14 ++++++++++++++ .../Dtos/TrackContents/TrackContentVO.cs | 5 +++++ .../Queries/ProvideQueries.cs | 1 + .../Repositories/TrackContentRepository.cs | 3 +++ 8 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs index 94ed8b56..8b1aca31 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs @@ -119,4 +119,19 @@ public class GetTrackContentDetailDto /// 是否对外 /// public bool IsExternal { get; set; } + + /// + /// 是否可重复 + /// + public bool IsRepeatable { get; set; } + + /// + /// 是否允许手动修改 + /// + public bool IsAllowManuallyUpdate { get; set; } + + /// + /// 是否允许手动创建 + /// + public bool IsAllowManuallyCreate { get; set; } } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index ef68e72f..a5035d63 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -282,6 +282,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe CreateTime = DateTime.Now, //来源轨迹内容,第一次新增的时候使用轨迹内容表提供的 TrackStatus = trackContent.TrackStatus, + TrackStatusCode = trackContent.TrackStatusCode, TrackContent = trackContent.TrackContent, TrackEnContent = trackContent.TrackEnContent, //新增轨迹明细字段 diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index 4d0aea12..41ccf841 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -199,12 +199,13 @@ public class TrackOrderService : ApplicationService var trackDetails = await _trackDetailsEsRepository.GetListAsync(order.Id); res.Data = new List(); var isCompleted = false; - foreach (var item in trackDetails.OrderBy(m => m.CreateTime).ToList()) + foreach (var item in trackDetails) { - var currentTrackStatus = trackStatus.FirstOrDefault(m => m.Code == item.TrackStatus); + var currentTrackStatus = trackStatus.FirstOrDefault(m => m.Code == item.TrackStatusCode); //是否完结 - isCompleted = currentTrackStatus?.IsCompleted == true; + if (!isCompleted) + isCompleted = currentTrackStatus is { IsCompleted: true }; //如果是内部系统,且轨迹内容不对外则跳过这条轨迹内容 if (system.SystemProperty == 1 && item.IsVisibility) @@ -219,7 +220,7 @@ public class TrackOrderService : ApplicationService TrackTime = ToUnixTimestamp(item.TrackTime), TrackPlace = item.TrackPlace, EnContent = item.TrackEnContent, - Files = item.Files?.Any() == true + Files = item.Files == null ? new List() : item.Files!.Select(m => new TrackFileItem() { diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index 99ea5e25..887ac5f9 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -37,6 +37,11 @@ public class TrackDetailsIndex : IdBaseIndex /// public string TrackStatus { get; set; } = GlobalConst.EmptyString; + /// + /// 轨迹状态code + /// + public string TrackStatusCode { get; set; } = GlobalConst.EmptyString; + /// /// 轨迹内容代码 /// diff --git a/src/SJZY.Track.Domain/Dtos/TrackContents/GetTrackContentDetailVO.cs b/src/SJZY.Track.Domain/Dtos/TrackContents/GetTrackContentDetailVO.cs index 2d1d8426..fe5b29d2 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackContents/GetTrackContentDetailVO.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackContents/GetTrackContentDetailVO.cs @@ -56,4 +56,18 @@ public class GetTrackContentDetailVO /// 是否对外 /// public bool IsExternal { get; set; } + /// + /// 是否可重复 + /// + public bool IsRepeatable { get; set; } + + /// + /// 是否允许手动修改 + /// + public bool IsAllowManuallyUpdate { get; set; } + + /// + /// 是否允许手动创建 + /// + public bool IsAllowManuallyCreate { get; set; } } diff --git a/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs b/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs index 374fa387..b0a98b0e 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs @@ -31,4 +31,9 @@ public class TrackContentVO /// 是否完成态 /// public bool IsCompleted { get; set; } + + /// + /// 轨迹状态代码 + /// + public string TrackStatusCode { get; set; } } diff --git a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs index 91550425..c91ba95d 100644 --- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs +++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs @@ -87,6 +87,7 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen SubSystemCode = z.Key, TrackStatusId = x.TrackStatusId, TrackStatus = y.Status, + TrackStatusCode = y.Code, TrackContent = x.Content, TrackEnContent = x.EnContent, IsCompleted = y.IsCompleted, diff --git a/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs index a4fe71cd..0cb9d205 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs @@ -33,6 +33,9 @@ public class TrackContentRepository : BasicRepository, ITrac EnContent = a.EnContent, TrackFlagId = a.TrackFlagId, IsExternal = a.IsExternal, + IsRepeatable = a.IsRepeatable, + IsAllowManuallyUpdate = a.IsAllowManuallyUpdate, + IsAllowManuallyCreate = a.IsAllowManuallyCreate }) .Mapper(x => { x.TrackFlagIds = x.TrackFlagId?.Split(',').Select(int.Parse).ToList(); }) .FirstAsync(); From e35ee25a4e6f2a420c357c3f6e753c2dce4de9ad Mon Sep 17 00:00:00 2001 From: eli Date: Thu, 14 Nov 2024 18:10:30 +0800 Subject: [PATCH 19/75] =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=9F=A5=E8=AF=A2=E6=B7=BB=E5=8A=A0=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E5=9B=9E=E6=98=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TrackContents/GetPageTrackContentInput.cs | 15 +++++++++++++++ .../Dtos/TrackContents/GetPageTrackContentVO.cs | 15 +++++++++++++++ .../Repositories/TrackContentRepository.cs | 3 +++ 3 files changed, 33 insertions(+) diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetPageTrackContentInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetPageTrackContentInput.cs index 9a5693a3..1d5cceac 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetPageTrackContentInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetPageTrackContentInput.cs @@ -89,4 +89,19 @@ public class GetTrackContentListDto /// 修改人 /// public string UpdateUser { get; set; } + + /// + /// 是否可重复 + /// + public bool IsRepeatable { get; set; } + + /// + /// 是否允许手动修改 + /// + public bool IsAllowManuallyUpdate { get; set; } + + /// + /// 是否允许手动创建 + /// + public bool IsAllowManuallyCreate { get; set; } } diff --git a/src/SJZY.Track.Domain/Dtos/TrackContents/GetPageTrackContentVO.cs b/src/SJZY.Track.Domain/Dtos/TrackContents/GetPageTrackContentVO.cs index 5dc044c7..2c9ef883 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackContents/GetPageTrackContentVO.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackContents/GetPageTrackContentVO.cs @@ -89,4 +89,19 @@ public class GetTrackContentListVO /// 修改人 /// public string UpdateUser { get; set; } + + /// + /// 是否可重复 + /// + public bool IsRepeatable { get; set; } + + /// + /// 是否允许手动修改 + /// + public bool IsAllowManuallyUpdate { get; set; } + + /// + /// 是否允许手动创建 + /// + public bool IsAllowManuallyCreate { get; set; } } diff --git a/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs index 0cb9d205..6ce6a15c 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs @@ -83,6 +83,9 @@ public class TrackContentRepository : BasicRepository, ITrac CreateUser = e.Name, UpdateTime = a.UpdateTime, UpdateUser = f.Name, + IsRepeatable = a.IsRepeatable, + IsAllowManuallyUpdate = a.IsAllowManuallyUpdate, + IsAllowManuallyCreate = a.IsAllowManuallyCreate }) .ToPagedListAsync(input.PageIndex, input.PageSize); From 69e0731b7e6cb937d562a20ade2db7f6fa4f15bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Fri, 15 Nov 2024 11:47:27 +0800 Subject: [PATCH 20/75] =?UTF-8?q?update:=E3=80=90=E5=8D=95=E4=B8=AA/?= =?UTF-8?q?=E6=89=B9=E9=87=8F=EF=BC=8C=E6=96=B0=E5=A2=9E/=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E8=BD=A8=E8=BF=B9=E3=80=91=E6=8E=A5=E5=8F=A3=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=A0=A1=E9=AA=8C=E9=80=BB=E8=BE=91=EF=BC=8C=E4=B8=BA?= =?UTF-8?q?=E4=BA=86=E5=9C=A8=E5=BC=95=E5=8F=91=E4=BA=8B=E4=BB=B6=E4=B9=8B?= =?UTF-8?q?=E5=89=8D=E5=81=9A=E6=8B=A6=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update:轨迹明细更新:批量操作删除修改轨迹状态字段,单个操作增加部分字段 --- .../Services/ProvideServices/TrackService.cs | 80 +++++++++++++++++++ .../Dtos/TrackContents/TrackContentVO.cs | 15 ++++ .../Queries/ProvideQueries.cs | 3 + .../Repositories/TrackDetailsEsRepository.cs | 15 +++- 4 files changed, 110 insertions(+), 3 deletions(-) diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 1b99555b..48967bfb 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -66,6 +66,41 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: "【目的地时区】和【预计到达时间】必须同时输入"); } + var trackContent = await _trackContentRepository.GetByCodeAsync(input.SubSystemId, input.TrackCode); + if (trackContent == default) + { + throw new BusinessException(message: $"轨迹代码:{input.TrackCode}轨迹内容不存在"); + } + + //指示是否为手动操作 + var manualOperation = input.Source == (int) TrackSourceEnum.Artificial; + + //不允许手动创建 + if (manualOperation && input.IsAdd && !trackContent.IsAllowManuallyCreate) + { + throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许手动创建"); + } + + //不允许手动更新 + if (manualOperation && !input.IsAdd && trackContent.IsAllowManuallyUpdate) + { + throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许手动更新"); + } + + var tracks = await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true); + + //轨迹内容不允许重复,并且已经存在了轨迹记录 + if (!trackContent.IsRepeatable && tracks.Count >= 1) + { + throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许重复添加"); + } + + //更新轨迹,但存在多条轨迹记录,理由:不清晰到底要修改哪一条或是全部修改 + if (!input.IsAdd && tracks.Count > 1) + { + throw new BusinessException(message: $"订单:{input.OrderNo},轨迹代码:{input.TrackCode}存在多条记录,不允许修改"); + } + var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(); if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) { @@ -214,12 +249,57 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: "订单一个都不存在"); } + // 校验主体:批量新增只选取第一条订单进行校验 + //【新增】存在指定轨迹的内容,进行更新覆盖(只处理一条的情况,并且决定权交给用户),不存在直接插入即可 + //【更新】存在指定轨迹的内容(匹配到多条则不处理) + var order = orders.First(); + + if (input.TrackTime < DateTime.Now.AddYears(-100) || input.TrackTime > DateTime.Now.AddYears(100)) + { + throw new BusinessException(message: "轨迹时间不合法"); + } + if ((input.EstimatedDeliveryDate.HasValue == false && input.DestinationTimeZone.HasValue) || (input.EstimatedDeliveryDate.HasValue && input.DestinationTimeZone.HasValue == false)) { throw new BusinessException(message: "【目的地时区】和【预计到达时间】必须同时输入"); } + var trackContent = await _trackContentRepository.GetByCodeAsync(input.SubSystemId, input.TrackCode); + if (trackContent == default) + { + throw new BusinessException(message: $"轨迹代码:{input.TrackCode}轨迹内容不存在"); + } + + //指示是否为手动操作 + var manualOperation = input.Source == (int) TrackSourceEnum.Artificial; + + //不允许手动创建 + if (manualOperation && input.IsAdd && !trackContent.IsAllowManuallyCreate) + { + throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许手动创建"); + } + + //不允许手动更新 + if (manualOperation && !input.IsAdd && trackContent.IsAllowManuallyUpdate) + { + throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许手动更新"); + } + + var tracks = await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true); + + //轨迹内容不允许重复,并且已经存在了轨迹记录 + if (!trackContent.IsRepeatable && tracks.Count >= 1) + { + throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许重复添加"); + } + + //更新轨迹,存在多条轨迹记录不允许更改,理由:不清晰到底要修改哪一条或是全部修改 + if (!input.IsAdd && tracks.Count > 1) + { + throw new BusinessException(message: $"订单:{order.OrderNo},轨迹代码:{input.TrackCode}存在多条记录,不允许修改"); + } + // 获取用户name var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(); if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) diff --git a/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs b/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs index b0a98b0e..f9f6da60 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs @@ -36,4 +36,19 @@ public class TrackContentVO /// 轨迹状态代码 /// public string TrackStatusCode { get; set; } + + /// + /// 是否可重复 + /// + public bool IsRepeatable { get; set; } + + /// + /// 是否允许手动修改 + /// + public bool IsAllowManuallyUpdate { get; set; } + + /// + /// 是否允许手动创建 + /// + public bool IsAllowManuallyCreate { get; set; } } diff --git a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs index c91ba95d..25d2c0d9 100644 --- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs +++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs @@ -91,6 +91,9 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen TrackContent = x.Content, TrackEnContent = x.EnContent, IsCompleted = y.IsCompleted, + IsRepeatable = x.IsRepeatable, + IsAllowManuallyUpdate = x.IsAllowManuallyUpdate, + IsAllowManuallyCreate = x.IsAllowManuallyCreate }) .FirstAsync(); } diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index 262d9d32..014c0c45 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -146,6 +146,17 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract Date: Fri, 15 Nov 2024 15:52:21 +0800 Subject: [PATCH 21/75] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E3=80=90?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E6=96=B0=E5=A2=9E/=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E3=80=91=E6=A0=A1=E9=AA=8Cbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update:调整轨迹更新事件处理逻辑,场景覆盖已经通过自测 --- .../EventHandlers/TrackUpsertEventHandler.cs | 32 +++++++++++-------- .../Services/ProvideServices/TrackService.cs | 8 ++--- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index a5035d63..4ec5b545 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -137,6 +137,14 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe return; } + //虽然在引发事件之前做了判断,引发之后并不一定立即处理,在此过程中轨迹内容仍然可能被修改,所以要二次进行判断。 + //通过来源指示是否为手动操作 + var manualOperation = @event.Source == (int) TrackSourceEnum.Artificial; + //轨迹内容标识不允许手动创建的 + if (manualOperation && @event.IsAdd && trackContent.IsAllowManuallyCreate == false) return; + //轨迹内容标识不允许手动更新的 + if (manualOperation && !@event.IsAdd && trackContent.IsAllowManuallyUpdate == false) return; + var insertTracks = await UpsertTrackAsync(@event, canNextOrderIds, trackContent); if (canNextOrderIds.Count == 0) return; @@ -203,15 +211,11 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe var orderIds = @event.OrderIdentifiers.Select(x => x.OrderId).ToArray(); // important:轨迹code相同,时间、发生地不同的,可能存在多条!! - //todo:查出多条轨迹,同订单同code也可能出现多条, - //按同code找轨迹如果有多条则不允许修改,如果没有则进行新增 var tracks = await _trackDetailsEsRepository.GetListAsync(orderIds, @event.TrackCode, true); var insertTracks = new List(); var updateTracks = new List(); - //todo:标识轨迹内容是否是重复的,将来需要替换会从轨迹内容中获取 - var isRepeatable = true; foreach (var order in @event.OrderIdentifiers) { TrackDetailsIndex? track; @@ -240,12 +244,13 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe // 场景B:允许重复,一条 => 新增(约束受限新增,否则跳过新增) // 场景C:允许重复,多条 => 新增(约束受限新增,否则跳过新增) // 场景D:不允许重复,零条 => 新增 - // 场景E:不允许重复,一条 => 更新 + // 场景E:不允许重复,一条 => 跳过 // 场景F:不允许重复,(理想不会出现多条) => 跳过 var existTracks = tracks.Where(x => x.OrderId == order.OrderId).ToArray(); track = existTracks.FirstOrDefault(); - if (isRepeatable && existTracks.Length >= 1) + //覆盖场景:B,C + if (trackContent.IsRepeatable && existTracks.Length >= 1) { if (existTracks.Any(x => x.TrackPlace == @event.TrackPlace && x.TrackTime == @event.TrackTime)) { @@ -257,10 +262,14 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe track = null; } - if (!isRepeatable && existTracks.Length > 1) + //不允许重复,并且记录大于等于一条,跳过 + //覆盖场景:E,F + if (!trackContent.IsRepeatable && existTracks.Length >= 1) { continue; } + + //其余情况:A,D都为新增操作,无需检查数量,track为null执行新增操作 } if (track == default) @@ -285,7 +294,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackStatusCode = trackContent.TrackStatusCode, TrackContent = trackContent.TrackContent, TrackEnContent = trackContent.TrackEnContent, - //新增轨迹明细字段 + //S06新增轨迹明细字段 IsVisibility = @event.IsVisibility, Source = @event.Source, Remarks = @event.Remarks ?? GlobalConst.EmptyString, @@ -318,14 +327,11 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe track.UpdateUser = @event.OperationMan ?? GlobalConst.SystemUser; track.UpdateTime = DateTime.Now; - //允许二次修改,在修改了轨迹内容后进行修改轨迹操作,如果输入的轨迹内容和英文则进行更改 - track.TrackStatus = trackContent.TrackStatus; //todo?允许修改状么? + //允许二次修改,在修改了轨迹内容后进行修改轨迹操作,如果输入的轨迹内容则以输入为准 track.TrackContent = @event.Content ?? trackContent.TrackContent; track.TrackEnContent = @event.EnStatus ?? trackContent.TrackEnContent; - - //todo:修改轨迹增加字段(其中某些字段不允许更改) + //S06新增 track.IsVisibility = @event.IsVisibility; - //track.Source = @event.Source; //来源不允许更改 track.Remarks = @event.Remarks ?? GlobalConst.EmptyString; track.Files = @event.Files?.Select(x => new FileItem { diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 48967bfb..37a6e394 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -82,7 +82,7 @@ public partial class TrackService : ApplicationService, ITrackService } //不允许手动更新 - if (manualOperation && !input.IsAdd && trackContent.IsAllowManuallyUpdate) + if (manualOperation && !input.IsAdd && !trackContent.IsAllowManuallyUpdate) { throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许手动更新"); } @@ -90,7 +90,7 @@ public partial class TrackService : ApplicationService, ITrackService var tracks = await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true); //轨迹内容不允许重复,并且已经存在了轨迹记录 - if (!trackContent.IsRepeatable && tracks.Count >= 1) + if (input.IsAdd && !trackContent.IsRepeatable && tracks.Count >= 1) { throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许重复添加"); } @@ -281,7 +281,7 @@ public partial class TrackService : ApplicationService, ITrackService } //不允许手动更新 - if (manualOperation && !input.IsAdd && trackContent.IsAllowManuallyUpdate) + if (manualOperation && !input.IsAdd && !trackContent.IsAllowManuallyUpdate) { throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许手动更新"); } @@ -289,7 +289,7 @@ public partial class TrackService : ApplicationService, ITrackService var tracks = await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true); //轨迹内容不允许重复,并且已经存在了轨迹记录 - if (!trackContent.IsRepeatable && tracks.Count >= 1) + if (input.IsAdd && !trackContent.IsRepeatable && tracks.Count >= 1) { throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许重复添加"); } From 23a1082d80eed5b06cb8e27fa89073d9b662bfc7 Mon Sep 17 00:00:00 2001 From: eli Date: Fri, 15 Nov 2024 16:20:09 +0800 Subject: [PATCH 22/75] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E5=8F=98=E6=9B=B4=E5=B9=BF=E6=92=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Events/TrackChangeEto.cs | 111 ++++++++++++++++++ .../EventHandlers/TrackUpsertEventHandler.cs | 71 ++++++++++- .../SjzyTrackApplicationModule.cs | 97 +++++++++------ .../Consts/GlobalConst.MQ.cs | 7 ++ .../Dtos/TrackContents/TrackContentVO.cs | 5 + .../Queries/ProvideQueries.cs | 3 +- 6 files changed, 250 insertions(+), 44 deletions(-) create mode 100644 src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs diff --git a/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs b/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs new file mode 100644 index 00000000..9d3a0a49 --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs @@ -0,0 +1,111 @@ +using SJZY.Track.Application.Contract.Dtos.ProvideServices; + +namespace SJZY.Track.Application.Contract.Events; + +public class TrackChangeEto +{ + /// + /// 操作类型:1新增,2删除,3修改 + /// + public int Option { get; set; } + + /// + /// 子系统id + /// + public int SubSystemId { get; set; } + + /// + /// 客户id + /// + public int CustomId { get; set; } + + /// + /// 订单id + /// + public OrderIdentifier[] OrderIdentifiers { get; set; } = null!; + + /// + /// 操作人 + /// + public string? OperationMan { get; set; } + + /// + /// 轨迹内容代码 + /// + public string TrackCode { get; set; } = null!; + + /// + /// 轨迹内容 + /// + public string? Content { get; set; } + + /// + /// 轨迹内容英文 + /// + public string? EnStatus { get; set; } + + /// + /// 轨迹状态代码 + /// + public string TrackStatusCode { get; set; } + + /// + /// 轨迹发生地 + /// + public string TrackPlace { get; set; } = null!; + + /// + /// 轨迹发生时间 + /// + public DateTime TrackTime { get; set; } + + /// + /// 轨迹发生地时区 + /// + public float TrackTimeZone { get; set; } + + /// + /// 客户是否可见 + /// + public bool IsVisibility { get; set; } + + /// + /// 数据来源:1外部服务商创建,2内部系统创建,3人工创建 + /// + public int Source { get; set; } + + /// + /// 轨迹备注 + /// + public string? Remarks { get; set; } + + /// + /// 附件集合 + /// + public List? Files { get; set; } + + /// + /// 轨迹发生地(城市) + /// + public string? TrackPlaceCity { get; set; } + + /// + /// 轨迹发生地(省/州) + /// + public string? TrackPlaceProvince { get; set; } + + /// + /// 轨迹发生地(国家/地区) + /// + public string? TrackPlaceNation { get; set; } + + /// + /// 轨迹发生地邮编 + /// + public string? TrackPlacePostcode { get; set; } + + /// + /// 预计到达时间 + /// + public DateTime? EstimatedDeliveryDate { get; set; } +} diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index a5035d63..9e8a148b 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -1,9 +1,12 @@ +using System.Text; +using BSI.Stack.Rabbit; using DotNetCore.CAP; using SJZY.Expand.ABP.Core.Logger; 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.Aggregates.TrackStatusAggregate; using SJZY.Track.Domain.Dtos.TrackContents; using SJZY.Track.Domain.Enums; using SJZY.Track.Domain.Queries; @@ -18,14 +21,21 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe private readonly IOrderRepository _orderRepository; private readonly IProvideQueries _provideQueries; private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; + private readonly RabbitClientBus _rabbitClientBus; - public TrackUpsertEventHandler(IOrderRepository orderRepository, ICapPublisher capPublisher, - IProvideQueries provideQueries, ITrackDetailsEsRepository trackDetailsEsRepository) + public TrackUpsertEventHandler( + IOrderRepository orderRepository, + ICapPublisher capPublisher, + IProvideQueries provideQueries, + ITrackDetailsEsRepository trackDetailsEsRepository, + ITrackStatusRepository trackStatusRepository, + RabbitClientBus rabbitClientBus) { _orderRepository = orderRepository; _capPublisher = capPublisher; _provideQueries = provideQueries; _trackDetailsEsRepository = trackDetailsEsRepository; + _rabbitClientBus = rabbitClientBus; } [CapSubscribe(GlobalConst.TrackUpsertSubscribe, Group = GlobalConst.TrackUpsertSubscribe)] @@ -35,13 +45,60 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe if (!CanDelete(@event)) return; var canNextOrderIds = new List(); - await HandleTrackAsync(@event, canNextOrderIds); + + var content = await HandleTrackAsync(@event, canNextOrderIds); + + // 处理广播事件 + PublicTrackTopic(@event, content); if (canNextOrderIds.Count == 0) return; // 根据订单关联关系异步向下刷(异步) await DownByOrderLink(@event, canNextOrderIds); } + /// + /// 发送轨迹广播 + /// + /// + /// + private void PublicTrackTopic(TrackUpsertEvent eto, TrackContentVO? content) + { + // var trackStatus = await _trackStatusRepository.GetFirstAsync(m => m.Code == content.TrackStatusCode); + if (content == null || !content.IsToMq) + return; + + var data = new TrackChangeEto() + { + EstimatedDeliveryDate = eto.EstimatedDeliveryDate, + TrackPlacePostcode = eto.TrackPlacePostcode, + TrackPlaceNation = eto.TrackPlaceNation, + TrackPlaceProvince = eto.TrackPlaceProvince, + TrackPlaceCity = eto.TrackPlaceCity, + Files = eto.Files, + Remarks = eto.Remarks, + Source = eto.Source, + IsVisibility = eto.IsVisibility, + TrackTimeZone = eto.TrackTimeZone, + TrackTime = eto.TrackTime, + TrackPlace = eto.TrackPlace, + TrackStatusCode = content.TrackStatusCode, + EnStatus = eto.EnStatus, + Content = eto.Content, + TrackCode = eto.TrackCode, + OperationMan = eto.OperationMan, + OrderIdentifiers = eto.OrderIdentifiers, + CustomId = eto.CustomId, + SubSystemId = eto.SubSystemId + }; + + if (eto.IsAdd) + data.Option = 1; + else + data.Option = 3; + + _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{content.SubSystemCode}", Encoding.UTF8.GetBytes(data.ToJson())); + } + private async Task DownByOrderLink(TrackUpsertEvent @event, List canNextOrderIds) { // 根据订单关联关系异步向下刷(异步) @@ -126,7 +183,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe return true; } - private async Task HandleTrackAsync(TrackUpsertEvent @event, List canNextOrderIds) + private async Task HandleTrackAsync(TrackUpsertEvent @event, List canNextOrderIds) { var trackContent = await _provideQueries.GetTrackContentAsync(@event.SubSystemId, @event.TrackCode); @@ -134,12 +191,12 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe { // 找不到轨迹内容,直接结束 LogHelper.Warn($"找不到轨迹内容:{@event}", true); - return; + return default; } var insertTracks = await UpsertTrackAsync(@event, canNextOrderIds, trackContent); - if (canNextOrderIds.Count == 0) return; + if (canNextOrderIds.Count == 0) return trackContent; if (insertTracks.Any()) { @@ -195,6 +252,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe } }; await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, trackPushEvent); + + return trackContent; } private async Task> UpsertTrackAsync(TrackUpsertEvent @event, List canNextOrderIds, diff --git a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs index 44486d40..e36b86ce 100644 --- a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs +++ b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs @@ -3,6 +3,7 @@ using DotNetCore.CAP; using DotNetCore.CAP.Internal; using Microsoft.Extensions.Configuration; using RabbitMQ.Client; +using Savorboard.CAP.InMemoryMessageQueue; using SJZY.Expand.ABP.Core.Localization; using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.PublicMethords; @@ -50,10 +51,7 @@ public class SjzyTrackApplicationModule : AbpModule }); //添加虚拟文件系统 - Configure(options => - { - options.FileSets.AddEmbedded("SJZY.Track.Application"); - }); + Configure(options => { options.FileSets.AddEmbedded("SJZY.Track.Application"); }); //添加多语言 var languageConfig = configuration.GetSection("Language"); @@ -82,45 +80,59 @@ public class SjzyTrackApplicationModule : AbpModule //CAP context.Services.AddSingleton(); context.Services.AddCapTableNameService(); - context.Services.AddCap(options => + if (!System.Diagnostics.Debugger.IsAttached) { - options.UseMySql(configuration["ConnectionStrings:DefaultConnection"]!); - options.UseRabbitMQ(configure => + context.Services.AddCap(options => { - configure.HostName = configuration["RabbitMQ:HostName"]!; - configure.UserName = configuration["RabbitMQ:UserName"]!; - configure.Password = configuration["RabbitMQ:Password"]!; - configure.Port = configuration.GetValue("RabbitMQ:Port"); - configure.BasicQosOptions = - new RabbitMQOptions.BasicQos(configuration.GetValue("CAP:PrefetchCount")); - }); - options.FailedRetryInterval = configuration.GetValue("CAP:FailedRetryInterval"); - options.FailedRetryCount = configuration.GetValue("CAP:FailedRetryCount"); - options.SucceedMessageExpiredAfter = configuration.GetValue("CAP:SucceedMessageExpiredAfter"); - options.FallbackWindowLookbackSeconds = - configuration.GetValue("CAP:FallbackWindowLookbackSeconds"); - - options.UseDashboard(dashboardOptions => - { - dashboardOptions.PathBase = System.Diagnostics.Debugger.IsAttached - ? "" - : configuration["Swagger:JsonUrlPrefix"]!; - }); - options.FailedThresholdCallback = faileCalback => - { - try + options.UseMySql(configuration["ConnectionStrings:DefaultConnection"]!); + options.UseRabbitMQ(configure => { - LogHelper.Error($@" + configure.HostName = configuration["RabbitMQ:HostName"]!; + configure.UserName = configuration["RabbitMQ:UserName"]!; + configure.Password = configuration["RabbitMQ:Password"]!; + configure.Port = configuration.GetValue("RabbitMQ:Port"); + configure.BasicQosOptions = + new RabbitMQOptions.BasicQos(configuration.GetValue("CAP:PrefetchCount")); + }); + options.FailedRetryInterval = configuration.GetValue("CAP:FailedRetryInterval"); + options.FailedRetryCount = configuration.GetValue("CAP:FailedRetryCount"); + options.SucceedMessageExpiredAfter = configuration.GetValue("CAP:SucceedMessageExpiredAfter"); + options.FallbackWindowLookbackSeconds = + configuration.GetValue("CAP:FallbackWindowLookbackSeconds"); + + options.UseDashboard(dashboardOptions => + { + dashboardOptions.PathBase = System.Diagnostics.Debugger.IsAttached + ? "" + : configuration["Swagger:JsonUrlPrefix"]!; + }); + options.FailedThresholdCallback = faileCalback => + { + try + { + LogHelper.Error($@" |-CAP失败回调事件: |-处理类型:{(faileCalback.MessageType == DotNetCore.CAP.Messages.MessageType.Subscribe ? "消费消息达到最大重试次数,需要开发人员介入" : "生产消息推送失败")} |-头部信息:{faileCalback.Message.Headers.ToJson()}"); - } - catch (Exception ex) - { - LogHelper.Error("【严重】CAP失败回调事件发生未处理异常" + ex); - } - }; - }).AddSubscribeFilter(); + } + catch (Exception ex) + { + LogHelper.Error("【严重】CAP失败回调事件发生未处理异常" + ex); + } + }; + }).AddSubscribeFilter(); + } + else + { + //是本地调试环境,用内存存储和内存队列 + context.Services.AddCap(capOptions => + { + capOptions.UseInMemoryStorage(); + capOptions.UseInMemoryMessageQueue(); + capOptions.UseDashboard(); + }).AddSubscribeFilter(); + Console.WriteLine("-- 当前为VS本地环境,用内存存储和内存队列"); + } context.Services.AddRabbitBoot(options => @@ -142,6 +154,17 @@ public class SjzyTrackApplicationModule : AbpModule o.QueueBind(GlobalConst.TrackRefreshSubscribe, GlobalConst.InterfaceRelayExchange, GlobalConst.TrackRefreshSubscribe); } + }, + new() + { + //广播轨迹 + Queue = GlobalConst.TrackRefreshSubscribe, + FetchCount = configuration.GetValue("TrackApp:TrackRefreshFetchCount"), + FailedRequeue = false, + Declaration = o => + { + o.ExchangeDeclare(GlobalConst.TrackChangeExchange, ExchangeType.Topic, true); + } } }; }, typeof(SjzyTrackApplicationModule).Assembly); diff --git a/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs b/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs index d517bfc8..e7901efa 100644 --- a/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs +++ b/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs @@ -51,4 +51,11 @@ public partial class GlobalConst /// 预警计算任务 /// public const string TrackWarningCalcSubscribe = "SJZY.Track.TrackWarningCalc"; + + /// + /// 轨迹变更通知交换机 + /// + public const string TrackChangeExchange = "sjzy.track.on_track_change_ex"; + + } diff --git a/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs b/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs index f9f6da60..f084b0a8 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs @@ -51,4 +51,9 @@ public class TrackContentVO /// 是否允许手动创建 /// public bool IsAllowManuallyCreate { get; set; } + + /// + /// 是否广播 + /// + public bool IsToMq { get; set; } } diff --git a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs index 25d2c0d9..710dd407 100644 --- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs +++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs @@ -93,7 +93,8 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen IsCompleted = y.IsCompleted, IsRepeatable = x.IsRepeatable, IsAllowManuallyUpdate = x.IsAllowManuallyUpdate, - IsAllowManuallyCreate = x.IsAllowManuallyCreate + IsAllowManuallyCreate = x.IsAllowManuallyCreate, + IsToMq = y.IsToMq, }) .FirstAsync(); } From 1bfac284d6165b68ff85cff8cd3caaa835e4dc53 Mon Sep 17 00:00:00 2001 From: eli Date: Fri, 15 Nov 2024 16:21:22 +0800 Subject: [PATCH 23/75] =?UTF-8?q?=E8=A1=A5=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CAP/EventHandlers/TrackUpsertEventHandler.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 2259c18d..cfdc1ed4 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -198,9 +198,9 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe //通过来源指示是否为手动操作 var manualOperation = @event.Source == (int) TrackSourceEnum.Artificial; //轨迹内容标识不允许手动创建的 - if (manualOperation && @event.IsAdd && trackContent.IsAllowManuallyCreate == false) return; + if (manualOperation && @event.IsAdd && trackContent.IsAllowManuallyCreate == false) return trackContent; //轨迹内容标识不允许手动更新的 - if (manualOperation && !@event.IsAdd && trackContent.IsAllowManuallyUpdate == false) return; + if (manualOperation && !@event.IsAdd && trackContent.IsAllowManuallyUpdate == false) return trackContent; var insertTracks = await UpsertTrackAsync(@event, canNextOrderIds, trackContent); From 7bc3e09d90fb2a7b6cad137fabe5e1242c09dbcf Mon Sep 17 00:00:00 2001 From: eli Date: Mon, 18 Nov 2024 10:13:53 +0800 Subject: [PATCH 24/75] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BatchDeleteTrackByEsIdInput.cs | 13 +++ .../Events/TrackChangeEto.cs | 5 + .../Events/TrackDeleteEvent.cs | 5 + .../EventHandlers/TrackDeleteEventHandler.cs | 109 +++++++++++++++--- .../Services/ProvideServices/OrderService.cs | 23 ++-- .../Services/ProvideServices/TrackService.cs | 38 +++++- .../OrderOperationRecordIndex.cs | 14 +++ .../ITrackContentRepository.cs | 1 + .../ITrackDetailsEsRepository.cs | 1 + .../Dtos/TrackContents/TrackContentVO.cs | 5 + .../Repositories/TrackContentRepository.cs | 23 ++++ .../Repositories/TrackDetailsEsRepository.cs | 12 ++ 12 files changed, 225 insertions(+), 24 deletions(-) create mode 100644 src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackByEsIdInput.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackByEsIdInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackByEsIdInput.cs new file mode 100644 index 00000000..681b3b75 --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackByEsIdInput.cs @@ -0,0 +1,13 @@ +using System.ComponentModel.DataAnnotations; + +namespace SJZY.Track.Application.Contract.Dtos.ProvideServices; + +public class BatchDeleteTrackByEsIdInput +{ + + /// + /// 轨迹内容es id,必填 + /// + [MaxLength(500)] + public List TrackContentEsIds { get; set; } = new(); +} diff --git a/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs b/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs index 9d3a0a49..e1559126 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs @@ -14,6 +14,11 @@ public class TrackChangeEto /// public int SubSystemId { get; set; } + /// + /// 单号 + /// + public string OrderNo { get; set; } + /// /// 客户id /// diff --git a/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs index f395e972..7fba7153 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs @@ -7,6 +7,11 @@ public class TrackDeleteEvent /// public int SubSystemId { get; set; } + /// + /// es中的id + /// + public string[] EsIds { get; set; } + /// /// 订单ids /// diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index 127305ac..92ca0dee 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -1,9 +1,14 @@ +using System.Text; +using BSI.Stack.Rabbit; using DotNetCore.CAP; using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Track.Application.Contract.Events; using SJZY.Track.Domain.Aggregates.OrderAggregate; +using SJZY.Track.Domain.Aggregates.TrackContentAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; +using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; +using SJZY.Track.Domain.Enums; using SJZY.Track.Domain.Queries; using Volo.Abp.DependencyInjection; @@ -13,17 +18,26 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe { private readonly ICapPublisher _capPublisher; private readonly IOrderRepository _orderRepository; + private readonly ITrackStatusRepository _trackStatusRepository; + private readonly ITrackContentRepository _trackContentRepository; private readonly IProvideQueries _provideQueries; private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; + private readonly RabbitClientBus _rabbitClientBus; public TrackDeleteEventHandler(IProvideQueries provideQueries, IOrderRepository orderRepository, ICapPublisher capPublisher, - ITrackDetailsEsRepository trackDetailsEsRepository) + ITrackDetailsEsRepository trackDetailsEsRepository, + RabbitClientBus rabbitClientBus, + ITrackStatusRepository trackStatusRepository, + ITrackContentRepository trackContentRepository) { _provideQueries = provideQueries; _orderRepository = orderRepository; _capPublisher = capPublisher; _trackDetailsEsRepository = trackDetailsEsRepository; + _rabbitClientBus = rabbitClientBus; + _trackStatusRepository = trackStatusRepository; + _trackContentRepository = trackContentRepository; } [CapSubscribe(GlobalConst.TrackDeleteSubscribe, Group = GlobalConst.TrackDeleteSubscribe)] @@ -31,7 +45,10 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe { if (!CanDelete(@event)) return; - await DeleteTrackAsync(@event); + var trackList = await DeleteTrackAsync(@event); + + //发布事件 + await PublicTrackTopicAsync(@event, trackList); // 根据订单关联关系异步向下刷(异步) await DownByOrderLink(@event); @@ -84,12 +101,8 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe private bool CanDelete(TrackDeleteEvent @event) { - // 系统创建的轨迹不允许删除 - if (@event.Visited.IsNullOrEmpty() && @event.OperationMan == GlobalConst.SystemUser) - { - LogHelper.Warn($"系统创建的轨迹不允许被删除:{@event}", true); - return false; - } + if (@event.OrderIds == null) + return true; // 订单循环关联检测 var dup = @event.Visited.Intersect(@event.OrderIds).ToArray(); @@ -102,14 +115,79 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe return true; } - private async Task DeleteTrackAsync(TrackDeleteEvent @event) + private async Task PublicTrackTopicAsync(TrackDeleteEvent eto, List trackList) { - // 删除轨迹(删的是同子系统下的单,所以code是统一的) - var tracks = await _trackDetailsEsRepository.GetLatestListAsync(@event.OrderIds, @event.TrackCodes); + if (trackList == null) + return; - var orderIds = await _trackDetailsEsRepository.DeleteTrackAsync(@event.OrderIds, @event.TrackCodes); + var statusList = await _trackStatusRepository.GetListAsync(m => m.SubSystemId == eto.SubSystemId); + if (statusList == null) + return; + + var contentList = await _trackContentRepository.GetTrackContentBySyetemIdAsync(eto.SubSystemId); + if (contentList == null) + return; + + foreach (var dataItem in trackList.GroupBy(m => new + { + m.TrackCode, + m.OrderNo + })) + { + var item = dataItem.First(); + var status = statusList.FirstOrDefault(m => m.Code == item.TrackStatusCode); + if (status == null || !status.IsToMq) + continue; + + var content = contentList.FirstOrDefault(m => m.TrackContentCode == item.TrackCode); + + var data = new TrackChangeEto() + { + OrderIdentifiers = dataItem.Select(m => new OrderIdentifier + { + OrderId = m.OrderId, + OrderNo = m.OrderNo, + OrderType = m.OrderType + }).ToArray(), + TrackStatusCode = item.TrackStatusCode, + TrackCode = item.TrackCode, + OperationMan = eto.OperationMan, + SubSystemId = eto.SubSystemId, + Option = 2 + }; + + _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{content.SubSystemCode}", Encoding.UTF8.GetBytes(data.ToJson())); + } + } + + private async Task> DeleteTrackAsync(TrackDeleteEvent @event) + { + List orderIds; + List tracks; + if (@event.EsIds != null && @event.EsIds.Any()) //根据明确的esid进行删除 + { + tracks = await _trackDetailsEsRepository.GetDataByIds(@event.EsIds); + orderIds = tracks.Select(m => m.OrderId).Distinct().ToList(); + + // 外部api获取的轨迹不允许删除 + if (tracks.Any(m => m.Source == TrackSourceEnum.ExternalServiceProvide.GetHashCode())) + return tracks; + + // 删除轨迹 + foreach (var item in tracks) + { + await _trackDetailsEsRepository.DeleteTrackByIdAsync(item.Id, item.IndexName); + } + } + else //原有逻辑,根据轨迹code和订单进行删除 + { + // 删除轨迹(删的是同子系统下的单,所以code是统一的) + tracks = await _trackDetailsEsRepository.GetLatestListAsync(@event.OrderIds, @event.TrackCodes); + + orderIds = await _trackDetailsEsRepository.DeleteTrackAsync(@event.OrderIds, @event.TrackCodes); + if (orderIds.Count == 0) return tracks; + } - if (orderIds.Count == 0) return; var orders = await _orderRepository.GetListAsync(x => orderIds.Contains(x.Id), x => new OrderEntity @@ -121,8 +199,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe LatestTrackTime = x.LatestTrackTime, LatestTrackTimeZone = x.LatestTrackTimeZone, }); - - if (orders.Count == 0) return; + if (orders.Count == 0) return tracks; foreach (var order in orders) { @@ -157,5 +234,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe x.LatestTrackTime, x.LatestTrackTimeZone }); + + return tracks; } } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs index 07859810..ce0c265e 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs @@ -43,6 +43,8 @@ public partial class OrderService : ApplicationService, IOrderService throw new BusinessException(message: "【目的地时区】和【预计到达时间】必须同时输入"); } + var currentUser = CurrentUserRequest.CurrentUser; + // 校验订单是否已存在,存在则更新 var order = await _orderRepository.GetFirstAsync(x => x.SubSystemId == input.SubSystemId && x.OrderType == input.OrderType && x.OrderNo == input.OrderNo); @@ -55,8 +57,10 @@ public partial class OrderService : ApplicationService, IOrderService { OrderId = order.Id, OrderNo = input.OrderNo, - OptionType = OptionType.修改.ToString(), + OptionType = OrderOperationType.修改订单.ToString(), Content = input.ToJson(), + CreateUserId = currentUser.UserId, + CreateUserString = currentUser.Name, }; _ = _orderOperationRecordEsRepository.AddAsync(index); @@ -71,18 +75,20 @@ public partial class OrderService : ApplicationService, IOrderService order.SubSystemId = input.SubSystemId; order.OrderFlights = ObjectMapper.Map, List>(input.FlightInfos); order.OrderPullStatus = BuiltOrderPullStatus(input.PullConfigInfos); - order.OrderPlatformNumbers = BuiltOrderPlatformNumbers(input.PullConfigInfos); + order.OrderPlatformNumbers = BuiltOrderPlatformNumbers(input.PullConfigInfos); var orderId = await _orderRepository.CreateOrderAsync(order); // 写入操作日志 + var indexForAdd = new OrderOperationRecordIndex { OrderId = orderId, OrderNo = input.OrderNo, - OptionType = OptionType.新增.ToString(), + OptionType = OrderOperationType.创建订单.ToString(), Content = input.ToJson(), - CreateUserId = CurrentUserRequest.CurrentUser.UserId, + CreateUserId = currentUser.UserId, + CreateUserString = currentUser.Name, CreateTime = DateTime.Now }; _ = _orderOperationRecordEsRepository.AddAsync(indexForAdd); @@ -156,7 +162,8 @@ public partial class OrderService : ApplicationService, IOrderService return status; }).ToList(); } - private List BuiltOrderPlatformNumbers(List? pullConfigInfos) + + private List BuiltOrderPlatformNumbers(List? pullConfigInfos) { if (pullConfigInfos == null) return new List(); @@ -165,9 +172,9 @@ public partial class OrderService : ApplicationService, IOrderService var status = new OrderPlatformNumberEntity { //三方单号 - OrderNumber = x.OrderNo, - //三方平台名称,目前认为是服务商code - Platform = x.ServiceCode, + OrderNumber = x.OrderNo, + //三方平台名称,目前认为是服务商code + Platform = x.ServiceCode, }; return status; diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 37a6e394..a1d373f0 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -175,6 +175,42 @@ public partial class TrackService : ApplicationService, ITrackService return new UnifyResultDto(true, true); } + /// + /// 根据esid删除轨迹内容 + /// + /// + /// + [HttpPost("Track/BatchDeleteByEsId")] + public async Task BatchDeleteTrackByEsIdAsync(BatchDeleteTrackByEsIdInput input) + { + var tracks = await _trackDetailsEsRepository.GetDataByIds(input.TrackContentEsIds.ToArray()); + if (tracks == null || tracks.Count == 0) + return new UnifyResultDto(false, "未找到指定id下的轨迹内容"); + + if (tracks.Any(m => m.Source == TrackSourceEnum.ExternalServiceProvide.GetHashCode())) + return new UnifyResultDto(false, "存在来源于外部服务商的轨迹,不允许删除"); + + if (tracks.GroupBy(m => m.SubSystemId).Count() > 1) + return new UnifyResultDto(false, "暂不支持跨子系统批量删除"); + + // 获取用户name + var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(); + if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) + { + throw new BusinessException(message: $"调用用户中心,获取用户信息失败:{userInfo.Msg}"); + } + + // 删除轨迹 + var @event = new TrackDeleteEvent + { + EsIds = input.TrackContentEsIds.ToArray(), + SubSystemId = tracks.First().SubSystemId, + OperationMan = userInfo.Data.UserName, + }; + await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, @event); + + return new UnifyResultDto(true); + } /// /// 批量删除轨迹 @@ -217,7 +253,7 @@ public partial class TrackService : ApplicationService, ITrackService OrderIds = orderIds.ToArray(), TrackCodes = input.TrackCodes, SubSystemId = input.SubSystemId, - OperationMan = userInfo.Data.UserName + OperationMan = userInfo.Data.UserName, }; await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, @event); diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderOperationRecordIndex.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderOperationRecordIndex.cs index cedba47d..df044ff6 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderOperationRecordIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderOperationRecordIndex.cs @@ -40,8 +40,22 @@ public class OrderOperationRecordIndex : IdBaseIndex /// public int CreateUserId { get; set; } + /// + /// 创建人姓名 + /// + public string CreateUserString { get; set; } + /// /// 创建时间 /// public DateTime CreateTime { get; set; } } + +public enum OrderOperationType +{ + 创建订单 = 1, + 修改订单 = 2, + 创建轨迹 = 3, + 修改轨迹 = 4, + 删除轨迹 = 5 +} diff --git a/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/ITrackContentRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/ITrackContentRepository.cs index b321e87b..fe3a81d7 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/ITrackContentRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/ITrackContentRepository.cs @@ -28,4 +28,5 @@ public interface ITrackContentRepository : IBasicRepository Task GetTemplateIsExist(int trackContentId); Task GetByCodeAsync(int systemId, string code); Task> GetListBySystemIdAsync(int systemId); + Task> GetTrackContentBySyetemIdAsync(int subSystemId); } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs index f68269ff..a8da5185 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs @@ -28,4 +28,5 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService> DeleteTrackAsync(int[] orderIds, List trackCodes); Task DeleteTrackByIdAsync(string id, string indexName); + Task> GetDataByIds(string[] ids); } diff --git a/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs b/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs index f084b0a8..8b7cdf3f 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs @@ -56,4 +56,9 @@ public class TrackContentVO /// 是否广播 /// public bool IsToMq { get; set; } + + /// + /// 轨迹内容code + /// + public string TrackContentCode { get; set; } } diff --git a/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs index 6ce6a15c..d619613b 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs @@ -248,4 +248,27 @@ public class TrackContentRepository : BasicRepository, ITrac }) .ToListAsync(); } + + public Task> GetTrackContentBySyetemIdAsync(int subSystemId) + { + return Context.Queryable() + .LeftJoin((x, y) => x.TrackStatusId == y.Id) + .LeftJoin((x, y, z) => x.SubSystemId == z.Id) + .Where(x => x.SubSystemId == subSystemId) + .Select((x, y, z) => new TrackContentVO + { + SubSystemCode = z.Key, + TrackStatusId = x.TrackStatusId, + TrackStatus = y.Status, + TrackStatusCode = y.Code, + TrackContent = x.Content, + TrackContentCode = x.Code, + TrackEnContent = x.EnContent, + IsCompleted = y.IsCompleted, + IsRepeatable = x.IsRepeatable, + IsAllowManuallyUpdate = x.IsAllowManuallyUpdate, + IsAllowManuallyCreate = x.IsAllowManuallyCreate, + IsToMq = y.IsToMq, + }).ToListAsync(); + } } diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index 014c0c45..beb8dc0a 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -408,6 +408,7 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract x.OrderId).ToList(); } + public async Task DeleteTrackByIdAsync(string id, string indexName) { var r = await Context.DeleteAsync(id, u => u @@ -419,4 +420,15 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract> GetDataByIds(string[] ids) + { + var res = await Context.SearchAsync(m => m + .Index(GlobalConst.TrackDetailsIndex) + .Query( + q => q.Ids(i => i.Values(ids)) + )); + + return res.ToIdList(); + } } From 811b38c38da9668371fd4b4ade2280e469503a24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Mon, 18 Nov 2024 14:50:28 +0800 Subject: [PATCH 25/75] =?UTF-8?q?update:=20=E8=A7=A3=E9=99=A4=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E8=BD=A8=E8=BF=B9=E5=AF=B9=E4=B8=8D=E5=85=81=E8=AE=B8?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E7=9A=84=E8=BD=A8=E8=BF=B9=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E7=9A=84=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ProvideServices/TrackService.cs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index a1d373f0..a1eea9ae 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -89,12 +89,6 @@ public partial class TrackService : ApplicationService, ITrackService var tracks = await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true); - //轨迹内容不允许重复,并且已经存在了轨迹记录 - if (input.IsAdd && !trackContent.IsRepeatable && tracks.Count >= 1) - { - throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许重复添加"); - } - //更新轨迹,但存在多条轨迹记录,理由:不清晰到底要修改哪一条或是全部修改 if (!input.IsAdd && tracks.Count > 1) { @@ -324,12 +318,6 @@ public partial class TrackService : ApplicationService, ITrackService var tracks = await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true); - //轨迹内容不允许重复,并且已经存在了轨迹记录 - if (input.IsAdd && !trackContent.IsRepeatable && tracks.Count >= 1) - { - throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许重复添加"); - } - //更新轨迹,存在多条轨迹记录不允许更改,理由:不清晰到底要修改哪一条或是全部修改 if (!input.IsAdd && tracks.Count > 1) { From 90258e8168976558dda64583f0e8b30cd6b5b1d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Mon, 18 Nov 2024 15:57:04 +0800 Subject: [PATCH 26/75] =?UTF-8?q?update:=20=E4=BF=AE=E6=94=B9=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=8B=89=E5=8F=96=E4=BD=BF=E7=94=A8=E5=8D=95=E5=8F=B7?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=85=88=E4=BD=BF=E7=94=A8=E6=9D=A5=E6=BA=90?= =?UTF-8?q?=E4=BA=8E=E3=80=90OrderPullStatus=E3=80=91=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E4=B8=89=E6=96=B9=E5=8D=95=E5=8F=B7=EF=BC=8C=E8=8B=A5=E4=B8=89?= =?UTF-8?q?=E6=96=B9=E5=8D=95=E5=8F=B7=E4=B8=BA=E7=A9=BA=E6=89=8D=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E4=B8=BB=E5=8D=95=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update-entity: 修改三方订单关联实体字段OrderNumber为可控 fix:修复【更新轨迹订单】订单关联信息更新失败的问题,修复办法:替换关联实体集合【OrderFlightEntity】【OrderPullStatusEntity】【OrderPlatformNumberEntity】先删后增的方式 --- .../Services/ProvideServices/OrderService.cs | 3 ++- .../Aggregates/OrderAggregate/OrderPlatformNumberEntity.cs | 2 +- src/SJZY.Track.Repository/Queries/ProvideQueries.cs | 6 ++++-- src/SJZY.Track.Repository/Repositories/OrderRepository.cs | 7 +++++++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs index ce0c265e..772cef1e 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs @@ -80,7 +80,6 @@ public partial class OrderService : ApplicationService, IOrderService var orderId = await _orderRepository.CreateOrderAsync(order); // 写入操作日志 - var indexForAdd = new OrderOperationRecordIndex { OrderId = orderId, @@ -129,6 +128,8 @@ public partial class OrderService : ApplicationService, IOrderService { order = ObjectMapper.Map(input, order); order.OrderFlights = ObjectMapper.Map, List>(input.FlightInfos); + order.OrderPullStatus = BuiltOrderPullStatus(input.PullConfigInfos); + order.OrderPlatformNumbers = BuiltOrderPlatformNumbers(input.PullConfigInfos); await _orderRepository.UpdateOrderAsync(order); } diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderPlatformNumberEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderPlatformNumberEntity.cs index 07a331db..b4ae68bf 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderPlatformNumberEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderPlatformNumberEntity.cs @@ -22,7 +22,7 @@ public class OrderPlatformNumberEntity : IFullAuditedBasicEntitys, IEntity /// 外部单号 /// [SugarColumn(ColumnName = "OrderNumber")] - public string OrderNumber { get; set; } + public string? OrderNumber { get; set; } /// /// 平台名称 diff --git a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs index 710dd407..31855027 100644 --- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs +++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs @@ -45,7 +45,8 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen && b.StartTime <= DateTime.Now && b.EndTime >= DateTime.Now) .Select((a, b, c) => new OrderWithServiceProviderVO { - OrderNo = a.OrderNo, + //优先使用第三方的订单号,为空时才使用主单号 + OrderNo = b.OrderNo ?? a.OrderNo, OrderType = a.OrderType, SubSystemId = a.SubSystemId, ServiceProviderCode = b.ServiceProviderCode, @@ -65,7 +66,8 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen b.EndTime >= DateTime.Now) .Select((a, b) => new OrderWithServiceProviderVO { - OrderNo = a.OrderNo, + //优先使用第三方的订单号,为空时才使用主单号 + OrderNo = b.OrderNo ?? a.OrderNo, OrderType = a.OrderType, SubSystemId = a.SubSystemId, ServiceProviderCode = b.ServiceProviderCode diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index bb7d8dd3..5d427cab 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -99,6 +99,13 @@ public class OrderRepository : BasicRepository, IOrderRepository, I // 更新订单模板 await Context.Deleteable().Where(x => x.OrderId == order.Id).ExecuteCommandAsync(); + order.OrderPullStatus.ForEach(x => x.OrderId = order.Id); + await Context.Insertable(order.OrderPullStatus).ExecuteCommandAsync(); + + // 更新订单三方关联 + await Context.Deleteable().Where(x => x.OrderId == order.Id).ExecuteCommandAsync(); + order.OrderPlatformNumbers.ForEach(x => x.OrderId = order.Id); + await Context.Insertable(order.OrderPlatformNumbers).ExecuteCommandAsync(); // 更新订单航班 await Context.Deleteable().Where(x => x.OrderId == order.Id).ExecuteCommandAsync(); From 182cbb886985793db0bfb349b497f21f1c99067b Mon Sep 17 00:00:00 2001 From: eli Date: Mon, 18 Nov 2024 16:14:21 +0800 Subject: [PATCH 27/75] =?UTF-8?q?=E8=87=AA=E6=B5=8Bbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TrackContents/TrackContentService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index dca95c7e..9e2ef87f 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -255,7 +255,7 @@ public class TrackContentService : ApplicationService foreach (var item in contentList) { - if (!item.IsRepeatable && trackDetails?.Any(m => m.TrackCode == item.Code) == true) //跳过已存在轨迹内容 + if (input.TrackOptionType == TrackOptionType.创建 && !item.IsRepeatable && trackDetails?.Any(m => m.TrackCode == item.Code) == true) //新增时跳过已存在轨迹内容 continue; if (!item.IsAllowManuallyCreate && input.TrackOptionType == TrackOptionType.创建) //跳过不允许手动创建的轨迹内容 From e2171767fb4bd89c087cfa91a085a62b0cba8bee Mon Sep 17 00:00:00 2001 From: eli Date: Mon, 18 Nov 2024 18:54:54 +0800 Subject: [PATCH 28/75] =?UTF-8?q?=E8=87=AA=E6=B5=8Bbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TrackOrders/TrackOrderService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index 41ccf841..009ebc59 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -207,8 +207,8 @@ public class TrackOrderService : ApplicationService if (!isCompleted) isCompleted = currentTrackStatus is { IsCompleted: true }; - //如果是内部系统,且轨迹内容不对外则跳过这条轨迹内容 - if (system.SystemProperty == 1 && item.IsVisibility) + //如果是外部系统,且轨迹内容不对外则跳过这条轨迹内容 + if (system.SystemProperty == 2 && !item.IsVisibility) continue; res.Data.Add(new GetDetailTimelineOutput() From 196547e80a2fda2be9e097f54b90123005fb911b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Tue, 19 Nov 2024 10:32:04 +0800 Subject: [PATCH 29/75] =?UTF-8?q?update:=E5=A2=9E=E5=8A=A0=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=98=8E=E7=BB=86=E7=9B=B8=E5=85=B3=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=20-=20TrackPlaceCityId=EF=BC=88=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E5=8F=91=E7=94=9F=E5=9C=B0=EF=BC=88=E5=9F=8E=E5=B8=82?= =?UTF-8?q?=EF=BC=89Id=EF=BC=89=20-=20TrackPlaceProvinceId=EF=BC=88?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E5=8F=91=E7=94=9F=E5=9C=B0=EF=BC=88=E7=9C=81?= =?UTF-8?q?/=E5=B7=9E=EF=BC=89Id=EF=BC=89=20-=20TrackPlaceNationId=20?= =?UTF-8?q?=EF=BC=88=20=E8=BD=A8=E8=BF=B9=E5=8F=91=E7=94=9F=E5=9C=B0?= =?UTF-8?q?=EF=BC=88=E5=9B=BD=E5=AE=B6/=E5=9C=B0=E5=8C=BA=EF=BC=89Id?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProvideServices/BatchUpsertTrackInput.cs | 15 ++++++++++++ .../Dtos/ProvideServices/UpsertTrackInput.cs | 15 ++++++++++++ .../Events/TrackChangeEto.cs | 15 ++++++++++++ .../Events/TrackUpsertEvent.cs | 15 ++++++++++++ .../EventHandlers/TrackUpsertEventHandler.cs | 9 ++++++++ .../Services/ProvideServices/TrackService.cs | 3 +++ .../TrackDetailsIndex.cs | 23 +++++++++++++++---- src/SJZY.Track.Domain/Consts/GlobalConst.cs | 1 + .../Repositories/TrackDetailsEsRepository.cs | 9 ++++++++ 9 files changed, 101 insertions(+), 4 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs index 337d02a7..3992554f 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs @@ -73,16 +73,31 @@ public class BatchUpsertTrackInput : OrderNosInfo /// public string? TrackPlaceCity { get; set; } + /// + /// 轨迹发生地(城市)Id + /// + public int? TrackPlaceCityId { get; set; } + /// /// 轨迹发生地(省/州) /// public string? TrackPlaceProvince { get; set; } + /// + ///轨迹发生地(省/州)Id + /// + public int? TrackPlaceProvinceId { get; set; } + /// /// 轨迹发生地(国家/地区) /// public string? TrackPlaceNation { get; set; } + /// + /// 轨迹发生地(国家/地区)Id + /// + public int? TrackPlaceNationId { get; set; } + /// /// 轨迹发生地邮编 /// diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs index d38a19e4..309d652e 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs @@ -73,16 +73,31 @@ public class UpsertTrackInput : OrderNoInfo /// public string? TrackPlaceCity { get; set; } + /// + /// 轨迹发生地(城市)Id + /// + public int? TrackPlaceCityId { get; set; } + /// /// 轨迹发生地(省/州) /// public string? TrackPlaceProvince { get; set; } + /// + /// 轨迹发生地(省/州)Id + /// + public int? TrackPlaceProvinceId { get; set; } + /// /// 轨迹发生地(国家/地区) /// public string? TrackPlaceNation { get; set; } + /// + /// 轨迹发生地(国家/地区)Id + /// + public int? TrackPlaceNationId { get; set; } + /// /// 轨迹发生地邮编 /// diff --git a/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs b/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs index e1559126..f2eb4fe9 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs @@ -94,16 +94,31 @@ public class TrackChangeEto /// public string? TrackPlaceCity { get; set; } + /// + /// 轨迹发生地(城市)Id + /// + public int? TrackPlaceCityId { get; set; } + /// /// 轨迹发生地(省/州) /// public string? TrackPlaceProvince { get; set; } + /// + ///轨迹发生地(省/州)Id + /// + public int? TrackPlaceProvinceId { get; set; } + /// /// 轨迹发生地(国家/地区) /// public string? TrackPlaceNation { get; set; } + /// + /// 轨迹发生地(国家/地区)Id + /// + public int? TrackPlaceNationId { get; set; } + /// /// 轨迹发生地邮编 /// diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index 07fa4f95..e45b3da8 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -91,16 +91,31 @@ public class TrackUpsertEvent /// public string? TrackPlaceCity { get; set; } + /// + /// 轨迹发生地(城市)Id + /// + public int? TrackPlaceCityId { get; set; } + /// /// 轨迹发生地(省/州) /// public string? TrackPlaceProvince { get; set; } + /// + ///轨迹发生地(省/州)Id + /// + public int? TrackPlaceProvinceId { get; set; } + /// /// 轨迹发生地(国家/地区) /// public string? TrackPlaceNation { get; set; } + /// + /// 轨迹发生地(国家/地区)Id + /// + public int? TrackPlaceNationId { get; set; } + /// /// 轨迹发生地邮编 /// diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index cfdc1ed4..f8a42fad 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -72,8 +72,11 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe EstimatedDeliveryDate = eto.EstimatedDeliveryDate, TrackPlacePostcode = eto.TrackPlacePostcode, TrackPlaceNation = eto.TrackPlaceNation, + TrackPlaceNationId = eto.TrackPlaceNationId, TrackPlaceProvince = eto.TrackPlaceProvince, + TrackPlaceProvinceId = eto.TrackPlaceProvinceId, TrackPlaceCity = eto.TrackPlaceCity, + TrackPlaceCityId = eto.TrackPlaceCityId, Files = eto.Files, Remarks = eto.Remarks, Source = eto.Source, @@ -363,8 +366,11 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe FileName = x.FileName }).ToList(), TrackPlaceCity = @event.TrackPlaceCity ?? GlobalConst.EmptyString, + TrackPlaceCityId = @event.TrackPlaceCityId ?? GlobalConst.NotExistId, TrackPlaceProvince = @event.TrackPlaceProvince ?? GlobalConst.EmptyString, + TrackPlaceProvinceId = @event.TrackPlaceProvinceId ?? GlobalConst.NotExistId, TrackPlaceNation = @event.TrackPlaceNation ?? GlobalConst.EmptyString, + TrackPlaceNationId = @event.TrackPlaceNationId ?? GlobalConst.NotExistId, TrackPlacePostcode = @event.TrackPlacePostcode ?? GlobalConst.EmptyString, DestinationTimeZone = @event.DestinationTimeZone, EstimatedDeliveryDate = @event.EstimatedDeliveryDate, @@ -398,8 +404,11 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe FileName = x.FileName }).ToList(); track.TrackPlaceCity = @event.TrackPlaceCity ?? GlobalConst.EmptyString; + track.TrackPlaceCityId = @event.TrackPlaceCityId ?? GlobalConst.NotExistId; track.TrackPlaceProvince = @event.TrackPlaceProvince ?? GlobalConst.EmptyString; + track.TrackPlaceProvinceId = @event.TrackPlaceProvinceId ?? GlobalConst.NotExistId; track.TrackPlaceNation = @event.TrackPlaceNation ?? GlobalConst.EmptyString; + track.TrackPlaceNationId = @event.TrackPlaceNationId ?? GlobalConst.NotExistId; track.TrackPlacePostcode = @event.TrackPlacePostcode ?? GlobalConst.EmptyString; track.DestinationTimeZone = @event.DestinationTimeZone; track.EstimatedDeliveryDate = @event.EstimatedDeliveryDate; diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index a1eea9ae..bcdbb794 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -357,8 +357,11 @@ public partial class TrackService : ApplicationService, ITrackService Content = input.Content, EnStatus = input.EnStatus, TrackPlaceCity = input.TrackPlaceCity, + TrackPlaceCityId = input.TrackPlaceCityId, TrackPlaceProvince = input.TrackPlaceProvince, + TrackPlaceProvinceId = input.TrackPlaceProvinceId, TrackPlaceNation = input.TrackPlaceNation, + TrackPlaceNationId = input.TrackPlaceNationId, TrackPlacePostcode = input.TrackPlacePostcode, EstimatedDeliveryDate = input.EstimatedDeliveryDate, DestinationTimeZone = input.DestinationTimeZone diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index 887ac5f9..c842786b 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -135,22 +135,37 @@ public class TrackDetailsIndex : IdBaseIndex /// /// 轨迹发生地(城市) /// - public string? TrackPlaceCity { get; set; } + public string? TrackPlaceCity { get; set; } = GlobalConst.EmptyString; + + /// + /// 轨迹发生地(城市)Id + /// + public int? TrackPlaceCityId { get; set; } = GlobalConst.NotExistId; /// /// 轨迹发生地(省/州) /// - public string? TrackPlaceProvince { get; set; } + public string? TrackPlaceProvince { get; set; } = GlobalConst.EmptyString; + + /// + ///轨迹发生地(省/州)Id + /// + public int? TrackPlaceProvinceId { get; set; } = GlobalConst.NotExistId; /// /// 轨迹发生地(国家/地区) /// - public string? TrackPlaceNation { get; set; } + public string? TrackPlaceNation { get; set; } = GlobalConst.EmptyString; + + /// + /// 轨迹发生地(国家/地区)Id + /// + public int? TrackPlaceNationId { get; set; } = GlobalConst.NotExistId; /// /// 轨迹发生地邮编 /// - public string? TrackPlacePostcode { get; set; } + public string? TrackPlacePostcode { get; set; } = GlobalConst.EmptyString; /// /// 预计签收时间 diff --git a/src/SJZY.Track.Domain/Consts/GlobalConst.cs b/src/SJZY.Track.Domain/Consts/GlobalConst.cs index 183d921e..d8064f12 100644 --- a/src/SJZY.Track.Domain/Consts/GlobalConst.cs +++ b/src/SJZY.Track.Domain/Consts/GlobalConst.cs @@ -7,6 +7,7 @@ public partial class GlobalConst public const int ChunkSize = 100; public const int SafelyLimit = 10000; public const int NormalLimit = 10000; + public const int NotExistId = -9999; public const float NoneTrackTimeZone = 99999; diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index beb8dc0a..0fee4fc6 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -152,8 +152,11 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract Date: Tue, 19 Nov 2024 10:47:45 +0800 Subject: [PATCH 30/75] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4=E5=91=BD?= =?UTF-8?q?=E5=90=8D=20GTM=20=3D>=20GMT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TrackOrders/TrackOrderService.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index 009ebc59..ae449cf8 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -98,7 +98,7 @@ public class TrackOrderService : ApplicationService int hours = (int) x.TrackTimeZone; // 提取整数部分作为小时 int minutes = (int) ((x.TrackTimeZone - hours) * 60); // 将小数部分乘以 60 转换为分钟 x.TrackGTMTimeZone = - $"GTM {(x.TrackTimeZone >= 0 ? "+" : "-")}{new TimeSpan(hours, minutes, 0).ToString().RemovePostFix(":00")}"; + $"GMT {(x.TrackTimeZone >= 0 ? "+" : "-")}{new TimeSpan(hours, minutes, 0).ToString().RemovePostFix(":00")}"; }); return res; @@ -149,7 +149,7 @@ public class TrackOrderService : ApplicationService { if (a.TrackTimeZoneValue == 0f) { - a.TrackTimeZone = "GTM +00:00"; + a.TrackTimeZone = "GMT +00:00"; } else if (Math.Abs(a.TrackTimeZoneValue - GlobalConst.NoneTrackTimeZone) < 1) { @@ -163,7 +163,7 @@ public class TrackOrderService : ApplicationService var offset = new TimeSpan(hours, minutes, 0); var timeZoneStr = offset.ToString(); var flag = a.TrackTimeZoneValue > 0f ? "+" : ""; - a.TrackTimeZone = $"GTM {flag}{timeZoneStr.RemovePostFix(":00")}"; + a.TrackTimeZone = $"GMT {flag}{timeZoneStr.RemovePostFix(":00")}"; } }); return list; From 48385cb96171ea40256144b7df3374abae8da168 Mon Sep 17 00:00:00 2001 From: eli Date: Tue, 19 Nov 2024 11:18:20 +0800 Subject: [PATCH 31/75] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E5=88=B0=E8=BD=A8=E8=BF=B9=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Events/TrackDeleteEvent.cs | 5 +++ .../Events/TrackUpsertEvent.cs | 5 +++ .../EventHandlers/TrackDeleteEventHandler.cs | 19 +++++++++++- .../EventHandlers/TrackUpsertEventHandler.cs | 31 +++++++++++++++++-- .../Services/ProvideServices/OrderService.cs | 4 +-- .../Services/ProvideServices/TrackService.cs | 8 +++-- .../OrderOperationRecordIndex.cs | 2 +- 7 files changed, 66 insertions(+), 8 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs index 7fba7153..e8072e27 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs @@ -27,6 +27,11 @@ public class TrackDeleteEvent /// public string? OperationMan { get; set; } + /// + /// 操作人姓名 + /// + public int OperationManId { get; set; } + /// /// 已经处理过的订单 /// diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index 07fa4f95..225572d9 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -24,6 +24,11 @@ public class TrackUpsertEvent /// public string? OperationMan { get; set; } + /// + /// 操作人id + /// + public int OperationManId { get; set; } + /// /// true新增,false更新 /// diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index 92ca0dee..436e55dd 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -23,13 +23,15 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe private readonly IProvideQueries _provideQueries; private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; private readonly RabbitClientBus _rabbitClientBus; + private readonly IOrderOperationRecordEsRepository _orderOperationRecordEsRepository; public TrackDeleteEventHandler(IProvideQueries provideQueries, IOrderRepository orderRepository, ICapPublisher capPublisher, ITrackDetailsEsRepository trackDetailsEsRepository, RabbitClientBus rabbitClientBus, ITrackStatusRepository trackStatusRepository, - ITrackContentRepository trackContentRepository) + ITrackContentRepository trackContentRepository, + IOrderOperationRecordEsRepository orderOperationRecordEsRepository) { _provideQueries = provideQueries; _orderRepository = orderRepository; @@ -38,6 +40,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe _rabbitClientBus = rabbitClientBus; _trackStatusRepository = trackStatusRepository; _trackContentRepository = trackContentRepository; + _orderOperationRecordEsRepository = orderOperationRecordEsRepository; } [CapSubscribe(GlobalConst.TrackDeleteSubscribe, Group = GlobalConst.TrackDeleteSubscribe)] @@ -168,6 +171,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe { tracks = await _trackDetailsEsRepository.GetDataByIds(@event.EsIds); orderIds = tracks.Select(m => m.OrderId).Distinct().ToList(); + @event.OrderIds = orderIds.ToArray(); // 外部api获取的轨迹不允许删除 if (tracks.Any(m => m.Source == TrackSourceEnum.ExternalServiceProvide.GetHashCode())) @@ -223,6 +227,19 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe order.LatestTrackTime = track.TrackTime; order.LatestTrackTimeZone = track.TrackTimeZone; } + + + // 写入操作日志 + _ = _orderOperationRecordEsRepository.AddAsync(new OrderOperationRecordIndex + { + OrderId = order.Id, + OrderNo = order.OrderNo, + OptionType = OrderOperationType.删除轨迹.ToString(), + Content = tracks?.Where(m=>m.OrderId == order.Id)?.ToList().ToJson(), + CreateUserId = @event.OperationManId, + CreateUserName = @event.OperationMan ?? "", + CreateTime = DateTime.Now + }); } await _orderRepository.UpdateRangeAsync(orders, diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index cfdc1ed4..c5253ac8 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -22,20 +22,22 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe private readonly IProvideQueries _provideQueries; private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; private readonly RabbitClientBus _rabbitClientBus; + private readonly IOrderOperationRecordEsRepository _orderOperationRecordEsRepository; public TrackUpsertEventHandler( IOrderRepository orderRepository, ICapPublisher capPublisher, IProvideQueries provideQueries, ITrackDetailsEsRepository trackDetailsEsRepository, - ITrackStatusRepository trackStatusRepository, - RabbitClientBus rabbitClientBus) + RabbitClientBus rabbitClientBus, + IOrderOperationRecordEsRepository orderOperationRecordEsRepository) { _orderRepository = orderRepository; _capPublisher = capPublisher; _provideQueries = provideQueries; _trackDetailsEsRepository = trackDetailsEsRepository; _rabbitClientBus = rabbitClientBus; + _orderOperationRecordEsRepository = orderOperationRecordEsRepository; } [CapSubscribe(GlobalConst.TrackUpsertSubscribe, Group = GlobalConst.TrackUpsertSubscribe)] @@ -294,6 +296,19 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe //来源与外部服务商不允许修改 if (track.Source == (int) TrackSourceEnum.ExternalServiceProvide) continue; + + + // 写入操作日志 + _ = _orderOperationRecordEsRepository.AddAsync(new OrderOperationRecordIndex + { + OrderId = order.OrderId, + OrderNo = order.OrderNo, + OptionType = OrderOperationType.创建轨迹.ToString(), + Content = track.ToJson(), + CreateUserId = @event.OperationManId, + CreateUserName = @event.OperationMan ?? "", + CreateTime = DateTime.Now + }); } else { @@ -329,6 +344,18 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe } //其余情况:A,D都为新增操作,无需检查数量,track为null执行新增操作 + + // 写入操作日志 + _ = _orderOperationRecordEsRepository.AddAsync(new OrderOperationRecordIndex + { + OrderId = order.OrderId, + OrderNo = order.OrderNo, + OptionType = OrderOperationType.修改轨迹.ToString(), + Content = track.ToJson(), + CreateUserId = @event.OperationManId, + CreateUserName = @event.OperationMan ?? "", + CreateTime = DateTime.Now + }); } if (track == default) diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs index 772cef1e..dea72486 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs @@ -60,7 +60,7 @@ public partial class OrderService : ApplicationService, IOrderService OptionType = OrderOperationType.修改订单.ToString(), Content = input.ToJson(), CreateUserId = currentUser.UserId, - CreateUserString = currentUser.Name, + CreateUserName = currentUser.Name, }; _ = _orderOperationRecordEsRepository.AddAsync(index); @@ -87,7 +87,7 @@ public partial class OrderService : ApplicationService, IOrderService OptionType = OrderOperationType.创建订单.ToString(), Content = input.ToJson(), CreateUserId = currentUser.UserId, - CreateUserString = currentUser.Name, + CreateUserName = currentUser.Name, CreateTime = DateTime.Now }; _ = _orderOperationRecordEsRepository.AddAsync(indexForAdd); diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index a1eea9ae..52b372cc 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -195,11 +195,13 @@ public partial class TrackService : ApplicationService, ITrackService } // 删除轨迹 + var currentUser = CurrentUserRequest.CurrentUser; var @event = new TrackDeleteEvent { EsIds = input.TrackContentEsIds.ToArray(), SubSystemId = tracks.First().SubSystemId, - OperationMan = userInfo.Data.UserName, + OperationMan = currentUser.Name, + OperationManId = currentUser.UserId }; await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, @event); @@ -350,6 +352,7 @@ public partial class TrackService : ApplicationService, ITrackService TrackTime = input.TrackTime, TrackTimeZone = input.TrackTimeZone, OperationMan = userInfo.Data.UserName, + OperationManId= userInfo.Data.UserId, IsVisibility = input.IsVisibility, Source = input.Source, Remarks = input.Remarks, @@ -361,7 +364,8 @@ public partial class TrackService : ApplicationService, ITrackService TrackPlaceNation = input.TrackPlaceNation, TrackPlacePostcode = input.TrackPlacePostcode, EstimatedDeliveryDate = input.EstimatedDeliveryDate, - DestinationTimeZone = input.DestinationTimeZone + DestinationTimeZone = input.DestinationTimeZone, + }; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); } diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderOperationRecordIndex.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderOperationRecordIndex.cs index df044ff6..c53ed8c5 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderOperationRecordIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderOperationRecordIndex.cs @@ -43,7 +43,7 @@ public class OrderOperationRecordIndex : IdBaseIndex /// /// 创建人姓名 /// - public string CreateUserString { get; set; } + public string CreateUserName { get; set; } /// /// 创建时间 From 6abe9608713321ad78b102370e0f1118e3b0a417 Mon Sep 17 00:00:00 2001 From: eli Date: Tue, 19 Nov 2024 11:36:29 +0800 Subject: [PATCH 32/75] =?UTF-8?q?=E8=87=AA=E6=B5=8Bbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackUpsertEventHandler.cs | 49 +++++++++---------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index ee9ca7d7..c807dab6 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -299,19 +299,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe //来源与外部服务商不允许修改 if (track.Source == (int) TrackSourceEnum.ExternalServiceProvide) continue; - - - // 写入操作日志 - _ = _orderOperationRecordEsRepository.AddAsync(new OrderOperationRecordIndex - { - OrderId = order.OrderId, - OrderNo = order.OrderNo, - OptionType = OrderOperationType.创建轨迹.ToString(), - Content = track.ToJson(), - CreateUserId = @event.OperationManId, - CreateUserName = @event.OperationMan ?? "", - CreateTime = DateTime.Now - }); } else { @@ -347,18 +334,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe } //其余情况:A,D都为新增操作,无需检查数量,track为null执行新增操作 - - // 写入操作日志 - _ = _orderOperationRecordEsRepository.AddAsync(new OrderOperationRecordIndex - { - OrderId = order.OrderId, - OrderNo = order.OrderNo, - OptionType = OrderOperationType.修改轨迹.ToString(), - Content = track.ToJson(), - CreateUserId = @event.OperationManId, - CreateUserName = @event.OperationMan ?? "", - CreateTime = DateTime.Now - }); } if (track == default) @@ -407,6 +382,18 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe ? track.TrackTime : track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); insertTracks.Add(track); + + // 写入操作日志 + _ = _orderOperationRecordEsRepository.AddAsync(new OrderOperationRecordIndex + { + OrderId = order.OrderId, + OrderNo = order.OrderNo, + OptionType = OrderOperationType.创建轨迹.ToString(), + Content = track.ToJson(), + CreateUserId = @event.OperationManId, + CreateUserName = @event.OperationMan ?? "", + CreateTime = DateTime.Now + }); } else { @@ -441,6 +428,18 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe track.EstimatedDeliveryDate = @event.EstimatedDeliveryDate; updateTracks.Add(track); + + // 写入操作日志 + _ = _orderOperationRecordEsRepository.AddAsync(new OrderOperationRecordIndex + { + OrderId = order.OrderId, + OrderNo = order.OrderNo, + OptionType = OrderOperationType.修改轨迹.ToString(), + Content = track.ToJson(), + CreateUserId = @event.OperationManId, + CreateUserName = @event.OperationMan ?? "", + CreateTime = DateTime.Now + }); } canNextOrderIds.Add(order.OrderId); From 87a17ab97ff5541ef0d57cb11d46f568c4a3be22 Mon Sep 17 00:00:00 2001 From: eli Date: Tue, 19 Nov 2024 14:07:06 +0800 Subject: [PATCH 33/75] =?UTF-8?q?=E8=87=AA=E6=B5=8Bbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TrackOrders/TrackOrderService.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index ae449cf8..a5999520 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -203,14 +203,15 @@ public class TrackOrderService : ApplicationService { var currentTrackStatus = trackStatus.FirstOrDefault(m => m.Code == item.TrackStatusCode); - //是否完结 - if (!isCompleted) - isCompleted = currentTrackStatus is { IsCompleted: true }; //如果是外部系统,且轨迹内容不对外则跳过这条轨迹内容 if (system.SystemProperty == 2 && !item.IsVisibility) continue; + //是否完结 + if (!isCompleted) + isCompleted = currentTrackStatus is { IsCompleted: true }; + res.Data.Add(new GetDetailTimelineOutput() { IsHighlight = true, From 9c24b15c41030d0e48064cd0ee5358e6cdb31907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Tue, 19 Nov 2024 14:47:28 +0800 Subject: [PATCH 34/75] =?UTF-8?q?update:=20=E5=8D=95=E4=B8=AA/=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E4=BF=AE=E6=94=B9=E8=BD=A8=E8=BF=B9=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E4=B8=8D=E5=85=81=E8=AE=B8=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=A4=96=E9=83=A8=E6=8F=90=E4=BE=9B=E5=95=86=E6=9D=A5=E6=BA=90?= =?UTF-8?q?=E7=9A=84=E8=BD=A8=E8=BF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ProvideServices/TrackService.cs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 279396cf..5c20cc21 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -66,6 +66,12 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: "【目的地时区】和【预计到达时间】必须同时输入"); } + //当修改时,如果为来源为外部提供商则不允许修改 + if (!input.IsAdd && input.Source == (int) TrackSourceEnum.ExternalServiceProvide) + { + throw new BusinessException(message: "来源为外部服务商轨迹不允许修改"); + } + var trackContent = await _trackContentRepository.GetByCodeAsync(input.SubSystemId, input.TrackCode); if (trackContent == default) { @@ -281,6 +287,12 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: "订单一个都不存在"); } + //当修改时,如果为来源为外部提供商则不允许修改 + if (!input.IsAdd && input.Source == (int) TrackSourceEnum.ExternalServiceProvide) + { + throw new BusinessException(message: "来源为外部服务商轨迹不允许修改"); + } + // 校验主体:批量新增只选取第一条订单进行校验 //【新增】存在指定轨迹的内容,进行更新覆盖(只处理一条的情况,并且决定权交给用户),不存在直接插入即可 //【更新】存在指定轨迹的内容(匹配到多条则不处理) @@ -352,7 +364,7 @@ public partial class TrackService : ApplicationService, ITrackService TrackTime = input.TrackTime, TrackTimeZone = input.TrackTimeZone, OperationMan = userInfo.Data.UserName, - OperationManId= userInfo.Data.UserId, + OperationManId = userInfo.Data.UserId, IsVisibility = input.IsVisibility, Source = input.Source, Remarks = input.Remarks, @@ -368,7 +380,6 @@ public partial class TrackService : ApplicationService, ITrackService TrackPlacePostcode = input.TrackPlacePostcode, EstimatedDeliveryDate = input.EstimatedDeliveryDate, DestinationTimeZone = input.DestinationTimeZone, - }; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); } From a8862a91046f543202ad790703e5b720af3eee56 Mon Sep 17 00:00:00 2001 From: eli Date: Tue, 19 Nov 2024 15:27:39 +0800 Subject: [PATCH 35/75] =?UTF-8?q?=E8=87=AA=E6=B5=8Bbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TrackOrders/TrackOrderService.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index a5999520..af769700 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -192,9 +192,15 @@ public class TrackOrderService : ApplicationService var system = await _orderRepository.GetSystemInfoById(input.CurrenUserSystemId); if (system == null) - return new UnifyResultDto>(false, "未找到制定id的子系统"); + return new UnifyResultDto>(false, "未找到指定id的子系统"); var trackStatus = await _trackStatusRepository.GetListAsync(m => m.SubSystemId == input.SystemId); + if (trackStatus == null) + return new UnifyResultDto>(false, "未找到子系统下的任何轨迹状态"); + + var trackContent = await _trackContentRepository.GetListAsync(m => m.SubSystemId == input.SystemId); + if (trackContent == null) + return new UnifyResultDto>(false, "未找到子系统下的任何轨迹内容"); var trackDetails = await _trackDetailsEsRepository.GetListAsync(order.Id); res.Data = new List(); @@ -202,16 +208,16 @@ public class TrackOrderService : ApplicationService foreach (var item in trackDetails) { var currentTrackStatus = trackStatus.FirstOrDefault(m => m.Code == item.TrackStatusCode); - - - //如果是外部系统,且轨迹内容不对外则跳过这条轨迹内容 - if (system.SystemProperty == 2 && !item.IsVisibility) - continue; + var currentTrackContet = trackContent.FirstOrDefault(m => m.Code == item.TrackCode); //是否完结 if (!isCompleted) isCompleted = currentTrackStatus is { IsCompleted: true }; + //如果是外部系统,且轨迹内容不对外则跳过这条轨迹内容 + if (system.SystemProperty == 2 && currentTrackContet != null && !currentTrackContet.IsExternal) + continue; + res.Data.Add(new GetDetailTimelineOutput() { IsHighlight = true, From 624409857605c0f69ecf6330c1ea7b1cf69ead5e Mon Sep 17 00:00:00 2001 From: eli Date: Tue, 19 Nov 2024 16:53:15 +0800 Subject: [PATCH 36/75] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E6=94=B9=E6=97=B6?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=8F=AF=E7=94=A8=E8=BD=A8=E8=BF=B9=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E6=97=B6=E5=8F=AA=E5=8F=96=E7=AC=AC=E4=B8=80=E6=9D=A1?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=B7=B2=E5=AD=98=E5=9C=A8=E7=9A=84=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TrackContents/TrackContentService.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index 9e2ef87f..54f83b09 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -255,7 +255,12 @@ public class TrackContentService : ApplicationService foreach (var item in contentList) { - if (input.TrackOptionType == TrackOptionType.创建 && !item.IsRepeatable && trackDetails?.Any(m => m.TrackCode == item.Code) == true) //新增时跳过已存在轨迹内容 + //新增时跳过已存在轨迹内容 + if (input.TrackOptionType == TrackOptionType.创建 && !item.IsRepeatable && trackDetails?.Any(m => m.TrackCode == item.Code) == true) + continue; + + // 修改时跳过不存在轨迹内容 + if (input.TrackOptionType == TrackOptionType.修改 && !trackDetails?.Any(m => m.TrackCode == item.Code) == true) continue; if (!item.IsAllowManuallyCreate && input.TrackOptionType == TrackOptionType.创建) //跳过不允许手动创建的轨迹内容 From 9191d1042cc98f2d168073ada978a72df47509f6 Mon Sep 17 00:00:00 2001 From: eli Date: Tue, 19 Nov 2024 16:57:58 +0800 Subject: [PATCH 37/75] =?UTF-8?q?fix:=E8=A7=A3=E5=86=B3=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E4=B8=AD=E5=91=98=E5=B7=A5=E5=A7=93=E5=90=8D=E4=B8=BA=E7=A9=BA?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ProvideServices/TrackService.cs | 6 +++++- .../Aggregates/OrderAggregate/IOrderRepository.cs | 7 +++++++ src/SJZY.Track.Repository/Repositories/OrderRepository.cs | 5 +++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 5c20cc21..c9844221 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -202,11 +202,15 @@ public partial class TrackService : ApplicationService, ITrackService // 删除轨迹 var currentUser = CurrentUserRequest.CurrentUser; + var userName = userInfo.Data.UserName; + if (string.IsNullOrEmpty(userName)) + userName = (await _orderRepository.GetUserById(currentUser.UserId))?.Name; + var @event = new TrackDeleteEvent { EsIds = input.TrackContentEsIds.ToArray(), SubSystemId = tracks.First().SubSystemId, - OperationMan = currentUser.Name, + OperationMan = userName, OperationManId = currentUser.UserId }; await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, @event); diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs index ad8d9607..ae172fc0 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs @@ -139,4 +139,11 @@ public interface IOrderRepository : IBasicRepository /// /// Task GetSystemInfoById(int id); + + /// + /// 根据id获取员工姓名 + /// + /// + /// + Task GetUserById(int id); } diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index 5d427cab..727f17d6 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -184,6 +184,11 @@ public class OrderRepository : BasicRepository, IOrderRepository, I return Context.Queryable().FirstAsync(m => m.IsDeleted == false && m.Id == id); } + public Task GetUserById(int id) + { + return Context.Queryable().FirstAsync(m => m.IsDeleted == false && m.Id == id); + } + private int UpdateOrderQuestionType(int questionType, IEnumerable ids) { var idsString = string.Join(",", ids); From 9a785d55db1a9458eaa7a1404829ae284113b799 Mon Sep 17 00:00:00 2001 From: eli Date: Tue, 19 Nov 2024 17:08:33 +0800 Subject: [PATCH 38/75] =?UTF-8?q?=E8=87=AA=E6=B5=8Bbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TrackContents/TrackContentService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index 54f83b09..8cb91e48 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -260,7 +260,7 @@ public class TrackContentService : ApplicationService continue; // 修改时跳过不存在轨迹内容 - if (input.TrackOptionType == TrackOptionType.修改 && !trackDetails?.Any(m => m.TrackCode == item.Code) == true) + if (input.TrackOptionType == TrackOptionType.修改 && trackDetails != null && trackDetails.All(m => m.TrackCode != item.Code)) continue; if (!item.IsAllowManuallyCreate && input.TrackOptionType == TrackOptionType.创建) //跳过不允许手动创建的轨迹内容 From 96457adabe36201415fca30c93fe34d1c188d61c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Wed, 20 Nov 2024 10:01:59 +0800 Subject: [PATCH 39/75] =?UTF-8?q?update:=20=E8=B0=83=E6=95=B4=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E8=AE=A2=E5=8D=95=E5=88=97=E8=A1=A8=E5=8F=8D=E5=8F=82?= =?UTF-8?q?=E4=B8=AD=E7=AC=AC=E4=B8=89=E6=96=B9=E5=8D=95=E5=8F=B7=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=EF=BC=8C=E8=BF=87=E6=BB=A4=E4=B8=89=E6=96=B9=E5=8D=95?= =?UTF-8?q?=E5=8F=B7=E4=B8=BA=E7=A9=BA=E7=9A=84=E6=9D=A1=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SJZY.Track.Repository/Repositories/OrderRepository.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index 727f17d6..0e046330 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -202,7 +202,7 @@ public class OrderRepository : BasicRepository, IOrderRepository, I /// /// 拼接多个三方单号,默认使用分隔符默认(、) - /// 第三方单号,服务商-轨迹0000000、轨迹服务商-0000000 + /// 第三方单号展示: 0000000(服务商)、0000000(服务商) /// /// /// @@ -210,7 +210,8 @@ public class OrderRepository : BasicRepository, IOrderRepository, I { const string separator = "、"; var thirdPartyOrderNumbers = orderPlatformNumberEntities - .Select(x => $"{x.Platform}-{x.OrderNumber}").ToList(); + .Where(x => !string.IsNullOrWhiteSpace(x.OrderNumber)) + .Select(x => $"{x.OrderNumber}({x.Platform})").ToList(); return string.Join(separator, thirdPartyOrderNumbers); } From 24859d393b34e0d021585f856313be9c7318018f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Wed, 20 Nov 2024 11:22:16 +0800 Subject: [PATCH 40/75] =?UTF-8?q?upgrade-package:=20=E5=8D=87=E7=BA=A7Rabb?= =?UTF-8?q?itMq=E4=BE=9D=E8=B5=96=E5=8C=852.0.9=3D>2.1.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update:调整AddRabbitBoot中的初始化相关配置 --- .../Rabbit/TrackPushCompletedEventHandler.cs | 7 +++++-- .../Rabbit/TrackRefreshEventHandler.cs | 8 +++++--- .../SJZY.Track.Application.csproj | 2 +- .../SjzyTrackApplicationModule.cs | 15 ++++----------- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs index 348d7a4b..e55485a9 100644 --- a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs +++ b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs @@ -26,9 +26,12 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl _trackPushRecordEsRepository = trackPushRecordEsRepository; } - public bool Enable(ConsumeOptions options) + public ConsumeOptions Options() { - return options.Queue == GlobalConst.TrackPushCompletedSubscribe; + return new ConsumeOptions() + { + Queue = GlobalConst.TrackPushCompletedSubscribe + }; } public async Task Handle(IServiceProvider sp, BasicDeliverEventArgs args, ConsumeOptions options) diff --git a/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs index ff8c6d1d..88cc1ad0 100644 --- a/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs +++ b/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs @@ -39,10 +39,12 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler _logger = logger; } - - public bool Enable(ConsumeOptions options) + public ConsumeOptions Options() { - return options.Queue == GlobalConst.TrackRefreshSubscribe; + return new ConsumeOptions() + { + Queue = GlobalConst.TrackRefreshSubscribe, + }; } public async Task Handle(IServiceProvider sp, BasicDeliverEventArgs args, ConsumeOptions options) diff --git a/src/SJZY.Track.Application/SJZY.Track.Application.csproj b/src/SJZY.Track.Application/SJZY.Track.Application.csproj index 0bcf26d3..0beb6ea8 100644 --- a/src/SJZY.Track.Application/SJZY.Track.Application.csproj +++ b/src/SJZY.Track.Application/SJZY.Track.Application.csproj @@ -8,7 +8,7 @@ - + diff --git a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs index e36b86ce..9318e6ca 100644 --- a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs +++ b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs @@ -140,6 +140,10 @@ public class SjzyTrackApplicationModule : AbpModule options.ConnectionString = $"amqp://{configuration["RabbitMQ:UserName"]}:{configuration["RabbitMQ:Password"]}@{configuration["RabbitMQ:HostName"]}:{configuration["RabbitMQ:Port"]}"; options.PoolSize = configuration.GetValue("RabbitMQ:PoolSize"); + options.Declarations = new List>() + { + o=>o.ExchangeDeclare(GlobalConst.TrackChangeExchange, ExchangeType.Topic, true), + }; options.Consumes = new List { new() @@ -154,17 +158,6 @@ public class SjzyTrackApplicationModule : AbpModule o.QueueBind(GlobalConst.TrackRefreshSubscribe, GlobalConst.InterfaceRelayExchange, GlobalConst.TrackRefreshSubscribe); } - }, - new() - { - //广播轨迹 - Queue = GlobalConst.TrackRefreshSubscribe, - FetchCount = configuration.GetValue("TrackApp:TrackRefreshFetchCount"), - FailedRequeue = false, - Declaration = o => - { - o.ExchangeDeclare(GlobalConst.TrackChangeExchange, ExchangeType.Topic, true); - } } }; }, typeof(SjzyTrackApplicationModule).Assembly); From a82258e1cc5221c859667010ae6c0e40a3544f9b Mon Sep 17 00:00:00 2001 From: eli Date: Wed, 20 Nov 2024 17:26:00 +0800 Subject: [PATCH 41/75] =?UTF-8?q?fix:=E8=BD=A8=E8=BF=B9=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E8=BD=B4=E6=8E=92=E5=BA=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TrackOrders/TrackOrderService.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index af769700..c57d1abd 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -256,6 +256,7 @@ public class TrackOrderService : ApplicationService }); } + res.Data = res.Data?.OrderBy(m => m.TrackTime).ToList(); return res; } From a1986273c6706df764998b382cacaafe9f54ce02 Mon Sep 17 00:00:00 2001 From: eli Date: Wed, 20 Nov 2024 17:56:32 +0800 Subject: [PATCH 42/75] =?UTF-8?q?fix:=E6=97=B6=E9=97=B4=E8=BD=B4=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E5=AE=8C=E7=BB=93=E4=BB=8E=E8=AE=A2=E5=8D=95=E4=B8=8A?= =?UTF-8?q?=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TrackOrders/TrackOrderService.cs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index c57d1abd..adaf0a18 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -194,25 +194,17 @@ public class TrackOrderService : ApplicationService if (system == null) return new UnifyResultDto>(false, "未找到指定id的子系统"); - var trackStatus = await _trackStatusRepository.GetListAsync(m => m.SubSystemId == input.SystemId); - if (trackStatus == null) - return new UnifyResultDto>(false, "未找到子系统下的任何轨迹状态"); - var trackContent = await _trackContentRepository.GetListAsync(m => m.SubSystemId == input.SystemId); if (trackContent == null) return new UnifyResultDto>(false, "未找到子系统下的任何轨迹内容"); var trackDetails = await _trackDetailsEsRepository.GetListAsync(order.Id); res.Data = new List(); - var isCompleted = false; + foreach (var item in trackDetails) { - var currentTrackStatus = trackStatus.FirstOrDefault(m => m.Code == item.TrackStatusCode); var currentTrackContet = trackContent.FirstOrDefault(m => m.Code == item.TrackCode); - //是否完结 - if (!isCompleted) - isCompleted = currentTrackStatus is { IsCompleted: true }; //如果是外部系统,且轨迹内容不对外则跳过这条轨迹内容 if (system.SystemProperty == 2 && currentTrackContet != null && !currentTrackContet.IsExternal) @@ -244,7 +236,7 @@ public class TrackOrderService : ApplicationService } //如果轨迹状态没完结则追加最后一个默认节点 - if (!isCompleted) + if (!order.IsCompleted) { res.Data.Add(new GetDetailTimelineOutput() { From 5166ec42b4a3e490d35ad8d56af6ece20d4d2b68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Thu, 21 Nov 2024 10:22:19 +0800 Subject: [PATCH 43/75] =?UTF-8?q?update:=20=E5=A2=9E=E5=8A=A0=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=9D=A5=E6=BA=90=E7=9A=84=E7=BA=A6=E6=9D=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update:增加【轨迹发生时间】筛选项用于放宽修改轨迹明细限制 --- .../EventHandlers/TrackUpsertEventHandler.cs | 5 +++-- .../Services/ProvideServices/TrackService.cs | 22 +++++++++++++++---- .../Consts/GlobalConst.Track.cs | 11 ++++++++++ 3 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 src/SJZY.Track.Domain/Consts/GlobalConst.Track.cs diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index c807dab6..c53fb367 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -285,8 +285,9 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackDetailsIndex? track; if (!@event.IsAdd) { - //同一订单同轨迹code如果有多条轨迹明细则不允许修改 - var existTracks = tracks.Where(x => x.OrderId == order.OrderId).ToArray(); + //同一订单同轨迹code同一轨迹时间如果有多条轨迹明细则不允许修改 + var existTracks = tracks.Where(x => x.OrderId == order.OrderId + && x.TrackTime == @event.TrackTime).ToArray(); if (existTracks.Length > 1) { // 修改轨迹时,订单存在多条轨迹不允许修改 diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index c9844221..cec5feae 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -55,6 +55,11 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: $"订单:{input.OrderNo}不存在"); } + if (!GlobalConst.SupportTrackSources.Contains(input.Source)) + { + throw new BusinessException(message: "轨迹来源是必须的"); + } + if (input.TrackTime < DateTime.Now.AddYears(-100) || input.TrackTime > DateTime.Now.AddYears(100)) { throw new BusinessException(message: "轨迹时间不合法"); @@ -93,9 +98,11 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许手动更新"); } - var tracks = await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true); + var tracks = (await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true)) + .Where(x => x.TrackTime == input.TrackTime) + .ToList(); - //更新轨迹,但存在多条轨迹记录,理由:不清晰到底要修改哪一条或是全部修改 + //更新轨迹,同一时间存在多条轨迹记录,理由:不清晰到底要修改哪一条或是全部修改 if (!input.IsAdd && tracks.Count > 1) { throw new BusinessException(message: $"订单:{input.OrderNo},轨迹代码:{input.TrackCode}存在多条记录,不允许修改"); @@ -291,6 +298,11 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: "订单一个都不存在"); } + if (!GlobalConst.SupportTrackSources.Contains(input.Source)) + { + throw new BusinessException(message: "轨迹来源是必须的"); + } + //当修改时,如果为来源为外部提供商则不允许修改 if (!input.IsAdd && input.Source == (int) TrackSourceEnum.ExternalServiceProvide) { @@ -334,9 +346,11 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许手动更新"); } - var tracks = await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true); + var tracks = (await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true)) + .Where(x => x.TrackTime == input.TrackTime) + .ToList(); - //更新轨迹,存在多条轨迹记录不允许更改,理由:不清晰到底要修改哪一条或是全部修改 + //更新轨迹,同一时间存在多条轨迹记录,理由:不清晰到底要修改哪一条或是全部修改 if (!input.IsAdd && tracks.Count > 1) { throw new BusinessException(message: $"订单:{order.OrderNo},轨迹代码:{input.TrackCode}存在多条记录,不允许修改"); diff --git a/src/SJZY.Track.Domain/Consts/GlobalConst.Track.cs b/src/SJZY.Track.Domain/Consts/GlobalConst.Track.cs new file mode 100644 index 00000000..eed1301d --- /dev/null +++ b/src/SJZY.Track.Domain/Consts/GlobalConst.Track.cs @@ -0,0 +1,11 @@ +using System.Collections.Immutable; + +namespace SJZY.Track.Domain.Consts; + +public partial class GlobalConst +{ + /// + /// 轨迹数据来源:1外部服务商创建,2内部系统创建,3人工创建 + /// + public static readonly ImmutableHashSet SupportTrackSources = ImmutableHashSet.Create(1, 2, 3); +} From 9511dac81d86a946248cb27bd4e58ffb07078410 Mon Sep 17 00:00:00 2001 From: eli Date: Thu, 21 Nov 2024 11:21:18 +0800 Subject: [PATCH 44/75] =?UTF-8?q?fix:=E6=97=B6=E9=97=B4=E8=BD=B4=E9=A1=BA?= =?UTF-8?q?=E5=BA=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TrackOrders/TrackOrderService.cs | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index adaf0a18..1a6e1f0f 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -235,20 +235,27 @@ public class TrackOrderService : ApplicationService }); } - //如果轨迹状态没完结则追加最后一个默认节点 - if (!order.IsCompleted) + // 按轨迹发生时间正序排序 + res.Data = res.Data?.OrderBy(m => m.TrackTime).ToList(); + + if (!order.IsCompleted) //如果没完结则显示签收节点 { - res.Data.Add(new GetDetailTimelineOutput() + var eddUnixTimestamp = order.EstimatedDeliveryDate.HasValue ? ToUnixTimestamp(DateTime.Parse(order.EstimatedDeliveryDate.ToString()!)) : 0; + + //订单上有预计签收时间,需要对比预计到达时间是否大于时间轴上所有轨迹内容的发生时间,如果有任意一条时间大于预计签收时间,则隐藏签收节点 + if (eddUnixTimestamp > 0 && res.Data != null && res.Data.All(m => m.TrackTime < eddUnixTimestamp)) { - Content = "签收", - IsHighlight = false, - TrackTimeZone = order.EstimatedDeliveryDate.HasValue ? $"GMT{(order.DestinationTimeZone >= 0 ? "+" : "-")}{order.DestinationTimeZone}" : "", - TrackTime = order.EstimatedDeliveryDate.HasValue ? ToUnixTimestamp(DateTime.Parse(order.EstimatedDeliveryDate.ToString()!)) : 0, - TrackTimePrefix = order.EstimatedDeliveryDate.HasValue ? "预计签收时间:" : "", - }); + res.Data.Add(new GetDetailTimelineOutput() + { + Content = "签收", + IsHighlight = false, + TrackTimeZone = order.EstimatedDeliveryDate.HasValue ? $"GMT{(order.DestinationTimeZone >= 0 ? "+" : "-")}{order.DestinationTimeZone}" : "", + TrackTime = eddUnixTimestamp, + TrackTimePrefix = order.EstimatedDeliveryDate.HasValue ? "预计签收时间:" : "", + }); + } } - res.Data = res.Data?.OrderBy(m => m.TrackTime).ToList(); return res; } From f046f251821bc5f09e4670e075152d2a6bee30a6 Mon Sep 17 00:00:00 2001 From: eli Date: Thu, 21 Nov 2024 11:41:09 +0800 Subject: [PATCH 45/75] =?UTF-8?q?fix:=E8=A1=A5=E5=85=85=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E8=8B=A5=E9=A2=84=E8=AE=A1=E5=88=B0=E8=BE=BE=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E4=B8=BA=E7=A9=BA=E6=97=B6=E4=B9=9F=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=AD=BE=E6=94=B6=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TrackOrders/TrackOrderService.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index 1a6e1f0f..42e67fe3 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -175,7 +175,7 @@ public class TrackOrderService : ApplicationService /// /// /// - [HttpPost("GetDetailTimeline")] + [HttpPost("GetDetailTimeline")] public async Task>> GetDetailTimeline(GetDetailTimelineInput input) { var res = new UnifyResultDto>(true); @@ -242,8 +242,8 @@ public class TrackOrderService : ApplicationService { var eddUnixTimestamp = order.EstimatedDeliveryDate.HasValue ? ToUnixTimestamp(DateTime.Parse(order.EstimatedDeliveryDate.ToString()!)) : 0; - //订单上有预计签收时间,需要对比预计到达时间是否大于时间轴上所有轨迹内容的发生时间,如果有任意一条时间大于预计签收时间,则隐藏签收节点 - if (eddUnixTimestamp > 0 && res.Data != null && res.Data.All(m => m.TrackTime < eddUnixTimestamp)) + //订单没有预计签收时间,或者订单上有预计签收事件,且预计到达时间大于时间轴上所有轨迹内容的发生时间,则显示签收节点 + if (eddUnixTimestamp == 0 || (eddUnixTimestamp > 0 && res.Data != null && res.Data.All(m => m.TrackTime < eddUnixTimestamp))) { res.Data.Add(new GetDetailTimelineOutput() { From 283375a3ab07a63966ae7bc65e69ad87ab452147 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Thu, 21 Nov 2024 12:00:54 +0800 Subject: [PATCH 46/75] =?UTF-8?q?update:=20=E8=B0=83=E6=95=B4=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E9=80=9A=E5=9B=9E=E4=BC=A0=E8=BD=A8=E8=BF=B9=E5=85=A5?= =?UTF-8?q?=E5=BA=93=E9=80=BB=E8=BE=91=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=8F=AF?= =?UTF-8?q?=E7=94=A8=E5=A4=96=E9=83=A8=E5=8D=95=E5=8F=B7=E5=8C=B9=E9=85=8D?= =?UTF-8?q?=E4=B8=BB=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Rabbit/TrackRefreshEventHandler.cs | 26 ++++++++--------- .../OrderAggregate/IOrderRepository.cs | 8 ++++++ .../Repositories/OrderRepository.cs | 28 +++++++++++++++++++ 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs index 88cc1ad0..8afa7705 100644 --- a/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs +++ b/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs @@ -41,10 +41,10 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler public ConsumeOptions Options() { - return new ConsumeOptions() - { - Queue = GlobalConst.TrackRefreshSubscribe, - }; + return new ConsumeOptions() + { + Queue = GlobalConst.TrackRefreshSubscribe, + }; } public async Task Handle(IServiceProvider sp, BasicDeliverEventArgs args, ConsumeOptions options) @@ -110,18 +110,18 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler var trackToken = orderToken.SelectToken(paramConfig.TrackDetailsPath); if (trackToken is null) return; - var order = await _orderRepository.GetFirstAsync(x => - x.SubSystemId == attach.SubSystemId && x.OrderType == attach.OrderType && x.OrderNo == orderNo, - x => new - { - x.Id, - x.CustomId - }); - if (order == default) return; + //回传单号可能是主单也可能是外部单号 + //通过平台code和(外部单号/主单号)查询主单 + var order = await _orderRepository.GetTrackOrderByProviderAndOrderNo(attach.ServiceProviderCode, orderNo!); + if (order == default) + { + _logger.LogError($"请求id: {attach.ToJson()},轨迹消费失败,找不到主单,平台code:{attach.ServiceProviderCode},单号:{orderNo}"); + return; + } var context = new TrackRefreshContext { - OrderId = order.Id, + OrderId = order.MainOrderId, OrderType = attach.OrderType, OrderNo = orderNo!, ServiceProviderCode = attach.ServiceProviderCode, diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs index ae172fc0..96be07a4 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs @@ -12,6 +12,14 @@ public interface IOrderRepository : IBasicRepository /// Task> GetTrackOrderPagedList(GetPageTrackOrderInputVO input); + /// + /// 通过三方平台和三方单号查询订单 + /// + /// 三方平台 + /// 三方平台单号 + /// (主单号id,客户id) + Task<(int MainOrderId, int CustomId)> GetTrackOrderByProviderAndOrderNo(string serviceProvidrCode, string orderNo); + /// /// 创建订单 /// diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index 0e046330..53f6c327 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -58,6 +58,34 @@ public class OrderRepository : BasicRepository, IOrderRepository, I return pageList; } + public async Task<(int MainOrderId, int CustomId)> GetTrackOrderByProviderAndOrderNo(string serviceProvidrCode, string orderNo) + { + var orderList = await Context.Queryable() + .LeftJoin((a, b) => a.Id == b.OrderId && b.IsDeleted) + .Where((a, b) => a.OrderNo == orderNo + || (b.Platform == serviceProvidrCode && b.OrderNumber == orderNo)) + .Select((a, b) => new + { + a.Id, + a.CustomId, + b.Platform, + b.OrderNumber + }) + .ToListAsync(); + + if (orderList.Count == 0) + { + return default; + } + + var order = orderList.First(); + //当出现了多条记录匹配,优先使用外部单匹配提升精确度 + var matchOrder = orderList.FirstOrDefault(x => x.Platform == serviceProvidrCode && x.OrderNumber == orderNo); + return matchOrder != null + ? (matchOrder.Id, matchOrder.CustomId) + : (order.Id, order.CustomId); + } + public async Task CreateOrderAsync(OrderEntity order) { using var tran = TransactionHelper.GetReadCommitted(); From c5903e525a3c35c9aa759ec21be690e455b33d0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Thu, 21 Nov 2024 14:48:37 +0800 Subject: [PATCH 47/75] =?UTF-8?q?update:=E8=B0=83=E6=95=B4=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E8=BD=A8=E8=BF=B9=E4=B8=AD=E8=BD=A8=E8=BF=B9=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E4=BB=A5=E8=BE=93=E5=85=A5=E7=9A=84=E4=B8=BA=E5=87=86?= =?UTF-8?q?=EF=BC=8C=E8=8B=A5=E4=B8=BA=E7=A9=BA=E5=88=99=E5=8F=96=E5=AF=B9?= =?UTF-8?q?=E5=BA=94code=E7=9A=84=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CAP/EventHandlers/TrackUpsertEventHandler.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index c53fb367..30feeffa 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -357,8 +357,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe //来源轨迹内容,第一次新增的时候使用轨迹内容表提供的 TrackStatus = trackContent.TrackStatus, TrackStatusCode = trackContent.TrackStatusCode, - TrackContent = trackContent.TrackContent, - TrackEnContent = trackContent.TrackEnContent, + TrackContent = @event.Content?? trackContent.TrackContent, + TrackEnContent = @event.EnStatus?? trackContent.TrackEnContent, //S06新增轨迹明细字段 IsVisibility = @event.IsVisibility, Source = @event.Source, From b0e8b8ec56977edb78d133e6efd1730904caea16 Mon Sep 17 00:00:00 2001 From: eli Date: Thu, 21 Nov 2024 15:56:36 +0800 Subject: [PATCH 48/75] =?UTF-8?q?fix:=E5=B1=95=E7=A4=BA=E8=8A=82=E7=82=B9?= =?UTF-8?q?=EF=BC=8C=E4=BD=86=E6=98=AF=E4=B8=8D=E5=B1=95=E7=A4=BA=E6=97=B6?= =?UTF-8?q?=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TrackOrders/TrackOrderService.cs | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index 42e67fe3..c846c6c3 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -242,20 +242,15 @@ public class TrackOrderService : ApplicationService { var eddUnixTimestamp = order.EstimatedDeliveryDate.HasValue ? ToUnixTimestamp(DateTime.Parse(order.EstimatedDeliveryDate.ToString()!)) : 0; - //订单没有预计签收时间,或者订单上有预计签收事件,且预计到达时间大于时间轴上所有轨迹内容的发生时间,则显示签收节点 - if (eddUnixTimestamp == 0 || (eddUnixTimestamp > 0 && res.Data != null && res.Data.All(m => m.TrackTime < eddUnixTimestamp))) + res.Data.Add(new GetDetailTimelineOutput() { - res.Data.Add(new GetDetailTimelineOutput() - { - Content = "签收", - IsHighlight = false, - TrackTimeZone = order.EstimatedDeliveryDate.HasValue ? $"GMT{(order.DestinationTimeZone >= 0 ? "+" : "-")}{order.DestinationTimeZone}" : "", - TrackTime = eddUnixTimestamp, - TrackTimePrefix = order.EstimatedDeliveryDate.HasValue ? "预计签收时间:" : "", - }); - } + Content = "签收", + IsHighlight = false, + TrackTimeZone = order.EstimatedDeliveryDate.HasValue ? $"GMT{(order.DestinationTimeZone >= 0 ? "+" : "-")}{order.DestinationTimeZone}" : "", + TrackTime = eddUnixTimestamp > 0 && res.Data != null && res.Data.All(m => m.TrackTime > eddUnixTimestamp) ? eddUnixTimestamp : 0, + TrackTimePrefix = order.EstimatedDeliveryDate.HasValue ? "预计签收时间:" : "", + }); } - return res; } From d4c5c84779d0f5cfd7e9ac742689807781c6a4de Mon Sep 17 00:00:00 2001 From: eli Date: Thu, 21 Nov 2024 16:28:54 +0800 Subject: [PATCH 49/75] =?UTF-8?q?fix:=E6=97=B6=E9=97=B4=E8=BD=B4=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=97=B6=E9=97=B4=E9=80=BB=E8=BE=91=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TrackOrders/TrackOrderService.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index c846c6c3..f57dc80c 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -175,7 +175,7 @@ public class TrackOrderService : ApplicationService /// /// /// - [HttpPost("GetDetailTimeline")] + [HttpPost("GetDetailTimeline")] public async Task>> GetDetailTimeline(GetDetailTimelineInput input) { var res = new UnifyResultDto>(true); @@ -242,15 +242,17 @@ public class TrackOrderService : ApplicationService { var eddUnixTimestamp = order.EstimatedDeliveryDate.HasValue ? ToUnixTimestamp(DateTime.Parse(order.EstimatedDeliveryDate.ToString()!)) : 0; + var isShowTime = eddUnixTimestamp > 0 && res.Data != null && res.Data.All(m => m.TrackTime < eddUnixTimestamp); res.Data.Add(new GetDetailTimelineOutput() { Content = "签收", IsHighlight = false, - TrackTimeZone = order.EstimatedDeliveryDate.HasValue ? $"GMT{(order.DestinationTimeZone >= 0 ? "+" : "-")}{order.DestinationTimeZone}" : "", - TrackTime = eddUnixTimestamp > 0 && res.Data != null && res.Data.All(m => m.TrackTime > eddUnixTimestamp) ? eddUnixTimestamp : 0, - TrackTimePrefix = order.EstimatedDeliveryDate.HasValue ? "预计签收时间:" : "", + TrackTimeZone = isShowTime ? $"GMT{(order.DestinationTimeZone >= 0 ? "+" : "-")}{order.DestinationTimeZone}" : "", + TrackTime = isShowTime ? eddUnixTimestamp : 0, + TrackTimePrefix = isShowTime ? "预计签收时间:" : "", }); } + return res; } From e17e9fae38f233f187733044429195444e8fab2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Thu, 21 Nov 2024 17:36:07 +0800 Subject: [PATCH 50/75] =?UTF-8?q?update:=20=E3=80=90=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E3=80=91=E5=A2=9E=E5=8A=A0=E6=96=B0=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E5=8F=91=E7=94=9F=E6=97=B6=E9=97=B4=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=EF=BC=8C=E5=8E=9F=E8=BD=A8=E8=BF=B9=E5=8F=91=E7=94=9F=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E7=94=A8=E4=BA=8E=E5=8C=B9=E9=85=8D=E5=85=B7=E4=BD=93?= =?UTF-8?q?=E6=98=8E=E7=BB=86=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/ProvideServices/BatchUpsertTrackInput.cs | 5 +++++ .../Dtos/ProvideServices/UpsertTrackInput.cs | 5 +++++ .../Events/TrackUpsertEvent.cs | 5 +++++ .../CAP/EventHandlers/TrackUpsertEventHandler.cs | 8 ++++---- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs index 3992554f..baaeb7bb 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs @@ -29,6 +29,11 @@ public class BatchUpsertTrackInput : OrderNosInfo [Required] public DateTime TrackTime { get; set; } + /// + /// 更改后的轨迹发生时间,无需更改保持为空 + /// + public DateTime? NewTrackTime { get; set; } + /// /// 轨迹发生时区 /// diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs index 309d652e..b4cf72ae 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs @@ -29,6 +29,11 @@ public class UpsertTrackInput : OrderNoInfo [Required] public DateTime? TrackTime { get; set; } + /// + /// 更改后的轨迹发生时间,无需更改保持为空 + /// + public DateTime? NewTrackTime { get; set; } + /// /// 轨迹发生时区 /// diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index 483c929b..4102df32 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -49,6 +49,11 @@ public class TrackUpsertEvent /// public DateTime TrackTime { get; set; } + /// + /// 更改后的轨迹发生时间,无需更改保持为空 + /// + public DateTime? NewTrackTime { get; set; } + /// /// 轨迹发生时区 /// diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 30feeffa..58b1cd4f 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -347,7 +347,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe OrderType = order.OrderType, TrackCode = @event.TrackCode, TrackPlace = @event.TrackPlace, - TrackTime = @event.TrackTime, + TrackTime = @event.NewTrackTime ?? @event.TrackTime, TrackTimeZone = @event.TrackTimeZone, ServiceProviderCode = @event.TrackRefreshData.ServiceProviderCode ?? GlobalConst.EmptyString, OriginTrackContent = @event.TrackRefreshData.OriginTrackContent ?? GlobalConst.EmptyString, @@ -357,8 +357,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe //来源轨迹内容,第一次新增的时候使用轨迹内容表提供的 TrackStatus = trackContent.TrackStatus, TrackStatusCode = trackContent.TrackStatusCode, - TrackContent = @event.Content?? trackContent.TrackContent, - TrackEnContent = @event.EnStatus?? trackContent.TrackEnContent, + TrackContent = @event.Content ?? trackContent.TrackContent, + TrackEnContent = @event.EnStatus ?? trackContent.TrackEnContent, //S06新增轨迹明细字段 IsVisibility = @event.IsVisibility, Source = @event.Source, @@ -399,7 +399,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe else { track.TrackPlace = @event.TrackPlace; - track.TrackTime = @event.TrackTime; + track.TrackTime = @event.NewTrackTime ?? @event.TrackTime; track.TrackTimeZone = @event.TrackTimeZone; track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 ? track.TrackTime From 7e5ae19df4bf44562842189b3578d5950aca3c51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Thu, 21 Nov 2024 18:00:53 +0800 Subject: [PATCH 51/75] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E5=88=A0=E9=99=A4=E8=BD=A8=E8=BF=B9=E4=B8=AD=E4=B8=8B?= =?UTF-8?q?=E6=8B=89=E8=BD=A8=E8=BF=B9=E5=88=97=E8=A1=A8=E4=B8=AD=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E3=80=90=E4=B8=8D=E5=85=81=E8=AE=B8=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E3=80=91=E3=80=90=E4=B8=8D=E5=85=81=E8=AE=B8=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E3=80=91=E7=9A=84=E8=BD=A8=E8=BF=B9=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackContents/GetAvailableContentInput.cs | 5 +++-- .../Services/TrackContents/TrackContentService.cs | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentInput.cs index fb6aa163..47425b3c 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentInput.cs @@ -13,7 +13,7 @@ public class GetAvailableContentInput public string? OrderNo { get; set; } /// - /// 操作类型 1=创建 2=修改 + /// 操作类型 1=创建 2=修改 3=删除 /// public TrackOptionType TrackOptionType { get; set; } } @@ -21,5 +21,6 @@ public class GetAvailableContentInput public enum TrackOptionType { 创建 = 1, - 修改 = 2 + 修改 = 2, + 删除 = 3 } diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index 8cb91e48..bdc6edab 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -269,6 +269,12 @@ public class TrackContentService : ApplicationService if (!item.IsAllowManuallyUpdate && input.TrackOptionType == TrackOptionType.修改) //跳过不允许手动创建的轨迹内容 continue; + if (!item.IsRepeatable && input.TrackOptionType == TrackOptionType.删除) //删除操作中跳过不重复的轨迹内容 + continue; + + if (!item.IsAllowManuallyCreate && input.TrackOptionType == TrackOptionType.删除) //删除操作中跳过不允许手动创建的轨迹内容 + continue; + res.Data.Add(new GetAvailableContentOutput() { IsExternal = item.IsExternal, From f4db3e852a07a6da2cfdbf978d52050cbd560d42 Mon Sep 17 00:00:00 2001 From: eli Date: Thu, 21 Nov 2024 19:16:02 +0800 Subject: [PATCH 52/75] =?UTF-8?q?fix=EF=BC=9A=E8=BD=A8=E8=BF=B9=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E5=AF=B9=E5=A4=96=E4=BB=8E=E8=AF=A6=E6=83=85=E8=8E=B7?= =?UTF-8?q?=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TrackOrders/TrackOrderService.cs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index f57dc80c..18df3b65 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -194,20 +194,13 @@ public class TrackOrderService : ApplicationService if (system == null) return new UnifyResultDto>(false, "未找到指定id的子系统"); - var trackContent = await _trackContentRepository.GetListAsync(m => m.SubSystemId == input.SystemId); - if (trackContent == null) - return new UnifyResultDto>(false, "未找到子系统下的任何轨迹内容"); - var trackDetails = await _trackDetailsEsRepository.GetListAsync(order.Id); res.Data = new List(); foreach (var item in trackDetails) { - var currentTrackContet = trackContent.FirstOrDefault(m => m.Code == item.TrackCode); - - //如果是外部系统,且轨迹内容不对外则跳过这条轨迹内容 - if (system.SystemProperty == 2 && currentTrackContet != null && !currentTrackContet.IsExternal) + if (system.SystemProperty == 2 && !item.IsVisibility) continue; res.Data.Add(new GetDetailTimelineOutput() From cc91836c67609ec8820de051027a2e46b206bb44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Fri, 22 Nov 2024 10:29:52 +0800 Subject: [PATCH 53/75] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E4=B8=89=E6=96=B9=E5=8D=95=E5=8F=B7=E5=92=8C=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=95=86code=E6=89=BE=E4=B8=8D=E5=88=B0=E4=B8=BB?= =?UTF-8?q?=E5=8D=95=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update: 剔除删除轨迹页面轨迹下拉列表的的筛选 --- .../Services/TrackContents/TrackContentService.cs | 6 ------ src/SJZY.Track.Repository/Repositories/OrderRepository.cs | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index bdc6edab..8cb91e48 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -269,12 +269,6 @@ public class TrackContentService : ApplicationService if (!item.IsAllowManuallyUpdate && input.TrackOptionType == TrackOptionType.修改) //跳过不允许手动创建的轨迹内容 continue; - if (!item.IsRepeatable && input.TrackOptionType == TrackOptionType.删除) //删除操作中跳过不重复的轨迹内容 - continue; - - if (!item.IsAllowManuallyCreate && input.TrackOptionType == TrackOptionType.删除) //删除操作中跳过不允许手动创建的轨迹内容 - continue; - res.Data.Add(new GetAvailableContentOutput() { IsExternal = item.IsExternal, diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index 53f6c327..ec5f18fe 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -61,7 +61,7 @@ public class OrderRepository : BasicRepository, IOrderRepository, I public async Task<(int MainOrderId, int CustomId)> GetTrackOrderByProviderAndOrderNo(string serviceProvidrCode, string orderNo) { var orderList = await Context.Queryable() - .LeftJoin((a, b) => a.Id == b.OrderId && b.IsDeleted) + .LeftJoin((a, b) => a.Id == b.OrderId && b.IsDeleted == false) .Where((a, b) => a.OrderNo == orderNo || (b.Platform == serviceProvidrCode && b.OrderNumber == orderNo)) .Select((a, b) => new From 18c5119cde495643e13c29e0c56b182decb1f889 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Fri, 22 Nov 2024 11:47:15 +0800 Subject: [PATCH 54/75] =?UTF-8?q?update:=20=E7=94=B1=E4=BA=8ES06=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E4=BA=86=E5=AD=97=E6=AE=B5=EF=BC=8C=E7=8E=B0=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=A1=AB=E5=85=85=E6=8B=89=E5=8F=96=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E6=8E=A5=E5=8F=A3=E9=80=9A=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E5=A1=AB=E5=85=85=E8=BD=A8=E8=BF=B9=E6=98=8E=E7=BB=86=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update: 【提供接口 /ProviderService/Track/Query】轨迹查询接口增加S06新增字段 --- .../Dtos/ProvideServices/GetTrackOutput.cs | 69 +++++++++++++++++++ .../Rabbit/TrackRefreshEventHandler.cs | 38 +++++++++- .../ProvideServices/TrackService.Query.cs | 19 ++++- 3 files changed, 124 insertions(+), 2 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs index 72df17e3..84c1ed15 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs @@ -7,6 +7,9 @@ public class GetTrackOutput /// public string OrderNo { get; set; } = null!; + /// + /// 轨迹明细列表 + /// public List TrackDetails { get; set; } = new(); } @@ -32,4 +35,70 @@ public class TrackDetail /// 是否对外 /// public bool IsDisplay { get; set; } + + /// + /// 客户是否可见 + /// + public bool IsVisibility { get; set; } + + /// + /// 数据来源:1外部服务商创建,2内部系统创建,3人工创建 + /// + public int Source { get; set; } + + /// + /// 备注 + /// + public string? Remarks { get; set; } + + /// + /// 附件集合 + /// + public List? Files { get; set; } + + /// + /// 轨迹发生地(城市) + /// + public string? TrackPlaceCity { get; set; } + + /// + /// 轨迹发生地(城市)Id + /// + public int? TrackPlaceCityId { get; set; } + + /// + /// 轨迹发生地(省/州) + /// + public string? TrackPlaceProvince { get; set; } + + /// + /// 轨迹发生地(省/州)Id + /// + public int? TrackPlaceProvinceId { get; set; } + + /// + /// 轨迹发生地(国家/地区) + /// + public string? TrackPlaceNation { get; set; } + + /// + /// 轨迹发生地(国家/地区)Id + /// + public int? TrackPlaceNationId { get; set; } + + /// + /// 轨迹发生地邮编 + /// + public string? TrackPlacePostcode { get; set; } + + + /// + /// 预计到达时间 + /// + public DateTime? EstimatedDeliveryDate { get; set; } + + /// + /// 目的地时区 + /// + public float? DestinationTimeZone { get; set; } } diff --git a/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs index 8afa7705..25367043 100644 --- a/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs +++ b/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs @@ -15,6 +15,7 @@ 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; using Volo.Abp.DependencyInjection; namespace SJZY.Track.Application.Rabbit; @@ -258,6 +259,22 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler TrackTime = trackTime ?? DateTime.Now, TrackTimeZone = trackTimeZone ?? GlobalConst.NoneTrackTimeZone, IsAdd = true, + //S06新增 + IsVisibility = false, + Source = (int)TrackSourceEnum.ExternalServiceProvide, + Remarks = GlobalConst.EmptyString, + Files = null, + Content = GlobalConst.EmptyString, + EnStatus = GlobalConst.EmptyString, + TrackPlaceCity = GlobalConst.EmptyString, + TrackPlaceCityId = GlobalConst.NotExistId, + TrackPlaceProvince = GlobalConst.EmptyString, + TrackPlaceProvinceId = GlobalConst.NotExistId, + TrackPlaceNation = GlobalConst.EmptyString, + TrackPlaceNationId = GlobalConst.NotExistId, + TrackPlacePostcode = GlobalConst.EmptyString, + DestinationTimeZone = null, + EstimatedDeliveryDate = null, }; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertForRefreshSubscribe, trackUpsertEvent); @@ -281,7 +298,26 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler OriginTrackDataHash = StringHelper.GetHash(JsonConvert.SerializeObject(trackToken)), OriginTrackContent = trackContent ?? GlobalConst.EmptyString, CreateUser = GlobalConst.SystemUser, - CreateTime = DateTime.Now + CreateTime = DateTime.Now, + //来源轨迹内容,第一次新增的时候使用轨迹内容表提供的 + TrackStatus = GlobalConst.EmptyString, + TrackStatusCode = GlobalConst.EmptyString, + TrackContent = GlobalConst.EmptyString, + TrackEnContent = GlobalConst.EmptyString, + //S06新增轨迹明细字段 + IsVisibility = false, + Source = (int) TrackSourceEnum.ExternalServiceProvide, + Remarks = GlobalConst.EmptyString, + Files = null, + TrackPlaceCity = GlobalConst.EmptyString, + TrackPlaceCityId = GlobalConst.NotExistId, + TrackPlaceProvince = GlobalConst.EmptyString, + TrackPlaceProvinceId = GlobalConst.NotExistId, + TrackPlaceNation = GlobalConst.EmptyString, + TrackPlaceNationId = GlobalConst.NotExistId, + TrackPlacePostcode = GlobalConst.EmptyString, + DestinationTimeZone = null, + EstimatedDeliveryDate = null, }; track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs index 30b0e0d2..ab0bd27d 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs @@ -62,7 +62,24 @@ public partial class TrackService TimeZone = Math.Abs(x.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 ? null : input.TimeZone ?? 8, - IsDisplay = trackContentDic.TryGetValue(x.TrackCode, out var isExternal) && isExternal + IsDisplay = trackContentDic.TryGetValue(x.TrackCode, out var isExternal) && isExternal, + IsVisibility = x.IsVisibility, + Source = x.Source, + Remarks = x.Remarks, + Files = x.Files?.Select(y => new FileItemDto + { + FileName = y.FileName, + OssKey = y.OssKey + }).ToList(), + TrackPlaceCity = x.TrackPlaceCity, + TrackPlaceCityId = x.TrackPlaceCityId, + TrackPlaceProvince = x.TrackPlaceProvince, + TrackPlaceProvinceId = x.TrackPlaceProvinceId, + TrackPlaceNation = x.TrackPlaceNation, + TrackPlaceNationId = x.TrackPlaceNationId, + TrackPlacePostcode = x.TrackPlacePostcode, + DestinationTimeZone = x.DestinationTimeZone, + EstimatedDeliveryDate = x.EstimatedDeliveryDate }).ToList(); res.Add(item); From e07fc810c1c781e7a80eae5dc2c2ba182d049c8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Fri, 22 Nov 2024 14:51:15 +0800 Subject: [PATCH 55/75] =?UTF-8?q?update:=20=E6=94=AF=E6=8C=81=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9D=A5=E6=BA=90=E4=B8=BA=E3=80=90=E5=A4=96=E9=83=A8?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=95=86=E8=BD=A8=E8=BF=B9=E3=80=91=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E7=9A=84=E4=BF=AE=E6=94=B9=EF=BC=8C=E5=B9=B6=E4=BF=9D?= =?UTF-8?q?=E8=AF=81=E8=BD=A8=E8=BF=B9=E5=8F=91=E7=94=9F=E5=9C=B0=EF=BC=8C?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E5=8F=91=E7=94=9F=E6=97=B6=E9=97=B4=EF=BC=8C?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E5=8F=91=E7=94=9F=E6=97=B6=E5=8C=BA=E4=B8=8D?= =?UTF-8?q?=E8=A2=AB=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/ProvideServices/BatchUpsertTrackInput.cs | 1 + .../CAP/EventHandlers/TrackUpsertEventHandler.cs | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs index baaeb7bb..d5767cd5 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs @@ -49,6 +49,7 @@ public class BatchUpsertTrackInput : OrderNosInfo /// /// 数据来源:1外部服务商创建,2内部系统创建,3人工创建 + /// 批量新增时使用指定轨迹来源,更新时无需指定 /// [Required] public int Source { get; set; } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 58b1cd4f..eba60623 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -298,8 +298,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe if (track == null) continue; // 不存在不让改 - //来源与外部服务商不允许修改 - if (track.Source == (int) TrackSourceEnum.ExternalServiceProvide) continue; } else { @@ -398,9 +396,14 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe } else { - track.TrackPlace = @event.TrackPlace; - track.TrackTime = @event.NewTrackTime ?? @event.TrackTime; - track.TrackTimeZone = @event.TrackTimeZone; + //外部轨迹,轨迹发生地,轨迹发生时间,轨迹发生时区,不允许更改 + if (track.Source != (int) TrackSourceEnum.ExternalServiceProvide) + { + track.TrackPlace = @event.TrackPlace; + track.TrackTime = @event.NewTrackTime ?? @event.TrackTime; + track.TrackTimeZone = @event.TrackTimeZone; + } + track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 ? track.TrackTime : track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); From 7b9de2b9ec0d287674d6a169143a825ab6b53598 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Fri, 22 Nov 2024 16:10:10 +0800 Subject: [PATCH 56/75] =?UTF-8?q?update:=20=E8=8E=B7=E5=8F=96=E5=8F=AF?= =?UTF-8?q?=E7=94=A8=E8=BD=A8=E8=BF=B9=E5=86=85=E5=AE=B9=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=8F=8D=E5=8F=82=E5=A2=9E=E5=8A=A0=EF=BC=8C=E3=80=90=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=9D=A5=E6=BA=90=E3=80=91=E3=80=90=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E5=8F=91=E7=94=9F=E6=97=B6=E9=97=B4=E3=80=91=E3=80=90=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E5=8F=91=E7=94=9F=E6=97=B6=E5=8C=BA=E3=80=91=E5=B9=B6?= =?UTF-8?q?=E4=BF=9D=E8=AF=81=E3=80=90=E8=BD=A8=E8=BF=B9=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E3=80=91=E3=80=90=E8=BD=A8=E8=BF=B9=E8=8B=B1=E6=96=87=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E3=80=91=E5=92=8C=E6=96=B0=E5=A2=9E=E7=9A=84=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E4=B8=8E=E8=BD=A8=E8=BF=B9=E6=98=8E=E7=BB=86=E8=A1=A8?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GetAvailableContentOutput.cs | 15 ++++++++ .../TrackContents/TrackContentService.cs | 38 ++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs index 69e77773..f1c9300c 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs @@ -26,4 +26,19 @@ public class GetAvailableContentOutput /// 是否对外 /// public bool IsExternal { get; set; } + + /// + /// 轨迹来源 + /// + public int? Source { get; set; } + + /// + /// 轨迹发生时间 + /// + public DateTime? TrackTime { get; set; } + + /// + /// 轨迹发生时区 + /// + public float? TrackTimeZone { get; set; } } diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index 8cb91e48..4aa023da 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -266,7 +266,7 @@ public class TrackContentService : ApplicationService if (!item.IsAllowManuallyCreate && input.TrackOptionType == TrackOptionType.创建) //跳过不允许手动创建的轨迹内容 continue; - if (!item.IsAllowManuallyUpdate && input.TrackOptionType == TrackOptionType.修改) //跳过不允许手动创建的轨迹内容 + if (!item.IsAllowManuallyUpdate && input.TrackOptionType == TrackOptionType.修改) //跳过不允许手动修改的轨迹内容 continue; res.Data.Add(new GetAvailableContentOutput() @@ -279,6 +279,42 @@ public class TrackContentService : ApplicationService }); } + if (input.TrackOptionType == TrackOptionType.创建 + || trackDetails == null + || trackDetails.Count == 0) + { + return res; + } + + + //修改操作,查轨迹内容列表反映明细表数据,重新构造响应数据 + var matchContent = new List(); + var contents = res.Data.Select(x => new + { + x.Id, + x.IsExternal, + x.Code + }); + + foreach (var content in contents) + { + var match = trackDetails + .Where(x => x.TrackCode == content.Code) + .Select(matchItem => new GetAvailableContentOutput + { + IsExternal = content.IsExternal, + Id = content.Id, + EnContent = matchItem.TrackEnContent, + Content = matchItem.TrackContent, + Code = matchItem.TrackCode, + TrackTime = matchItem.TrackTime, + TrackTimeZone = matchItem.TrackTimeZone, + Source = matchItem.Source + }); + matchContent.AddRange(match); + } + + res.Data = matchContent; return res; } From 47cc075b985a222bdc805de303592da2c6761fce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Fri, 22 Nov 2024 16:39:46 +0800 Subject: [PATCH 57/75] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=A0=B9?= =?UTF-8?q?=E6=8D=AEESid=E5=88=A0=E9=99=A4=E8=BD=A8=E8=BF=B9=EF=BC=8C?= =?UTF-8?q?=E5=90=91=E4=B8=8B=E5=88=B7=E5=AF=BC=E8=87=B4=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=87=BA=E7=8E=B0ES=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BB=8E?= =?UTF-8?q?=E8=80=8C=E5=BD=B1=E5=93=8D=E5=85=B3=E8=81=94=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E7=9A=84=E5=85=B3=E8=81=94=E8=BD=A8=E8=BF=B9=E7=9A=84=E5=88=A0?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CAP/EventHandlers/TrackDeleteEventHandler.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index 436e55dd..288face2 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -172,6 +172,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe tracks = await _trackDetailsEsRepository.GetDataByIds(@event.EsIds); orderIds = tracks.Select(m => m.OrderId).Distinct().ToList(); @event.OrderIds = orderIds.ToArray(); + @event.TrackCodes = tracks.Select(x => x.TrackCode).Distinct().ToList(); // 外部api获取的轨迹不允许删除 if (tracks.Any(m => m.Source == TrackSourceEnum.ExternalServiceProvide.GetHashCode())) @@ -182,6 +183,9 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe { await _trackDetailsEsRepository.DeleteTrackByIdAsync(item.Id, item.IndexName); } + + //清理已经删除过的esid + @event.EsIds = Array.Empty(); } else //原有逻辑,根据轨迹code和订单进行删除 { @@ -235,7 +239,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe OrderId = order.Id, OrderNo = order.OrderNo, OptionType = OrderOperationType.删除轨迹.ToString(), - Content = tracks?.Where(m=>m.OrderId == order.Id)?.ToList().ToJson(), + Content = tracks?.Where(m => m.OrderId == order.Id)?.ToList().ToJson(), CreateUserId = @event.OperationManId, CreateUserName = @event.OperationMan ?? "", CreateTime = DateTime.Now From 7fba3a4f21e5fac5e9ec036b3385ca0d46840f0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Fri, 22 Nov 2024 17:59:30 +0800 Subject: [PATCH 58/75] =?UTF-8?q?update:=20=E8=B0=83=E6=95=B4=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E5=86=85=E5=AE=B9=E6=9F=A5=E8=AF=A2=E5=8F=8D=E5=8F=82?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=BD=A8=E8=BF=B9=E5=8F=91=E7=94=9F?= =?UTF-8?q?=E5=9C=B0=E5=AD=97=E6=AE=B5=20fix:=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=BC=95=E5=8F=91=E8=BD=A8=E8=BF=B9=E6=9B=B4=E6=96=B0=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E5=8F=82=E6=95=B0=E5=A1=AB=E5=85=85=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=80=BC=EF=BC=8C=E5=AF=BC=E8=87=B4=E3=80=90=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E3=80=91=E3=80=90=E8=BD=A8=E8=BF=B9=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E8=8B=B1=E6=96=87=E3=80=91=E6=98=BE=E7=A4=BA=E4=B8=BA?= =?UTF-8?q?=E7=A9=BA=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Rabbit/TrackRefreshEventHandler.cs | 36 +++++++++---------- .../TrackContents/TrackContentService.cs | 1 + 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs index 25367043..36baaec7 100644 --- a/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs +++ b/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs @@ -262,17 +262,17 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler //S06新增 IsVisibility = false, Source = (int)TrackSourceEnum.ExternalServiceProvide, - Remarks = GlobalConst.EmptyString, + Remarks = null, Files = null, - Content = GlobalConst.EmptyString, - EnStatus = GlobalConst.EmptyString, - TrackPlaceCity = GlobalConst.EmptyString, - TrackPlaceCityId = GlobalConst.NotExistId, - TrackPlaceProvince = GlobalConst.EmptyString, - TrackPlaceProvinceId = GlobalConst.NotExistId, - TrackPlaceNation = GlobalConst.EmptyString, - TrackPlaceNationId = GlobalConst.NotExistId, - TrackPlacePostcode = GlobalConst.EmptyString, + Content = null, + EnStatus = null, + TrackPlaceCity = null, + TrackPlaceCityId = null, + TrackPlaceProvince = null, + TrackPlaceProvinceId = null, + TrackPlaceNation = null, + TrackPlaceNationId = null, + TrackPlacePostcode = null, DestinationTimeZone = null, EstimatedDeliveryDate = null, }; @@ -307,15 +307,15 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler //S06新增轨迹明细字段 IsVisibility = false, Source = (int) TrackSourceEnum.ExternalServiceProvide, - Remarks = GlobalConst.EmptyString, + Remarks = null, Files = null, - TrackPlaceCity = GlobalConst.EmptyString, - TrackPlaceCityId = GlobalConst.NotExistId, - TrackPlaceProvince = GlobalConst.EmptyString, - TrackPlaceProvinceId = GlobalConst.NotExistId, - TrackPlaceNation = GlobalConst.EmptyString, - TrackPlaceNationId = GlobalConst.NotExistId, - TrackPlacePostcode = GlobalConst.EmptyString, + TrackPlaceCity = null, + TrackPlaceCityId = null, + TrackPlaceProvince = null, + TrackPlaceProvinceId = null, + TrackPlaceNation =null, + TrackPlaceNationId = null, + TrackPlacePostcode = null, DestinationTimeZone = null, EstimatedDeliveryDate = null, }; diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index 4aa023da..5e75ffa8 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -307,6 +307,7 @@ public class TrackContentService : ApplicationService EnContent = matchItem.TrackEnContent, Content = matchItem.TrackContent, Code = matchItem.TrackCode, + TrackPlace = matchItem.TrackPlace, TrackTime = matchItem.TrackTime, TrackTimeZone = matchItem.TrackTimeZone, Source = matchItem.Source From 989e9c8ff1253f19c9ecff96619f2d02e1d3ddc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Fri, 22 Nov 2024 18:01:12 +0800 Subject: [PATCH 59/75] =?UTF-8?q?=E3=80=90=E8=BD=A8=E8=BF=B9=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E6=9F=A5=E8=AF=A2=E3=80=91=E8=A1=A5=E5=85=85=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackContents/GetAvailableContentOutput.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs index f1c9300c..ddbd0a48 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs @@ -32,6 +32,11 @@ public class GetAvailableContentOutput /// public int? Source { get; set; } + /// + /// 轨迹发生地 + /// + public string? TrackPlace { get; set; } + /// /// 轨迹发生时间 /// From 030f016c2da3743533e775da84f1245e32f0dc3b Mon Sep 17 00:00:00 2001 From: eli Date: Sat, 23 Nov 2024 09:52:54 +0800 Subject: [PATCH 60/75] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=8F=AF=E7=94=A8?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E8=8A=82=E7=82=B9=E6=8E=A5=E5=8F=A3=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GetAvailableContentOutput.cs | 48 +++++++++++++++++++ .../TrackContents/TrackContentService.cs | 15 +++++- 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs index ddbd0a48..e2331257 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs @@ -46,4 +46,52 @@ public class GetAvailableContentOutput /// 轨迹发生时区 /// public float? TrackTimeZone { get; set; } + + /// + /// 轨迹发生地 + /// + public string? TrackPlace { get; set; } + + /// + /// 时区的值 + /// + public float? TrackTimeZoneValue { get; set; } + + /// + /// 备注 + /// + public string? Remarks { get; set; } + + /// + /// 轨迹发生地(城市) + /// + public string? TrackPlaceCity { get; set; } + public int? TrackPlaceCityId { get; set; } + + /// + /// 轨迹发生地(省/州) + /// + public string? TrackPlaceProvince { get; set; } + public int? TrackPlaceProvinceId { get; set; } + + /// + /// 轨迹发生地(国家/地区) + /// + public string? TrackPlaceNation { get; set; } + public int? TrackPlaceNationId { get; set; } + + /// + /// 轨迹发生地邮编 + /// + public string? TrackPlacePostcode { get; set; } + + /// + /// 预计到达时间 + /// + public DateTime? EstimatedDeliveryDate { get; set; } + + /// + /// 目的地时区 + /// + public float? DestinationTimeZone { get; set; } } diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index 5e75ffa8..37089d50 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -310,7 +310,20 @@ public class TrackContentService : ApplicationService TrackPlace = matchItem.TrackPlace, TrackTime = matchItem.TrackTime, TrackTimeZone = matchItem.TrackTimeZone, - Source = matchItem.Source + Source = matchItem.Source, + + DestinationTimeZone = matchItem.DestinationTimeZone, + EstimatedDeliveryDate = matchItem.EstimatedDeliveryDate, + TrackPlacePostcode = matchItem.TrackPlacePostcode, + TrackPlaceNation = matchItem.TrackPlaceNation, + TrackPlaceNationId = matchItem.TrackPlaceNationId, + TrackPlaceProvince = matchItem.TrackPlaceProvince, + TrackPlaceProvinceId = matchItem.TrackPlaceProvinceId, + TrackPlaceCity = matchItem.TrackPlaceCity, + TrackPlaceCityId = matchItem.TrackPlaceCityId, + Remarks = matchItem.Remarks, + TrackTimeZoneValue = matchItem.DestinationTimeZone, + TrackPlace = matchItem.TrackPlace, }); matchContent.AddRange(match); } From eef795e2e34322fcb10d5876043348a8f2a44354 Mon Sep 17 00:00:00 2001 From: eli Date: Sat, 23 Nov 2024 09:56:55 +0800 Subject: [PATCH 61/75] =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackContents/GetAvailableContentOutput.cs | 5 ----- .../Services/TrackContents/TrackContentService.cs | 1 - 2 files changed, 6 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs index e2331257..1102eed6 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs @@ -47,11 +47,6 @@ public class GetAvailableContentOutput /// public float? TrackTimeZone { get; set; } - /// - /// 轨迹发生地 - /// - public string? TrackPlace { get; set; } - /// /// 时区的值 /// diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index 37089d50..c7c69e68 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -323,7 +323,6 @@ public class TrackContentService : ApplicationService TrackPlaceCityId = matchItem.TrackPlaceCityId, Remarks = matchItem.Remarks, TrackTimeZoneValue = matchItem.DestinationTimeZone, - TrackPlace = matchItem.TrackPlace, }); matchContent.AddRange(match); } From 74190018450b9c58fd469240fbd79e64e330fdf7 Mon Sep 17 00:00:00 2001 From: eli Date: Sat, 23 Nov 2024 17:15:45 +0800 Subject: [PATCH 62/75] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/ProvideServices/UpsertOrderInput.cs | 10 + .../Dtos/ProvideServices/UpsertTrackInput.cs | 5 + .../TrackContents/GetContentDetailInput.cs | 29 +++ .../TrackContents/GetContentDetailOutput.cs | 192 ++++++++++++++++++ .../TrackContentAutoMapperProfile.cs | 5 + .../Services/ProvideServices/OrderService.cs | 3 +- .../Services/ProvideServices/TrackService.cs | 2 +- .../TrackContents/TrackContentService.cs | 65 +++++- .../Aggregates/OrderAggregate/OrderEntity.cs | 6 + .../ITrackDetailsEsRepository.cs | 1 + .../ITrackTemplateRepository.cs | 1 + .../Repositories/TrackDetailsEsRepository.cs | 35 ++++ .../Repositories/TrackTemplateRepository.cs | 23 +++ 13 files changed, 371 insertions(+), 6 deletions(-) create mode 100644 src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailInput.cs create mode 100644 src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailOutput.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertOrderInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertOrderInput.cs index 4bd7b0b7..cfdbe0ac 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertOrderInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertOrderInput.cs @@ -10,6 +10,16 @@ public class UpsertOrderInput : UpdateOrderInput [Required] [Range(1, int.MaxValue)] public int CustomId { get; set; } + + /// + /// 模板code + /// + public List TemplateCodes { get; set; } + + /// + /// 当前操作人 + /// + public int OptionUserId { get; set; } } public class OrderFlightInfo diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs index b4cf72ae..2ba86e87 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs @@ -118,4 +118,9 @@ public class UpsertTrackInput : OrderNoInfo /// [Range(-12, 12)] public float? DestinationTimeZone { get; set; } + + /// + /// 当前操作人 + /// + public int OptionUserId { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailInput.cs new file mode 100644 index 00000000..d61d19bb --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailInput.cs @@ -0,0 +1,29 @@ +namespace SJZY.Track.Application.Contract.Dtos.TrackContents; + +public class GetContentDetailInput +{ + /// + /// 子系统编号 + /// + public int SystemId { get; set; } + + /// + /// 订单号 + /// + public string OrderNumber { get; set; } + + /// + /// 订单类型 + /// + public int OrderType { get; set; } + + /// + /// 轨迹code + /// + public string TrackCode { get; set; } + + /// + /// 轨迹发生时间 + /// + public DateTime TrackTime { get; set; } +} diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailOutput.cs new file mode 100644 index 00000000..ea58971c --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailOutput.cs @@ -0,0 +1,192 @@ +namespace SJZY.Track.Application.Contract.Dtos.TrackContents; + +public class GetContentDetailOutput +{ + /// + /// 子系统 + /// + public int SubSystemId { get; set; } + + /// + /// 订单Id + /// + public int OrderId { get; set; } + + /// + /// 订单号 + /// + public string OrderNo { get; set; } = null!; + + /// + /// 索引名称 + /// + public string IndexName { get; set; } = null!; + + /// + /// 订单类型(主数据枚举TrackOrderType) + /// + public int OrderType { get; set; } + + /// + /// 轨迹状态 + /// + public string TrackStatus { get; set; } + + /// + /// 轨迹状态code + /// + public string TrackStatusCode { get; set; } + + /// + /// 轨迹内容代码 + /// + public string TrackCode { get; set; } + + /// + /// 轨迹内容 + /// + public string TrackContent { get; set; } + + /// + /// 轨迹内容英文 + /// + public string TrackEnContent { get; set; } + + /// + /// 服务商code + /// + public string ServiceProviderCode { get; set; } + + /// + /// 原轨迹内容 + /// + public string? OriginTrackContent { get; set; } + + /// + /// 原轨迹报文hash(刷新轨迹重复性校验使用) + /// + public string OriginTrackDataHash { get; set; } = null!; + + /// + /// 轨迹发生地 + /// + public string TrackPlace { get; set; } + + /// + /// 轨迹发生时间 + /// + public DateTime TrackTime { get; set; } + + /// + /// 轨迹发生时区 + /// + public float TrackTimeZone { get; set; } + + /// + /// 转化后的轨迹发生时间 + /// + public DateTime ZeroTrackTime { get; set; } + + /// + /// 创建人 + /// + public string CreateUser { get; set; } + + /// + /// 创建时间 + /// + public DateTime CreateTime { get; set; } + + /// + /// 修改人 + /// + public string UpdateUser { get; set; } + + /// + /// 修改时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 客户是否可见 + /// + public bool IsVisibility { get; set; } + + /// + /// 数据来源:1外部服务商创建,2内部系统创建,3人工创建 + /// + public int Source { get; set; } + + /// + /// 备注 + /// + public string? Remarks { get; set; } + + /// + /// 附件集合 + /// + public List? Files { get; set; } + + /// + /// 轨迹发生地(城市) + /// + public string? TrackPlaceCity { get; set; } + + /// + /// 轨迹发生地(城市)Id + /// + public int? TrackPlaceCityId { get; set; } + + /// + /// 轨迹发生地(省/州) + /// + public string? TrackPlaceProvince { get; set; } + + /// + ///轨迹发生地(省/州)Id + /// + public int? TrackPlaceProvinceId { get; set; } + + /// + /// 轨迹发生地(国家/地区) + /// + public string? TrackPlaceNation { get; set; } + + /// + /// 轨迹发生地(国家/地区)Id + /// + public int? TrackPlaceNationId { get; set; } + + /// + /// 轨迹发生地邮编 + /// + public string? TrackPlacePostcode { get; set; } + + /// + /// 预计签收时间 + /// + public DateTime? EstimatedDeliveryDate { get; set; } + + /// + /// 签收地时区 + /// + public float? DestinationTimeZone { get; set; } +} + +public class FileItem +{ + /// + /// 文件osskey + /// + public string OssKey { get; set; } + + /// + /// 文件名称 + /// + public string FileName { get; set; } + + /// + /// 路径 + /// + public string Url { get; set; } +} diff --git a/src/SJZY.Track.Application/AutoMapper/TrackContentAutoMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/TrackContentAutoMapperProfile.cs index 862447be..a161314e 100644 --- a/src/SJZY.Track.Application/AutoMapper/TrackContentAutoMapperProfile.cs +++ b/src/SJZY.Track.Application/AutoMapper/TrackContentAutoMapperProfile.cs @@ -1,6 +1,7 @@ using AutoMapper; using SJZY.Track.Application.Contract.Dtos.TrackContents; using SJZY.Track.Domain.Aggregates.TrackContentAggregate; +using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Dtos.TrackContents; namespace SJZY.Track.Application.AutoMapper; @@ -16,5 +17,9 @@ public class TrackContentAutoMapperProfile : Profile CreateMap, UnifyPageResultDto>( MemberList.None); CreateMap(MemberList.None); + + CreateMap(MemberList.None).ReverseMap(); + CreateMap< SJZY.Track.Domain.Aggregates.TrackDetailsAggregate.FileItem, SJZY.Track.Application.Contract.Dtos.TrackContents.FileItem>(MemberList.None).ReverseMap(); + } } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs index dea72486..c41d28c2 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs @@ -57,7 +57,7 @@ public partial class OrderService : ApplicationService, IOrderService { OrderId = order.Id, OrderNo = input.OrderNo, - OptionType = OrderOperationType.修改订单.ToString(), + OptionType = OrderOperationType.修改订单.ToString(), Content = input.ToJson(), CreateUserId = currentUser.UserId, CreateUserName = currentUser.Name, @@ -76,6 +76,7 @@ public partial class OrderService : ApplicationService, IOrderService order.OrderFlights = ObjectMapper.Map, List>(input.FlightInfos); order.OrderPullStatus = BuiltOrderPullStatus(input.PullConfigInfos); order.OrderPlatformNumbers = BuiltOrderPlatformNumbers(input.PullConfigInfos); + order.TemplateCodes = string.Join(',', input.TemplateCodes); var orderId = await _orderRepository.CreateOrderAsync(order); diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index cec5feae..ab931373 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -108,7 +108,7 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: $"订单:{input.OrderNo},轨迹代码:{input.TrackCode}存在多条记录,不允许修改"); } - var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(); + var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(input.OptionUserId); if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) { //TODO: log || ex diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index c7c69e68..996b2f57 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -2,6 +2,7 @@ using System.Linq.Expressions; using Microsoft.Extensions.Localization; using SJZY.Expand.ABP.Core.Localization; using SJZY.Expand.ABP.Core.PublicMethords; +using SJZY.Expand.AliyunOSS; using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Dtos.TrackContents; using SJZY.Track.Application.Localization; @@ -10,7 +11,9 @@ using SJZY.Track.Domain.Aggregates.TrackContentAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackFlagAggregate; using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; +using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Dtos.TrackContents; +using SJZY.Track.Domain.Dtos.TrackTemplate; using SJZY.Track.Domain.Queries; namespace SJZY.Track.Application.Services.TrackContents; @@ -24,6 +27,7 @@ public class TrackContentService : ApplicationService { private readonly IStringLocalizer _stringLocalizer; private readonly ITrackContentRepository _trackContentRepository; + private readonly ITrackTemplateRepository _trackTemplateRepository; private readonly IBasicQuery _trackFlagBasicQuery; private readonly IBasicQuery _trackStatusBasicQuery; private readonly IOrderRepository _orderRepository; @@ -35,7 +39,8 @@ public class TrackContentService : ApplicationService IBasicQuery trackStatusBasicQuery, IBasicQuery trackFlagBasicQuery, IOrderRepository orderRepository, - ITrackDetailsEsRepository trackDetailsEsRepository) + ITrackDetailsEsRepository trackDetailsEsRepository, + ITrackTemplateRepository trackTemplateRepository) { _stringLocalizer = stringLocalizer; _trackContentRepository = trackContentRepository; @@ -43,6 +48,7 @@ public class TrackContentService : ApplicationService _trackFlagBasicQuery = trackFlagBasicQuery; _orderRepository = orderRepository; _trackDetailsEsRepository = trackDetailsEsRepository; + _trackTemplateRepository = trackTemplateRepository; } /// @@ -220,6 +226,50 @@ public class TrackContentService : ApplicationService return res; } + /// + /// 根据子系统id、单号、订单类型、轨迹发生时间、轨迹code获取轨迹内容 + /// + /// + /// + [HttpPost("GetContentDetail")] + public async Task> GetContentDetail([FromBody] GetContentDetailInput input) + { + if (input.SystemId <= 0) + return new UnifyResultDto(false, "子系统Id必须大于等于0"); + + if (string.IsNullOrEmpty(input.TrackCode)) + return new UnifyResultDto(false, "轨迹内容code不能为空"); + + if (string.IsNullOrEmpty(input.OrderNumber)) + return new UnifyResultDto(false, "订单code不能为空"); + + if (input.OrderType <= 0) + return new UnifyResultDto(false, "订单类型不能为空"); + + if (input.TrackTime == default) + return new UnifyResultDto(false, "轨迹发生时间不能为空"); + + var content = await _trackDetailsEsRepository.GetDetailAsync(input.OrderNumber, input.TrackCode, input.OrderType, input.SystemId, input.TrackTime); + if (content == default) + return new UnifyResultDto(false, "在当前子系统中未找到指定code的轨迹内容"); + + var res = new UnifyResultDto(true) + { + Data = ObjectMapper.Map(content) + }; + + + if (res.Data != default && res.Data.Files.Any()) + { + foreach (var item in res.Data.Files) + { + item.Url = OSSHelper.GetUrlByKey(item.OssKey); + } + } + + return res; + } + /// /// 创建轨迹时获取可用的轨迹内容 /// @@ -235,18 +285,25 @@ public class TrackContentService : ApplicationService return new UnifyResultDto>(false, "单号不能为空!"); //获取当前订单下已有的轨迹内容 - var orderId = await _orderRepository.GetFirstAsync(x => x.OrderNo == input.OrderNo && x.SubSystemId == input.SystemId, x => x.Id); - if (orderId == default) + var order = await _orderRepository.GetFirstAsync(x => x.OrderNo == input.OrderNo && x.SubSystemId == input.SystemId); + if (order == default) throw new BusinessException(message: "订单不存在!"); //获取轨迹详情 - var trackDetails = await _trackDetailsEsRepository.GetListAsync(orderId); + var trackDetails = await _trackDetailsEsRepository.GetListAsync(order.Id); //获取当前子系统下所有的轨迹内容 var contentList = await _trackContentRepository.GetListBySystemIdAsync(input.SystemId); if (contentList == null) throw new BusinessException(message: "当前子系统下未找到任何可用的轨迹内容!"); + //如果订单给了获取模板code,则进一步根据模板code进行过滤 + if (!string.IsNullOrEmpty(order.TemplateCodes)) + { + var currentCodes = order.TemplateCodes.Split(","); + var template = await _trackTemplateRepository.GetContentByTemplateCodes(currentCodes, input.SystemId); + contentList = contentList.Where(m => template.Contains(m.Code)).ToList(); + } var res = new UnifyResultDto>(true) { diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs index b2e3a5ba..762c1324 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs @@ -180,6 +180,12 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot [SugarColumn(ColumnName = "DestinationTimeZone")] public float? DestinationTimeZone { get; set; } + /// + /// 模板code + /// + [SugarColumn(ColumnName = "TemplateCodes")] + public string? TemplateCodes { get; set; } + [SugarColumn(IsIgnore = true)] public List OrderFlights { get; set; } [SugarColumn(IsIgnore = true)] public List OrderPullStatus { get; set; } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs index a8da5185..482d7142 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs @@ -29,4 +29,5 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService> GetDataByIds(string[] ids); + Task GetDetailAsync(string orderNo, string trackCode, int orderType, int subSystemId, DateTime trackTime); } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs index 8a104c3c..db202083 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs @@ -45,4 +45,5 @@ public interface ITrackTemplateRepository : IBasicRepository> whereExpression); Task> GetTrackTemplateListAsync(GetTrackTemplateListInputVo input); + Task> GetContentByTemplateCodes(string[] codes, int systemId); } diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index 0fee4fc6..cb62b1b1 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -440,4 +440,39 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract GetDetailAsync(string orderNo, string trackCode, int orderType, int subSystemId, DateTime trackTime) + { + var res = await Context.SearchAsync(s => s + .Index("sjzy_track_details") + .Query(q => q + .Bool(b => b + .Must(mu => mu + .Terms(t => t + .Field(f => f.OrderNo.Suffix("keyword")) + .Terms(orderNo)), + mu => mu + .Terms(t => t + .Field(f => f.TrackCode.Suffix("keyword")) + .Terms(trackCode)), + mu => mu + .Terms(t => t + .Field(f => f.OrderType) + .Terms(orderType)), + mu => mu + .Terms(t => t + .Field(f => f.SubSystemId) + .Terms(subSystemId)), + mu => mu + .Terms(t => t + .Field(f => f.TrackTime) + .Terms(trackTime)) // 注意:这里你重复了OrderType的查询,你可能需要移除重复的查询 + ) + ) + ) + ); + + return res.Documents.FirstOrDefault(); + } + } diff --git a/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs index be08e964..9f28d8fc 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs @@ -8,6 +8,7 @@ using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Dtos.TrackTemplate; using SJZY.Track.Domain.Enums; using SJZY.Track.Domain.VEntities; +using SJZY.Expand.ABP.Core.SqlSugar.Tools; namespace SJZY.Track.Repository.Repositories; @@ -225,4 +226,26 @@ public class TrackTemplateRepository : BasicRepository, ITr return templates; } + + public async Task> GetContentByTemplateCodes(string[] codes, int systemId) + { + + var sql = @$" + select + distinct + c.Code + from t_track_template a + left join t_track_template_content b on a.id = b.TrackTemplateId and b.IsDeleted = 0 + left join t_track_content c on b.TrackContentId = c.Id and c.IsDeleted = 0 + where + a.SubSystemId = {systemId} + and a.Code in (@codes) + and a.IsDeleted = 0 + "; + + + var list = Context.Ado.SqlQuery(sql, new {codes = codes}).ToList(); + + return list; + } } From c98e1e7d8a2303fa8d1cad82680f89e5264e82e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Mon, 25 Nov 2024 16:16:42 +0800 Subject: [PATCH 63/75] =?UTF-8?q?update:=20=E3=80=90GetAvailableContent?= =?UTF-8?q?=E3=80=91=E6=8E=A5=E5=8F=A3=E5=8F=8D=E5=8F=82=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E3=80=90=E9=99=84=E4=BB=B6=E6=96=87=E4=BB=B6=E3=80=91=E5=92=8C?= =?UTF-8?q?=E3=80=90=E7=94=A8=E6=88=B7=E6=98=AF=E5=90=A6=E5=8F=AF=E8=A7=81?= =?UTF-8?q?=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackContents/GetAvailableContentOutput.cs | 12 ++++++++++++ .../Services/TrackContents/TrackContentService.cs | 6 ++++++ 2 files changed, 18 insertions(+) diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs index 1102eed6..7af80b7c 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs @@ -1,3 +1,5 @@ +using SJZY.Track.Application.Contract.Dtos.ProvideServices; + namespace SJZY.Track.Application.Contract.Dtos.TrackContents; public class GetAvailableContentOutput @@ -89,4 +91,14 @@ public class GetAvailableContentOutput /// 目的地时区 /// public float? DestinationTimeZone { get; set; } + + /// + /// 附件文件集合 + /// + public List? FileItems { get; set; } + + /// + /// 客户是否可见 + /// + public bool IsVisibility { get; set; } } diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index 996b2f57..c5e23f8d 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -380,6 +380,12 @@ public class TrackContentService : ApplicationService TrackPlaceCityId = matchItem.TrackPlaceCityId, Remarks = matchItem.Remarks, TrackTimeZoneValue = matchItem.DestinationTimeZone, + IsVisibility = matchItem.IsVisibility, + FileItems = matchItem.Files?.Select(x => new FileItemDto + { + FileName = x.FileName, + OssKey = x.OssKey + }).ToList() }); matchContent.AddRange(match); } From ea77583ce41e13c28929b9b5e6b8e5f4110ddb90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Mon, 25 Nov 2024 18:16:42 +0800 Subject: [PATCH 64/75] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E8=BD=A8=E8=BF=B9=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProvideServices/BatchDeleteTrackInput.cs | 4 +- .../Dtos/ProvideServices/DeleteOrderInput.cs | 4 +- .../ProvideServices/TrackIdentifierDto.cs | 21 +++++++++ .../Events/TrackDeleteEvent.cs | 8 ++-- .../EventHandlers/TrackDeleteEventHandler.cs | 43 +++++++++++++++---- .../Services/ProvideServices/TrackService.cs | 24 ++++++++--- .../ITrackDetailsEsRepository.cs | 3 +- .../Dtos/TrackContents/TrackCodeMapVO.cs | 27 ++++++++++++ .../Queries/IProvideQueries.cs | 8 ++++ .../Queries/ProvideQueries.cs | 20 ++++++++- .../Repositories/TrackDetailsEsRepository.cs | 38 +++++++++++++--- 11 files changed, 168 insertions(+), 32 deletions(-) create mode 100644 src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackIdentifierDto.cs create mode 100644 src/SJZY.Track.Domain/Dtos/TrackContents/TrackCodeMapVO.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackInput.cs index 07db4f25..45ccc51c 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackInput.cs @@ -5,9 +5,9 @@ namespace SJZY.Track.Application.Contract.Dtos.ProvideServices; public class BatchDeleteTrackInput : OrderNosInfo { /// - /// 轨迹code,必填 + /// 轨迹标识符集合,必填 /// [Required] [MaxLength(500)] - public List TrackCodes { get; set; } = new(); + public List TrackIdentifiers { get; set; } = new(); } diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs index c70c9b42..de305c57 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs @@ -9,8 +9,8 @@ public class DeleteOrderInput : OrderNoInfo public class DeleteTrackInput : OrderNoInfo { /// - /// 轨迹code + /// 轨迹标识符集合,必填 /// [Required] - public List TrackCodes { get; set; } = new(); + public List TrackIdentifiers { get; set; } = new(); } diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackIdentifierDto.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackIdentifierDto.cs new file mode 100644 index 00000000..993de61c --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackIdentifierDto.cs @@ -0,0 +1,21 @@ +using System.ComponentModel.DataAnnotations; + +namespace SJZY.Track.Application.Contract.Dtos.ProvideServices; + +/// +/// 轨迹标识符,用于唯一标识一个轨迹 +/// +public sealed class TrackIdentifierDto +{ + /// + /// 轨迹code + /// + [Required] + public string TrackCode { get; set; } + + /// + /// 轨迹发生时间 + /// + [Required] + public DateTime TrackTime { get; set; } +} diff --git a/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs index e8072e27..0859de6b 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs @@ -1,3 +1,5 @@ +using SJZY.Track.Application.Contract.Dtos.ProvideServices; + namespace SJZY.Track.Application.Contract.Events; public class TrackDeleteEvent @@ -18,9 +20,9 @@ public class TrackDeleteEvent public int[] OrderIds { get; set; } = null!; /// - /// 轨迹代码 + /// 轨迹标识符 /// - public List TrackCodes { get; set; } = null!; + public List TrackIdentifiers { get; set; } = null!; /// /// 操作人 @@ -40,6 +42,6 @@ public class TrackDeleteEvent public override string ToString() { return $"[TrackDelete by {OperationMan}] SubSystemId: {SubSystemId}, OrderIds: {string.Join(",", - OrderIds)}, TrackCodes: {string.Join(",", TrackCodes)}"; + OrderIds)}, TrackCodes: {string.Join(",", TrackIdentifiers.Select(x=>x.TrackCode))}"; } } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index 288face2..dd4704ca 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -3,6 +3,7 @@ using BSI.Stack.Rabbit; 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.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackContentAggregate; @@ -67,22 +68,29 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe { var nextEvent = @event.DeepCopy(); nextEvent.Visited.AddRange(@event.OrderIds); - nextEvent.TrackCodes = @event.TrackCodes; + nextEvent.TrackIdentifiers = @event.TrackIdentifiers; nextEvent.SubSystemId = group.Key; // 不同子系统需要做内容映射 if (@event.SubSystemId != nextEvent.SubSystemId) { - var mapCodes = await _provideQueries - .MapTrackCodesAsync(@event.SubSystemId, nextEvent.SubSystemId, @event.TrackCodes.ToArray()); + var codeMaps = await _provideQueries + .GetTrackCodeMapsAsync(@event.SubSystemId, nextEvent.SubSystemId, + @event.TrackIdentifiers.Select(x => x.TrackCode).ToArray()); - if (mapCodes.Count == 0) + if (codeMaps.Count == 0) { LogHelper.Warn($"订单跨子系统,未配置内容映射,请联系管理员:{@event}", true); continue; } - nextEvent.TrackCodes = mapCodes; + //映射轨迹code + foreach (var trackIdentity in nextEvent.TrackIdentifiers) + { + var match = codeMaps.FirstOrDefault(x => x.MapTrackContentCode == trackIdentity.TrackCode); + if (match == null) continue; + trackIdentity.TrackCode = match.TrackContentCode; + } } var identifiers = group.Select(x => x.OrderId).ToList(); @@ -172,7 +180,11 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe tracks = await _trackDetailsEsRepository.GetDataByIds(@event.EsIds); orderIds = tracks.Select(m => m.OrderId).Distinct().ToList(); @event.OrderIds = orderIds.ToArray(); - @event.TrackCodes = tracks.Select(x => x.TrackCode).Distinct().ToList(); + @event.TrackIdentifiers = tracks.Select(x => new TrackIdentifierDto + { + TrackCode = x.TrackCode, + TrackTime = x.TrackTime + }).ToList(); // 外部api获取的轨迹不允许删除 if (tracks.Any(m => m.Source == TrackSourceEnum.ExternalServiceProvide.GetHashCode())) @@ -189,11 +201,24 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe } else //原有逻辑,根据轨迹code和订单进行删除 { + var trackCodes = @event.TrackIdentifiers.Select(x => x.TrackCode).ToList(); // 删除轨迹(删的是同子系统下的单,所以code是统一的) - tracks = await _trackDetailsEsRepository.GetLatestListAsync(@event.OrderIds, @event.TrackCodes); + tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds, trackCodes,null); - orderIds = await _trackDetailsEsRepository.DeleteTrackAsync(@event.OrderIds, @event.TrackCodes); - if (orderIds.Count == 0) return tracks; + //构建标识符集合 + var ids = @event.TrackIdentifiers.Select(x => $"{x.TrackCode}{x.TrackTime}").ToList(); + //根据标识符选出要删除的轨迹明细 + var deleteTracks = tracks.Where(x => ids.Contains($"{x.TrackCode}{x.TrackTime}")).ToList(); + + if (deleteTracks.Count == 0) return deleteTracks; + + foreach (var track in deleteTracks) + { + await _trackDetailsEsRepository.DeleteTrackByIdAsync(track.Id, track.IndexName); + } + + orderIds = tracks.Select(m => m.OrderId).Distinct().ToList(); + tracks = deleteTracks; } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index ab931373..8023836a 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -163,8 +163,14 @@ public partial class TrackService : ApplicationService, ITrackService //删除轨迹约束,只要其中有一条来源是外部的就立即返回错误 var tracks = await _trackDetailsEsRepository - .GetListAsync(new[] { orderId }, input.TrackCodes, TrackSourceEnum.ExternalServiceProvide); - if (tracks.Count > 0) + .GetListAsync(new[] { orderId }, + input.TrackIdentifiers.Select(x => x.TrackCode).ToList(), + TrackSourceEnum.ExternalServiceProvide); + + //当要删除的轨迹标识出现交叉则不允许删除 + var intersect = tracks.Select(x => $"{x.TrackCode}{x.TrackTime}") + .Intersect(input.TrackIdentifiers.Select(y => $"{y.TrackCode}{y.TrackTime}")).ToList(); + if (intersect.Count > 0) { throw new BusinessException(message: "存在来源于外部服务商的轨迹,不允许删除"); } @@ -173,7 +179,7 @@ public partial class TrackService : ApplicationService, ITrackService var @event = new TrackDeleteEvent { OrderIds = new[] { orderId }, - TrackCodes = input.TrackCodes, + TrackIdentifiers = input.TrackIdentifiers, SubSystemId = input.SubSystemId, OperationMan = name }; @@ -254,8 +260,14 @@ public partial class TrackService : ApplicationService, ITrackService //删除轨迹约束,只要其中有一条来源是外部的就立即返回错误 var tracks = await _trackDetailsEsRepository - .GetListAsync(orderIds.ToArray(), input.TrackCodes, TrackSourceEnum.ExternalServiceProvide); - if (tracks.Count > 0) + .GetListAsync(orderIds.ToArray(), + input.TrackIdentifiers.Select(x => x.TrackCode).ToList(), + TrackSourceEnum.ExternalServiceProvide); + + //当要删除的轨迹标识出现交叉则不允许删除 + var intersect = tracks.Select(x => $"{x.TrackCode}{x.TrackTime}") + .Intersect(input.TrackIdentifiers.Select(y => $"{y.TrackCode}{y.TrackTime}")).ToList(); + if (intersect.Count > 0) { throw new BusinessException(message: "存在来源于外部服务商的轨迹,不允许删除"); } @@ -264,7 +276,7 @@ public partial class TrackService : ApplicationService, ITrackService var @event = new TrackDeleteEvent { OrderIds = orderIds.ToArray(), - TrackCodes = input.TrackCodes, + TrackIdentifiers = input.TrackIdentifiers, SubSystemId = input.SubSystemId, OperationMan = userInfo.Data.UserName, }; diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs index 482d7142..c57b797b 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs @@ -1,4 +1,5 @@ using SJZY.Expand.ElasticSearch.Services; +using SJZY.Track.Domain.Dtos.TrackContents; using SJZY.Track.Domain.Enums; namespace SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; @@ -23,7 +24,7 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService> GetListAsync(int orderId); - Task> GetListAsync(int[] orderIds, List trackCodes, TrackSourceEnum source); + Task> GetListAsync(int[] orderIds, List trackCodes, TrackSourceEnum? source); Task> DeleteTrackAsync(int[] orderIds, List trackCodes); diff --git a/src/SJZY.Track.Domain/Dtos/TrackContents/TrackCodeMapVO.cs b/src/SJZY.Track.Domain/Dtos/TrackContents/TrackCodeMapVO.cs new file mode 100644 index 00000000..c06fc740 --- /dev/null +++ b/src/SJZY.Track.Domain/Dtos/TrackContents/TrackCodeMapVO.cs @@ -0,0 +1,27 @@ +namespace SJZY.Track.Domain.Dtos.TrackContents; + +/// +/// 轨迹代码映射 +/// +public sealed class TrackCodeMapVO +{ + /// + /// 源子系统id + /// + public int SubSystemId { get; set; } + + /// + /// 源轨迹内容code + /// + public string TrackContentCode { get; set; } = null!; + + /// + /// 映射子系统id + /// + public int MapSubSystemId { get; set; } + + /// + /// 映射轨迹内容code + /// + public string MapTrackContentCode { get; set; } = null!; +} diff --git a/src/SJZY.Track.Domain/Queries/IProvideQueries.cs b/src/SJZY.Track.Domain/Queries/IProvideQueries.cs index 60c0b330..351224c5 100644 --- a/src/SJZY.Track.Domain/Queries/IProvideQueries.cs +++ b/src/SJZY.Track.Domain/Queries/IProvideQueries.cs @@ -18,6 +18,14 @@ public interface IProvideQueries /// Task> MapTrackCodesAsync(int upSubSystemId, int subSystemId, params string[] trackCodes); + /// + /// 获取子系统内容Code映射 + /// + /// + /// + /// + /// + Task> GetTrackCodeMapsAsync(int upSubSystemId, int subSystemId, params string[] trackCodes); /// /// 根据订单模板找对应服务商 /// diff --git a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs index 31855027..8dd6fc96 100644 --- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs +++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs @@ -33,6 +33,22 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen .ToListAsync(); } + public async Task> GetTrackCodeMapsAsync(int upSubSystemId, int subSystemId, params string[] trackCodes) + { + // 根据上游code得到下游code + return await Context.Queryable() + .Where(x => x.SubSystemId == subSystemId && x.MapSubSystemId == upSubSystemId && + trackCodes.Contains(x.MapTrackContentCode)) + .Select(x => new TrackCodeMapVO() + { + SubSystemId = x.SubSystemId, + TrackContentCode = x.TrackContentCode, + MapSubSystemId = x.MapSubSystemId, + MapTrackContentCode = x.MapTrackContentCode + }) + .ToListAsync(); + } + /// public async Task> FindOrderWithServiceProviderAsync(int subSystemId, List orderNos) @@ -46,7 +62,7 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen .Select((a, b, c) => new OrderWithServiceProviderVO { //优先使用第三方的订单号,为空时才使用主单号 - OrderNo = b.OrderNo ?? a.OrderNo, + OrderNo = b.OrderNo.IsNullOrWhiteSpace() ? a.OrderNo : b.OrderNo!, OrderType = a.OrderType, SubSystemId = a.SubSystemId, ServiceProviderCode = b.ServiceProviderCode, @@ -67,7 +83,7 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen .Select((a, b) => new OrderWithServiceProviderVO { //优先使用第三方的订单号,为空时才使用主单号 - OrderNo = b.OrderNo ?? a.OrderNo, + OrderNo = b.OrderNo.IsNullOrWhiteSpace() ? a.OrderNo : b.OrderNo!, OrderType = a.OrderType, SubSystemId = a.SubSystemId, ServiceProviderCode = b.ServiceProviderCode diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index cb62b1b1..346d8c57 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -3,6 +3,7 @@ using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Expand.ElasticSearch.Services; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Consts; +using SJZY.Track.Domain.Dtos.TrackContents; using SJZY.Track.Domain.Enums; namespace SJZY.Track.Repository.Repositories; @@ -75,6 +76,8 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract f.TrackTimeZone) .Field(f => f.OrderId) .Field(f => f.TrackCode) + .Field(f => f.Id) + .Field(f => f.IndexName) )) .Query(q => q .Bool(b => b @@ -99,6 +102,17 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract so .Field(f => f.ZeroTrackTime, SortOrder.Descending) ) + .Source(s2 => s2.Includes(fd2 => fd2 + .Field(f => f.TrackEnContent) + .Field(f => f.TrackContent) + .Field(f => f.TrackPlace) + .Field(f => f.TrackTime) + .Field(f => f.TrackTimeZone) + .Field(f => f.OrderId) + .Field(f => f.TrackCode) + .Field(f => f.Id) + .Field(f => f.IndexName) + )) ) ) ) @@ -343,15 +357,26 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract> GetListAsync(int[] orderIds, List trackCodes, TrackSourceEnum source) + public async Task> GetListAsync(int[] orderIds, List trackCodes, TrackSourceEnum? source) { + var query = new QueryContainer(); + + if (orderIds.Length > 0) + { + query &= Query.Terms(t => t.Field(f => f.OrderId).Terms(orderIds)); + } + if (trackCodes.Count > 0) + { + query &= Query.Terms(t => t.Field(f => f.TrackCode.Suffix("keyword")).Terms(trackCodes)); + } + if (source.HasValue) + { + query &= Query.Term(t => t.Field(f => f.Source).Value(source.Value)); + } + var r = await Context.SearchAsync(x => x .Index(GlobalConst.TrackDetailsIndex) - .Query(q => - q.Terms(t => t.Field(f => f.OrderId).Terms(orderIds)) - && q.Terms(t => t.Field(f => f.TrackCode.Suffix("keyword")).Terms(trackCodes)) - && q.Term(t => t.Source, (int) source) - ) + .Query(q => query) .Size(SafelyLimit) .Sort(s => s.Field(f => f.ZeroTrackTime, SortOrder.Descending))); @@ -474,5 +499,4 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract Date: Tue, 26 Nov 2024 09:29:09 +0800 Subject: [PATCH 65/75] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DSqlSugar?= =?UTF-8?q?=E4=B8=8D=E6=94=AF=E6=8C=81b.OrderNo.IsNullOrWhiteSpace?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SJZY.Track.Repository/Queries/ProvideQueries.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs index 8dd6fc96..b59a308d 100644 --- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs +++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs @@ -35,7 +35,7 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen public async Task> GetTrackCodeMapsAsync(int upSubSystemId, int subSystemId, params string[] trackCodes) { - // 根据上游code得到下游code + // 根据上游code得到下游code return await Context.Queryable() .Where(x => x.SubSystemId == subSystemId && x.MapSubSystemId == upSubSystemId && trackCodes.Contains(x.MapTrackContentCode)) @@ -62,7 +62,7 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen .Select((a, b, c) => new OrderWithServiceProviderVO { //优先使用第三方的订单号,为空时才使用主单号 - OrderNo = b.OrderNo.IsNullOrWhiteSpace() ? a.OrderNo : b.OrderNo!, + OrderNo = b.OrderNo ?? a.OrderNo, OrderType = a.OrderType, SubSystemId = a.SubSystemId, ServiceProviderCode = b.ServiceProviderCode, @@ -83,7 +83,7 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen .Select((a, b) => new OrderWithServiceProviderVO { //优先使用第三方的订单号,为空时才使用主单号 - OrderNo = b.OrderNo.IsNullOrWhiteSpace() ? a.OrderNo : b.OrderNo!, + OrderNo = b.OrderNo ?? a.OrderNo, OrderType = a.OrderType, SubSystemId = a.SubSystemId, ServiceProviderCode = b.ServiceProviderCode From 9c495a4db890707a4727d3fc3a3f1972fb7af7dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Tue, 26 Nov 2024 10:10:16 +0800 Subject: [PATCH 66/75] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E3=80=90?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E6=9B=B4=E6=96=B0=E8=BD=A8=E8=BF=B9=E3=80=91?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E6=9B=B4=E6=96=B0=E8=BD=A8=E8=BF=B9=E6=97=B6?= =?UTF-8?q?=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ProvideServices/TrackService.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 8023836a..59cee586 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -392,6 +392,7 @@ public partial class TrackService : ApplicationService, ITrackService TrackCode = input.TrackCode, TrackPlace = input.TrackPlace, TrackTime = input.TrackTime, + NewTrackTime = input.NewTrackTime, TrackTimeZone = input.TrackTimeZone, OperationMan = userInfo.Data.UserName, OperationManId = userInfo.Data.UserId, From e130e491f79211a2e56779d2f00b216afe6e6d19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Tue, 26 Nov 2024 10:35:54 +0800 Subject: [PATCH 67/75] =?UTF-8?q?update:=20=E3=80=90=E6=96=B0=E5=A2=9E/?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=BD=A8=E8=BF=B9=E3=80=91=E8=A7=A3=E9=99=A4?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E5=8F=91=E7=94=9F=E6=97=B6=E9=97=B4=E7=9A=84?= =?UTF-8?q?=E8=8C=83=E5=9B=B4=E5=92=8C=E5=BF=85=E5=A1=AB=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/ProvideServices/BatchUpsertTrackInput.cs | 4 ++-- .../Dtos/ProvideServices/UpsertTrackInput.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs index d5767cd5..b5a73ed3 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs @@ -37,8 +37,8 @@ public class BatchUpsertTrackInput : OrderNosInfo /// /// 轨迹发生时区 /// - [Required] - [Range(-12, 12)] + // [Required] + // [Range(-12, 12)] public float TrackTimeZone { get; set; } /// diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs index 2ba86e87..2b34f832 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs @@ -37,8 +37,8 @@ public class UpsertTrackInput : OrderNoInfo /// /// 轨迹发生时区 /// - [Required] - [Range(-12, 12)] + // [Required] + // [Range(-12, 12)] public float? TrackTimeZone { get; set; } /// From 2eb7ae9047f3534d912b76a0f9bab52d790a28c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Tue, 26 Nov 2024 11:03:04 +0800 Subject: [PATCH 68/75] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E8=BD=A8=E8=BF=B9=E5=90=8E=E8=AE=A2=E5=8D=95=E4=B8=BB?= =?UTF-8?q?=E8=A1=A8=E8=BF=9B=E8=A1=8C=E5=9B=9E=E9=80=80=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=EF=BC=8C=E6=9B=B4=E6=96=B0=E5=80=BC=E4=B8=BA=E8=A2=AB=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E7=9A=84=E8=BD=A8=E8=BF=B9=E5=86=85=E5=AE=B9=EF=BC=8C?= =?UTF-8?q?=E6=9B=B4=E6=94=B9=E4=B8=BA=E5=BD=93=E5=89=8D=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E7=9A=84=E6=9C=80=E6=96=B0=E8=BD=A8=E8=BF=B9=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackDeleteEventHandler.cs | 17 ++++++++++------- .../ITrackDetailsEsRepository.cs | 2 +- .../Repositories/TrackDetailsEsRepository.cs | 6 ++++-- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index dd4704ca..08e079d6 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -201,9 +201,8 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe } else //原有逻辑,根据轨迹code和订单进行删除 { - var trackCodes = @event.TrackIdentifiers.Select(x => x.TrackCode).ToList(); - // 删除轨迹(删的是同子系统下的单,所以code是统一的) - tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds, trackCodes,null); + //根据订单查询出所有的轨迹,查所有是因为主单上需要进行回退更新 + tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds); //构建标识符集合 var ids = @event.TrackIdentifiers.Select(x => $"{x.TrackCode}{x.TrackTime}").ToList(); @@ -217,8 +216,10 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe await _trackDetailsEsRepository.DeleteTrackByIdAsync(track.Id, track.IndexName); } - orderIds = tracks.Select(m => m.OrderId).Distinct().ToList(); - tracks = deleteTracks; + //从被删除轨迹寻找订单id,稍后会更新订单主表 + orderIds = deleteTracks.Select(m => m.OrderId).Distinct().ToList(); + //排除掉已经删除的轨迹 + tracks = tracks.Except(deleteTracks).ToList(); } @@ -236,7 +237,9 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe foreach (var order in orders) { - var track = tracks.FirstOrDefault(x => x.OrderId == order.Id); + //找到最新的轨迹数据 + var track = tracks?.OrderByDescending(x=>x.TrackTime) + .FirstOrDefault(x => x.OrderId == order.Id); // 删除全部轨迹导致的重置行为 if (track == default) @@ -264,7 +267,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe OrderId = order.Id, OrderNo = order.OrderNo, OptionType = OrderOperationType.删除轨迹.ToString(), - Content = tracks?.Where(m => m.OrderId == order.Id)?.ToList().ToJson(), + Content = tracks?.Where(m => m.OrderId == order.Id).ToList().ToJson(), CreateUserId = @event.OperationManId, CreateUserName = @event.OperationMan ?? "", CreateTime = DateTime.Now diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs index c57b797b..bf5e3af3 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs @@ -24,7 +24,7 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService> GetListAsync(int orderId); - Task> GetListAsync(int[] orderIds, List trackCodes, TrackSourceEnum? source); + Task> GetListAsync(int[] orderIds, List? trackCodes = null, TrackSourceEnum? source = null); Task> DeleteTrackAsync(int[] orderIds, List trackCodes); diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index 346d8c57..e4dbd518 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -357,7 +357,7 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract> GetListAsync(int[] orderIds, List trackCodes, TrackSourceEnum? source) + public async Task> GetListAsync(int[] orderIds, List? trackCodes = null, TrackSourceEnum? source = null) { var query = new QueryContainer(); @@ -365,10 +365,12 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract.Terms(t => t.Field(f => f.OrderId).Terms(orderIds)); } - if (trackCodes.Count > 0) + + if (trackCodes != null && trackCodes.Count > 0) { query &= Query.Terms(t => t.Field(f => f.TrackCode.Suffix("keyword")).Terms(trackCodes)); } + if (source.HasValue) { query &= Query.Term(t => t.Field(f => f.Source).Value(source.Value)); From e89eeb15034c3c34ba9833f3be130d944f10a355 Mon Sep 17 00:00:00 2001 From: eli Date: Tue, 26 Nov 2024 14:45:43 +0800 Subject: [PATCH 69/75] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E5=AE=A2=E6=88=B7id?= =?UTF-8?q?=E7=9A=84=E5=BF=85=E5=A1=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/ProvideServices/UpsertOrderInput.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertOrderInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertOrderInput.cs index cfdbe0ac..1214f51d 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertOrderInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertOrderInput.cs @@ -7,8 +7,6 @@ public class UpsertOrderInput : UpdateOrderInput /// /// 客户id /// - [Required] - [Range(1, int.MaxValue)] public int CustomId { get; set; } /// From 9b663fad0402110df6fd26869820430fae2a46d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Tue, 26 Nov 2024 15:44:10 +0800 Subject: [PATCH 70/75] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E6=9B=B4=E6=96=B0=E8=BD=A8=E8=BF=B9=E6=97=B6=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=86=85=E5=AE=B9=E9=83=BD=E4=B8=BA=E5=90=8C=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=95=B0=E6=8D=AE=EF=BC=8C=E7=94=B1=E4=BA=8E=E5=85=B3?= =?UTF-8?q?=E8=81=94=E7=9A=84=E8=BD=A8=E8=BF=B9=E5=8F=AF=E8=83=BD=E6=98=AF?= =?UTF-8?q?=E5=A4=96=E9=83=A8=E8=BD=A8=E8=BF=B9=EF=BC=8C=E6=9F=90=E4=BA=9B?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E4=B8=8D=E8=83=BD=E6=9B=B4=E6=96=B0=E5=90=8C?= =?UTF-8?q?=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repositories/TrackDetailsEsRepository.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index e4dbd518..8cbd290f 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -183,6 +183,7 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract indexes, int maxRetries = 3) { var retryCount = 0; From f333ef0ea230607179efc001cc73cb42a3aff882 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Tue, 26 Nov 2024 16:05:58 +0800 Subject: [PATCH 71/75] =?UTF-8?q?update:=20=E8=B0=83=E6=95=B4=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=9B=B4=E6=96=B0=E4=B8=BA=E9=80=90=E6=9D=A1=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CAP/EventHandlers/TrackUpsertEventHandler.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index eba60623..8b067c6e 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -199,6 +199,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe return default; } + //#7001:未来潜在需求,当轨迹内容匹配预设,记录一个标记,保证下刷过程都是使用预设内衣 //虽然在引发事件之前做了判断,引发之后并不一定立即处理,在此过程中轨迹内容仍然可能被修改,所以要二次进行判断。 //通过来源指示是否为手动操作 var manualOperation = @event.Source == (int) TrackSourceEnum.Artificial; @@ -275,7 +276,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe var orderIds = @event.OrderIdentifiers.Select(x => x.OrderId).ToArray(); // important:轨迹code相同,时间、发生地不同的,可能存在多条!! - var tracks = await _trackDetailsEsRepository.GetListAsync(orderIds, @event.TrackCode, true); + var tracks = await _trackDetailsEsRepository.GetListAsync(orderIds, @event.TrackCode, false); var insertTracks = new List(); var updateTracks = new List(); @@ -355,6 +356,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe //来源轨迹内容,第一次新增的时候使用轨迹内容表提供的 TrackStatus = trackContent.TrackStatus, TrackStatusCode = trackContent.TrackStatusCode, + //跨子系统? TrackContent = @event.Content ?? trackContent.TrackContent, TrackEnContent = @event.EnStatus ?? trackContent.TrackEnContent, //S06新增轨迹明细字段 @@ -411,6 +413,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe track.UpdateTime = DateTime.Now; //允许二次修改,在修改了轨迹内容后进行修改轨迹操作,如果输入的轨迹内容则以输入为准 + //跨子系统? track.TrackContent = @event.Content ?? trackContent.TrackContent; track.TrackEnContent = @event.EnStatus ?? trackContent.TrackEnContent; //S06新增 @@ -451,6 +454,11 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe if (updateTracks.Any()) { + //逐条更新 + foreach (var track in updateTracks) + { + await _trackDetailsEsRepository.UpdateAsync(track); + } await _trackDetailsEsRepository.UpdateManyAsync(updateTracks); } From faa7b6cd7ef9e3c2aec9e69605ddd223a8e47ba1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Wed, 27 Nov 2024 09:41:04 +0800 Subject: [PATCH 72/75] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E6=9B=B4=E6=96=B0bug=EF=BC=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=BAbulkApi=E7=9A=84=E6=96=B9=E5=BC=8F=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update: 获取时间轴数据,更新轨迹内容为空的轨迹 --- .../EventHandlers/TrackUpsertEventHandler.cs | 9 +-- .../Services/TrackOrders/TrackOrderService.cs | 2 + .../ITrackDetailsEsRepository.cs | 2 + .../Repositories/TrackDetailsEsRepository.cs | 80 +++++++++++++++++++ 4 files changed, 86 insertions(+), 7 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 8b067c6e..c26118a3 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -298,7 +298,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe track = existTracks.FirstOrDefault(); if (track == null) continue; // 不存在不让改 - } else { @@ -454,12 +453,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe if (updateTracks.Any()) { - //逐条更新 - foreach (var track in updateTracks) - { - await _trackDetailsEsRepository.UpdateAsync(track); - } - await _trackDetailsEsRepository.UpdateManyAsync(updateTracks); + //批量差异化更新轨迹 + await _trackDetailsEsRepository.BulkUpdateAsync(updateTracks); } return insertTracks; diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index 18df3b65..2d856921 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -195,6 +195,8 @@ public class TrackOrderService : ApplicationService return new UnifyResultDto>(false, "未找到指定id的子系统"); var trackDetails = await _trackDetailsEsRepository.GetListAsync(order.Id); + //时间轴不显示轨迹内容为空的轨迹,进行过滤 + trackDetails = trackDetails.Where(x => !x.TrackContent.IsNullOrWhiteSpace() && x.TrackContent != GlobalConst.EmptyString).ToList(); res.Data = new List(); foreach (var item in trackDetails) diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs index bf5e3af3..6f182653 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs @@ -18,6 +18,8 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService indexes, int maxRetries = 3); + Task BulkUpdateAsync(List indexes, int maxRetries = 3); + Task AddManyAsync(List index); Task AddAsync(TrackDetailsIndex track); diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index 8cbd290f..69ec223a 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -265,6 +265,86 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract indexes, int maxRetries = 3) + { + if (indexes.Count == 0) return; + + //构建批量更新操作描述符 + var desc = new BulkDescriptor(GlobalConst.TrackDetailsIndex); + foreach (var track in indexes) + { + desc = desc.AddOperation(new BulkUpdateDescriptor() + .Id(track.Id) + .Index(track.IndexName) + .Script(s => s.Source(@" + ctx._source.trackPlace = params.trackPlace; + ctx._source.trackTime = params.trackTime; + ctx._source.trackTimeZone = params.trackTimeZone; + ctx._source.updateUser = params.updateUser; + ctx._source.updateTime = params.updateTime; + ctx._source.trackContent = params.trackContent; + ctx._source.trackEnContent = params.trackEnContent; + ctx._source.isVisibility = params.isVisibility; + ctx._source.remarks = params.remarks; + ctx._source.files = params.files; + ctx._source.trackPlaceCity = params.trackPlaceCity; + ctx._source.trackPlaceCityId = params.trackPlaceCityId; + ctx._source.trackPlaceProvince = params.trackPlaceProvince; + ctx._source.trackPlaceProvinceId = params.trackPlaceProvinceId; + ctx._source.trackPlaceNation = params.trackPlaceNation; + ctx._source.trackPlaceNationId = params.trackPlaceNationId; + ctx._source.trackPlacePostcode = params.trackPlacePostcode; + ctx._source.destinationTimeZone = params.destinationTimeZone; + ctx._source.estimatedDeliveryDate = params.estimatedDeliveryDate; + ").Params(p => p + .Add("trackPlace", track.TrackPlace) + .Add("trackTime", track.TrackTime) + .Add("trackTimeZone", track.TrackTimeZone) + .Add("updateUser", track.UpdateUser) + .Add("updateTime", DateTime.Now) + //S06新增字段更新 + .Add("trackContent", track.TrackContent) + .Add("trackEnContent", track.TrackEnContent) + .Add("isVisibility", track.IsVisibility) + .Add("remarks", track.Remarks) + .Add("files", track.Files) + .Add("trackPlaceCity", track.TrackPlaceCity) + .Add("trackPlaceCityId", track.TrackPlaceCityId) + .Add("trackPlaceProvince", track.TrackPlaceProvince) + .Add("trackPlaceProvinceId", track.TrackPlaceProvinceId) + .Add("trackPlaceNation", track.TrackPlaceNation) + .Add("trackPlaceNationId", track.TrackPlaceNationId) + .Add("trackPlacePostcode", track.TrackPlacePostcode) + .Add("destinationTimeZone", track.DestinationTimeZone) + .Add("estimatedDeliveryDate", track.EstimatedDeliveryDate)) + )); + } + + var retryCount = 0; + var updateSuccessful = false; + while (retryCount < maxRetries && !updateSuccessful) + { + var response = await Context.BulkAsync(desc); + if (response.IsValid) + { + updateSuccessful = true; + } + else if (response.ServerError?.Status == 409) // 409 表示版本冲突 + { + retryCount++; + if (retryCount >= maxRetries) + { + throw new InvalidOperationException( + $"轨迹更新冲突达到最大次数,track:{indexes.Count}条,原因:{response.DebugInformation}。"); + } + } + else + { + throw new InvalidOperationException($"轨迹更新失败,track:{indexes.Count}条,原因:{response.DebugInformation}。"); + } + } + } + public async Task AddManyAsync(List tracks) { // 按天写入es From 6aee0d60d437b96ff3fe49b30853c750c81a6c46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Wed, 27 Nov 2024 10:07:21 +0800 Subject: [PATCH 73/75] =?UTF-8?q?update:=20=E4=BC=98=E5=8C=96BulkApi?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repositories/TrackDetailsEsRepository.cs | 55 +++++++++---------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index 69ec223a..246cfa7e 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -270,13 +270,11 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract() - .Id(track.Id) - .Index(track.IndexName) - .Script(s => s.Source(@" + var desc = new BulkDescriptor().UpdateMany(indexes, + (u, track) => + u.Id(track.Id) + .Index(track.IndexName) + .Script(s => s.Source(@" ctx._source.trackPlace = params.trackPlace; ctx._source.trackTime = params.trackTime; ctx._source.trackTimeZone = params.trackTimeZone; @@ -297,28 +295,27 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract p - .Add("trackPlace", track.TrackPlace) - .Add("trackTime", track.TrackTime) - .Add("trackTimeZone", track.TrackTimeZone) - .Add("updateUser", track.UpdateUser) - .Add("updateTime", DateTime.Now) - //S06新增字段更新 - .Add("trackContent", track.TrackContent) - .Add("trackEnContent", track.TrackEnContent) - .Add("isVisibility", track.IsVisibility) - .Add("remarks", track.Remarks) - .Add("files", track.Files) - .Add("trackPlaceCity", track.TrackPlaceCity) - .Add("trackPlaceCityId", track.TrackPlaceCityId) - .Add("trackPlaceProvince", track.TrackPlaceProvince) - .Add("trackPlaceProvinceId", track.TrackPlaceProvinceId) - .Add("trackPlaceNation", track.TrackPlaceNation) - .Add("trackPlaceNationId", track.TrackPlaceNationId) - .Add("trackPlacePostcode", track.TrackPlacePostcode) - .Add("destinationTimeZone", track.DestinationTimeZone) - .Add("estimatedDeliveryDate", track.EstimatedDeliveryDate)) - )); - } + .Add("trackPlace", track.TrackPlace) + .Add("trackTime", track.TrackTime) + .Add("trackTimeZone", track.TrackTimeZone) + .Add("updateUser", track.UpdateUser) + .Add("updateTime", DateTime.Now) + //S06新增字段更新 + .Add("trackContent", track.TrackContent) + .Add("trackEnContent", track.TrackEnContent) + .Add("isVisibility", track.IsVisibility) + .Add("remarks", track.Remarks) + .Add("files", track.Files) + .Add("trackPlaceCity", track.TrackPlaceCity) + .Add("trackPlaceCityId", track.TrackPlaceCityId) + .Add("trackPlaceProvince", track.TrackPlaceProvince) + .Add("trackPlaceProvinceId", track.TrackPlaceProvinceId) + .Add("trackPlaceNation", track.TrackPlaceNation) + .Add("trackPlaceNationId", track.TrackPlaceNationId) + .Add("trackPlacePostcode", track.TrackPlacePostcode) + .Add("destinationTimeZone", track.DestinationTimeZone) + .Add("estimatedDeliveryDate", track.EstimatedDeliveryDate)) + )); var retryCount = 0; var updateSuccessful = false; From c3bd1074d6c5877821226d9f4a9f65ee395a9ac9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Wed, 27 Nov 2024 11:52:48 +0800 Subject: [PATCH 74/75] =?UTF-8?q?update=EF=BC=9A=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ProvideServices/OrderService.cs | 2 +- .../Services/ProvideServices/TrackService.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs index c41d28c2..8bf60542 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs @@ -40,7 +40,7 @@ public partial class OrderService : ApplicationService, IOrderService if ((input.EstimatedDeliveryDate.HasValue && input.DestinationTimeZone.HasValue == false) || (input.EstimatedDeliveryDate.HasValue == false && input.DestinationTimeZone.HasValue)) { - throw new BusinessException(message: "【目的地时区】和【预计到达时间】必须同时输入"); + throw new BusinessException(message: "【预计签收时间】和【签收地时区】必须同时输入"); } var currentUser = CurrentUserRequest.CurrentUser; diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 59cee586..4e0322a3 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -68,7 +68,7 @@ public partial class TrackService : ApplicationService, ITrackService if ((input.EstimatedDeliveryDate.HasValue == false && input.DestinationTimeZone.HasValue) || (input.EstimatedDeliveryDate.HasValue && input.DestinationTimeZone.HasValue == false)) { - throw new BusinessException(message: "【目的地时区】和【预计到达时间】必须同时输入"); + throw new BusinessException(message: "【预计签收时间】和【签收地时区】必须同时输入"); } //当修改时,如果为来源为外部提供商则不允许修改 @@ -334,7 +334,7 @@ public partial class TrackService : ApplicationService, ITrackService if ((input.EstimatedDeliveryDate.HasValue == false && input.DestinationTimeZone.HasValue) || (input.EstimatedDeliveryDate.HasValue && input.DestinationTimeZone.HasValue == false)) { - throw new BusinessException(message: "【目的地时区】和【预计到达时间】必须同时输入"); + throw new BusinessException(message: "【预计签收时间】和【签收地时区】必须同时输入"); } var trackContent = await _trackContentRepository.GetByCodeAsync(input.SubSystemId, input.TrackCode); From 52b94299962d7b770fa858e5960cb9e85da51d1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Wed, 27 Nov 2024 15:27:16 +0800 Subject: [PATCH 75/75] =?UTF-8?q?update:=20=E8=8E=B7=E5=8F=96=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E8=BD=B4=E8=BD=A8=E8=BF=B9=E6=8E=92=E5=BA=8F=E5=8F=82?= =?UTF-8?q?=E7=85=A7=EF=BC=8C=E9=BB=98=E8=AE=A4=E4=BB=A5=E3=80=90=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E5=8F=91=E7=94=9F=E6=97=B6=E9=97=B4=E3=80=91=E5=8F=82?= =?UTF-8?q?=E8=80=83=E6=8E=92=E5=BA=8F=EF=BC=8C=E8=8B=A5=E3=80=90=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E5=8F=91=E7=94=9F=E6=97=B6=E9=97=B4=E3=80=91=E5=92=8C?= =?UTF-8?q?=E3=80=90=E5=8F=91=E7=94=9F=E6=97=B6=E5=8C=BA=E3=80=91=E4=BB=BB?= =?UTF-8?q?=E4=B8=80=E4=B8=BA=E7=A9=BA=E5=88=99=E4=BB=A5=E3=80=90=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E6=97=B6=E9=97=B4=E3=80=91=E4=B8=BA=E5=8F=82=E8=80=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TrackOrders/TrackOrderService.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index 2d856921..75806f9e 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -205,13 +205,18 @@ public class TrackOrderService : ApplicationService if (system.SystemProperty == 2 && !item.IsVisibility) continue; + //时间和时区任意一个为空则使用创建时间做为排序参照值 + var timeTick = ToUnixTimestamp((item.TrackTime == null + || Math.Abs(item.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1) + ? item.CreateTime + : item.TrackTime); res.Data.Add(new GetDetailTimelineOutput() { IsHighlight = true, IsShowHover = true, Remark = item.Remarks == null || item.Remarks == "--" ? "" : item.Remarks, TrackTimeZone = $"GMT{(item.TrackTimeZone >= 0 ? "+" : "-")}{GetTimeZoneStr(item.TrackTimeZone)}", - TrackTime = ToUnixTimestamp(item.TrackTime), + TrackTime = timeTick, TrackPlace = item.TrackPlace, EnContent = item.TrackEnContent, Files = item.Files == null @@ -231,7 +236,7 @@ public class TrackOrderService : ApplicationService } // 按轨迹发生时间正序排序 - res.Data = res.Data?.OrderBy(m => m.TrackTime).ToList(); + res.Data = res.Data.OrderBy(m => m.TrackTime).ToList(); if (!order.IsCompleted) //如果没完结则显示签收节点 {