From 67056b14e72d957b9fa4c0bf7040df274222bf68 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Tue, 17 Dec 2024 16:43:53 +0800 Subject: [PATCH 01/80] =?UTF-8?q?add:=20=E5=A5=91=E7=BA=A6=E5=B1=82?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=89=B9=E9=87=8F=E6=9B=B4=E6=96=B0=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=8E=A5=E5=8F=A3=EF=BC=8C=E7=94=A8=E4=BA=8E=E5=A4=96?= =?UTF-8?q?=E9=83=A8=E6=8E=A5=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ProvideServices/ITrackService.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackService.cs b/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackService.cs index 8cafa4b1..c5fd0430 100644 --- a/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackService.cs +++ b/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackService.cs @@ -12,6 +12,13 @@ public interface ITrackService : IRemoteService /// Task UpsertTrackAsync(UpsertTrackInput input); + /// + /// 批量新增/更新订单轨迹接口 + /// + /// + /// + Task BatchUpsertTrackAsync(BatchUpsertTrackInput input); + /// /// 删除轨迹 /// From eee75e526157d1cc7fafbf91492fdc69c73ed9ca Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Tue, 17 Dec 2024 16:55:52 +0800 Subject: [PATCH 02/80] =?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?=E8=AE=A2=E5=8D=95=E4=B8=BB=E8=A1=A8=E5=9B=9E=E9=80=80=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=A4=B1=E8=B4=A5=20update:=20=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BF=AE=E6=94=B9=E5=A4=84=E7=90=86=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=89=A9=E5=B1=95=E5=AD=97=E6=AE=B5=E5=AD=98=E5=82=A8?= =?UTF-8?q?=20update-models:=20=20-=20=E5=A2=9E=E5=8A=A0=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=EF=BC=8C=E6=B6=89=E5=8F=8A=E3=80=90=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=8E=A8=E9=80=81=E3=80=91=E3=80=90=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E5=8F=98=E6=9B=B4=E3=80=91=20=20-=20=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E9=80=9A=E9=85=8D=E7=BD=AE=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=AD=97=E6=AE=B5=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E6=8E=A5=E5=8F=A3Id=EF=BC=8C=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=8E=A8=E9=80=81=E5=86=85=E5=AE=B9=E9=A1=B9=E5=88=AB?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/ProvideServices/GetTrackOutput.cs | 1 - .../Dtos/TrackPush/TrackPushInput.cs | 6 +- .../Events/TrackChangeEto.cs | 5 + .../Events/TrackPushEto.cs | 159 ++++++++++++++++++ .../Events/TrackPushEvent.cs | 5 + .../EventHandlers/TrackDeleteEventHandler.cs | 3 +- .../InterfaceRelayParamsConfigOptions.cs | 10 ++ .../Enums/TrackSourceEnum.cs | 12 +- 8 files changed, 191 insertions(+), 10 deletions(-) create mode 100644 src/SJZY.Track.Application.Contract/Events/TrackPushEto.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs index 7af8aabd..59a4065e 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs @@ -91,7 +91,6 @@ public class TrackDetail /// public string? TrackPlacePostcode { get; set; } - /// /// 预计到达时间 /// diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs index 45047f0a..e650d04a 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs @@ -4,7 +4,8 @@ public class TrackPushInput { public string OrderNo { get; set; } = null!; - public List Data { get; set; } = new(); + //原TrackItem,为了扩展字段入参变更为字典 + public List> Data { get; set; } = new(); public string Log { get; set; } } @@ -13,7 +14,8 @@ public class TrackUpdateInput { public string OrderNo { get; set; } = null!; - public List Data { get; set; } = new(); + //原TrackItem,为了扩展字段入参变更为字典 + public List> Data { get; set; } = new(); public string Log { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs b/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs index f2eb4fe9..5f49e9ff 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs @@ -128,4 +128,9 @@ public class TrackChangeEto /// 预计到达时间 /// public DateTime? EstimatedDeliveryDate { get; set; } + + /// + /// 扩展信息字段,用与轨迹推送的附加字段 + /// + public Dictionary? Extra { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushEto.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushEto.cs new file mode 100644 index 00000000..3c7bdffd --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Events/TrackPushEto.cs @@ -0,0 +1,159 @@ +using SJZY.Track.Application.Contract.Dtos.ProvideServices; + +namespace SJZY.Track.Application.Contract.Events; + +/// +/// 轨迹推送广播模型 +/// +public class TrackPushEto +{ + /// + /// 是否新增 + /// + public OptionType Option { get; set; } + + /// + /// 是否为手动推送 + /// + public bool IsManualPush { get; set; } + + /// + /// 推送是否失败 + /// + public bool IsFailure { get; set; } + + /// + /// 失败原因 + /// + public string? FailureReason { get; set; } + + /// + /// 推送时间 + /// + public DateTime PushTime { get; set; } + + /// + /// 操作人 + /// + public string? OperationMan { get; set; } + + /// + /// 子系统id + /// + public int SubSystemId { get; set; } + + /// + /// 单号 + /// + public string OrderNo { get; set; } + + /// + /// 客户id + /// + public int CustomId { get; set; } + + /// + /// 订单id + /// + public OrderIdentifier[] OrderIdentifiers { get; set; } = null!; + + /// + /// 轨迹内容代码 + /// + 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; } + + /// + /// 轨迹发生地(城市)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 Dictionary? Extra { get; set; } +} diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs index 2bc5760c..ea168d9d 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs @@ -69,4 +69,9 @@ public struct SystemPushStruct /// 轨迹发生时区 /// public float TrackTimeZone { get; set; } + + /// + /// 扩展信息字段,用与轨迹推送的附加字段 + /// + public Dictionary? Extra { get; set; } } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index e9db1cfa..038f9499 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -225,7 +225,8 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe } //排除掉已经删除的轨迹 - tracks = tracks.Except(deleteTracks).ToList(); + var deleteTrackIds = deleteTracks.Select(m => m.Id).ToList(); + tracks = tracks.Where(x => !deleteTrackIds.Contains(x.Id)).ToList(); var orders = await _orderRepository.GetListAsync(x => orderIds.Contains(x.Id), x => new OrderEntity diff --git a/src/SJZY.Track.Application/Options/InterfaceRelayParamsConfigOptions.cs b/src/SJZY.Track.Application/Options/InterfaceRelayParamsConfigOptions.cs index 59a6ab9c..e2a3d78e 100644 --- a/src/SJZY.Track.Application/Options/InterfaceRelayParamsConfigOptions.cs +++ b/src/SJZY.Track.Application/Options/InterfaceRelayParamsConfigOptions.cs @@ -57,6 +57,16 @@ public class InterfaceRelayParamsConfigOptions /// public string PushTrackInterfaceCode { get; set; } + /// + /// 推送轨迹接口Id + /// + public int PushTrackInterfaceId { get; set; } + + /// + /// 推送轨迹接口 内容项 参数别名前缀 + /// + public string PushTrackItemParamAliasPrefix { get; set; } + /// /// 更新轨迹接口代码 /// diff --git a/src/SJZY.Track.Domain/Enums/TrackSourceEnum.cs b/src/SJZY.Track.Domain/Enums/TrackSourceEnum.cs index 021616af..a0107979 100644 --- a/src/SJZY.Track.Domain/Enums/TrackSourceEnum.cs +++ b/src/SJZY.Track.Domain/Enums/TrackSourceEnum.cs @@ -8,17 +8,17 @@ namespace SJZY.Track.Domain.Enums; public enum TrackSourceEnum { /// - /// 外部服务商创建 + /// 外部服务商 /// - [Description("外部服务商创建")] ExternalServiceProvide = 1, + [Description("外部服务商")] ExternalServiceProvide = 1, /// - /// 内部系统创建 + /// 内部系统 /// - [Description("内部系统创建")] InternalService = 2, + [Description("内部系统")] InternalService = 2, /// - /// 人工创建 + /// 人工 /// - [Description("人工创建")] Artificial = 3, + [Description("人工")] Artificial = 3, } From 67a7d64b6c06371351d57000f751bbb45ce34eac Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Tue, 17 Dec 2024 16:58:01 +0800 Subject: [PATCH 03/80] =?UTF-8?q?update:=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 --- .../CAP/EventHandlers/TrackUpsertEventHandler.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 1b6ee76f..1d57d01e 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -6,7 +6,6 @@ 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; @@ -93,7 +92,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe OperationMan = eto.OperationMan, OrderIdentifiers = eto.OrderIdentifiers, CustomId = eto.CustomId, - SubSystemId = eto.SubSystemId + SubSystemId = eto.SubSystemId, + Extra = eto.Extra }; if (eto.IsAdd) @@ -262,7 +262,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackContent = trackContent.TrackContent, TrackPlace = @event.TrackPlace, TrackTime = @event.NewTrackTime ?? @event.TrackTime, - TrackTimeZone = @event.TrackTimeZone + TrackTimeZone = @event.TrackTimeZone, + Extra = @event.Extra } }; await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, trackPushEvent); From 178dca47d08d19b323571f1cfa4f788c8b994987 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Tue, 17 Dec 2024 17:26:11 +0800 Subject: [PATCH 04/80] =?UTF-8?q?update:=E6=9B=B4=E6=96=B0=E5=A5=91?= =?UTF-8?q?=E7=BA=A6=E5=8C=85=E7=89=88=E6=9C=AC7.0.3=3D>7.0.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SJZY.Track.Application.Contract.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj index b70c8550..f8a1ce47 100644 --- a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj +++ b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj @@ -5,7 +5,7 @@ net7.0 True - 7.0.3 + 7.0.5 True From 6ece015f0daae8f009b8548be858248861f3403d Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Tue, 17 Dec 2024 17:50:53 +0800 Subject: [PATCH 05/80] =?UTF-8?q?update:=20=E8=BD=A8=E8=BF=B9=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E5=A2=9E=E5=8A=A0=E6=89=A9=E5=B1=95=E5=8F=82=E6=95=B0?= =?UTF-8?q?=20update:=20=E8=BD=A8=E8=BF=B9=E6=8E=A8=E9=80=81=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E9=80=9A=E5=9B=9E=E8=B0=83=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E5=9B=9E=E4=BC=A0=E8=BD=A8=E8=BF=B9=E5=B9=BF?= =?UTF-8?q?=E6=92=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackPushEventHandler.cs | 137 ++++++++++++++---- .../Rabbit/TrackPushCompletedEventHandler.cs | 96 +++++++++++- .../Consts/GlobalConst.MQ.cs | 5 +- 3 files changed, 204 insertions(+), 34 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 0ef48ef3..0bb18a1e 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -72,23 +72,26 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe case OptionType.无: return; case OptionType.新增: - await DoPushAsync(@event); + //获取接口参数名称,稍后将用于轨迹扩展字段提取填充请求 + var paramsNames1 = await GetExtraParamNamesAsync(@event.SubSystemCode); + await DoPushAsync(@event, paramsNames1); break; case OptionType.删除: break; case OptionType.修改: - await DoUpdateAsync(@event); + //获取接口参数名称,稍后将用于轨迹扩展字段提取填充请求 + var paramsNames2 = await GetExtraParamNamesAsync(@event.SubSystemCode); + await DoUpdateAsync(@event, paramsNames2); break; default: throw new ArgumentOutOfRangeException(); } } - private async Task DoPushAsync(TrackPushEvent @event) + private async Task DoPushAsync(TrackPushEvent @event, List paramNames) { var items = new List(); TrackPushContentConfigDto? config; - if (@event.OperationMan == null) { foreach (var order in _orders) @@ -115,6 +118,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe }; var item = await BuiltPushItem(config, log); item.Log = JsonConvert.SerializeObject(log); + //根据轨迹扩展内容填充 + item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames)); items.Add(item); } } @@ -154,6 +159,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe }; var item = await BuiltPushItem(config, log); item.Log = JsonConvert.SerializeObject(log); + //根据轨迹扩展内容填充 + item.Data.ForEach(dict => FillExtraParam(track.Extra, dict, paramNames)); items.Add(item); } } @@ -176,7 +183,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } } - private async Task DoUpdateAsync(TrackPushEvent @event) + private async Task DoUpdateAsync(TrackPushEvent @event, List paramNames) { var config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); if (config == null || !config.IsCanUpdate) return; @@ -199,6 +206,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe }; var item = BuiltUpdateItem(config, log); item.Log = JsonConvert.SerializeObject(log); + //根据轨迹扩展内容填充 + item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames)); items.Add(item); } @@ -225,24 +234,36 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var trackDatetime = log.TrackTime.AddHours(config.TrackTimeZone ?? log.TrackTimeZone - log.TrackTimeZone); var trackDateStr = DateTimeFormat(trackDatetime, config.TrackTimeZone ?? log.TrackTimeZone, config); - var track = new TrackItem - { - // 推真实的发生地和发生时间(时间是计算后的) - Location = log.TrackPlace, - Date = trackDateStr, - TimeZone = config.TrackTimeZone ?? log.TrackTimeZone, - Description = config.TrackEnContentValue, - DescriptionCn = config.TrackContentValue, - Code = config.TrackContentCodeValue, - Status = config.TrackStatusValue, - Extra = config.ExpandFieldsValue - }; + // var track = new TrackItem + // { + // // 推真实的发生地和发生时间(时间是计算后的) + // Location = log.TrackPlace, + // Date = trackDateStr, + // TimeZone = config.TrackTimeZone ?? log.TrackTimeZone, + // Description = config.TrackEnContentValue, + // DescriptionCn = config.TrackContentValue, + // Code = config.TrackContentCodeValue, + // Status = config.TrackStatusValue, + // Extra = config.ExpandFieldsValue + // }; var body = new TrackUpdateInput { OrderNo = log.OrderNo, }; - body.Data.Add(track); + var dict = new Dictionary() + { + // 推真实的发生地和发生时间(时间是计算后的) + { "Location", log.TrackPlace }, + { "Date", trackDateStr }, + { "TimeZone", config.TrackTimeZone ?? log.TrackTimeZone }, + { "Description", config.TrackEnContentValue }, + { "DescriptionCn", config.TrackContentValue }, + { "Code", config.TrackContentCodeValue }, + { "Status", config.TrackStatusValue }, + { "Extra", config.ExpandFieldsValue } + }; + body.Data.Add(dict); log.PushContent = body.ToJson(); return body; @@ -253,24 +274,36 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var trackDatetime = log.TrackTime.AddHours(config.TrackTimeZone ?? log.TrackTimeZone - log.TrackTimeZone); var trackDateStr = DateTimeFormat(trackDatetime, config.TrackTimeZone ?? log.TrackTimeZone, config); - var track = new TrackItem - { - // 推真实的发生地和发生时间(时间是计算后的) - Location = log.TrackPlace, - Date = trackDateStr, - TimeZone = config.TrackTimeZone ?? log.TrackTimeZone, - Description = config.TrackEnContentValue, - DescriptionCn = config.TrackContentValue, - Code = config.TrackContentCodeValue, - Status = config.TrackStatusValue, - Extra = config.ExpandFieldsValue - }; + // var track = new TrackItem + // { + // // 推真实的发生地和发生时间(时间是计算后的) + // Location = log.TrackPlace, + // Date = trackDateStr, + // TimeZone = config.TrackTimeZone ?? log.TrackTimeZone, + // Description = config.TrackEnContentValue, + // DescriptionCn = config.TrackContentValue, + // Code = config.TrackContentCodeValue, + // Status = config.TrackStatusValue, + // Extra = config.ExpandFieldsValue + // }; var body = new TrackPushInput { OrderNo = log.OrderNo, }; - body.Data.Add(track); + var dict = new Dictionary() + { + // 推真实的发生地和发生时间(时间是计算后的) + { "Location", log.TrackPlace }, + { "Date", trackDateStr }, + { "TimeZone", config.TrackTimeZone ?? log.TrackTimeZone }, + { "Description", config.TrackEnContentValue }, + { "DescriptionCn", config.TrackContentValue }, + { "Code", config.TrackContentCodeValue }, + { "Status", config.TrackStatusValue }, + { "Extra", config.ExpandFieldsValue } + }; + body.Data.Add(dict); if (config.IsAllPush) { @@ -278,7 +311,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (history != default) { body = JsonConvert.DeserializeObject(history.PushContent); - body!.Data.Add(track); + body!.Data.Add(dict); } } @@ -335,4 +368,44 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe return dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffK"); } + + /// + /// 获取来源系统接口的参数名 + /// + /// + /// + private async Task> GetExtraParamNamesAsync(string subSystemCode) + { + using (Track2InterfaceRelaySubSystemContext.Use( + new Track2InterfaceRelaySubSystemContext(subSystemCode))) + { + var res = await _httpClientProxy.Service.GetSystemInterfaceByIdAsync(_options.CurrentValue.PushTrackInterfaceId); + if (res == null) return new List(); + return res.InParameterList + .Where(x => x.Alias.StartsWith(_options.CurrentValue.PushTrackItemParamAliasPrefix)) + .Select(x => x.Name) + .ToList(); + } + } + + /// + /// 填充来源于轨迹扩展字段的参数 + /// + /// 轨迹明细扩展字段 + /// 要扩展的参数字典 + /// 来源扩展字段的参数名 + /// + private void FillExtraParam(Dictionary? trackExtra, Dictionary? dict, List? paramNames) + { + if (paramNames == null || paramNames.Count == 0) return; + if (dict == null) return; + + if (trackExtra == null || trackExtra.Count == 0) return; + foreach (var item in + trackExtra.Where(x => x.Value != null && paramNames.Contains(x.Key))) + { + dict.TryAdd(item.Key, item.Value); + } + } + } diff --git a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs index e55485a9..e467213d 100644 --- a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs +++ b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs @@ -4,11 +4,17 @@ using BSI.Stack.Rabbit.Handler; using Newtonsoft.Json; using RabbitMQ.Client.Events; using SJZY.Expand.ABP.Core.Logger; +using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.InterfaceRelay.Application.Contracts; +using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Dtos.TrackPush; +using SJZY.Track.Application.Contract.Events; using SJZY.Track.Application.Helpers; 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.Enums; using Volo.Abp.DependencyInjection; @@ -18,12 +24,24 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl { private readonly IOrderRepository _orderRepository; private readonly ITrackPushRecordEsRepository _trackPushRecordEsRepository; + private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; + private readonly ITrackStatusRepository _trackStatusRepository; + private readonly ITrackContentRepository _trackContentRepository; + private readonly RabbitClientBus _rabbitClientBus; public TrackPushCompletedEventHandler(IOrderRepository orderRepository, - ITrackPushRecordEsRepository trackPushRecordEsRepository) + ITrackPushRecordEsRepository trackPushRecordEsRepository, + ITrackDetailsEsRepository trackDetailsEsRepository, + ITrackStatusRepository trackStatusRepository, + ITrackContentRepository trackContentRepository, + RabbitClientBus rabbitClientBus) { _orderRepository = orderRepository; _trackPushRecordEsRepository = trackPushRecordEsRepository; + _trackDetailsEsRepository = trackDetailsEsRepository; + _trackStatusRepository = trackStatusRepository; + _trackContentRepository = trackContentRepository; + _rabbitClientBus = rabbitClientBus; } public ConsumeOptions Options() @@ -64,6 +82,16 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl log.Message = @event.Message; log.RequestId = @event.RequestId; + //查出推送轨迹,写入推送广播 + var tracks = await _trackDetailsEsRepository + .GetListAsync(new[] { log.OrderId }, new List + { + log.TrackCode + }); + + // 推送广播 + await PublicTrackPushTopicAsync(tracks.First(), log, !log.IsSuccess, log.Message); + // 往es 写推送日志 await _trackPushRecordEsRepository.AddAsync(log); @@ -111,4 +139,70 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl }); } } + + /// + /// 轨迹推送广播 + /// + private async Task PublicTrackPushTopicAsync(TrackDetailsIndex track, TrackPushRecordIndex pushRecord, bool isFailure = false, string? errorMsg = null) + { + var statusList = await _trackStatusRepository.GetListAsync(m => m.SubSystemId == track.SubSystemId); + if (statusList == null) + return; + + var contentList = await _trackContentRepository.GetTrackContentBySyetemIdAsync(track.SubSystemId); + if (contentList == null) + return; + + var status = statusList.FirstOrDefault(m => m.Code == track.TrackStatusCode); + if (status == null || !status.IsToMq) + return; + + var content = contentList.FirstOrDefault(m => m.TrackContentCode == track.TrackCode); + + var data = new TrackPushEto + { + Option = pushRecord.OptionType == OptionType.新增.ToString() ? OptionType.新增 : OptionType.修改, + IsManualPush = !string.Equals(pushRecord.CreateUser, GlobalConst.SystemUser), //操作人不为系统用户,则认为是仍推送 + IsFailure = isFailure, + FailureReason = errorMsg, + PushTime = DateTime.Now, + OperationMan = pushRecord.CreateUser, + EstimatedDeliveryDate = track.EstimatedDeliveryDate, + TrackPlacePostcode = track.TrackPlacePostcode, + TrackPlaceNation = track.TrackPlaceNation, + TrackPlaceNationId = track.TrackPlaceNationId, + TrackPlaceProvince = track.TrackPlaceProvince, + TrackPlaceProvinceId = track.TrackPlaceProvinceId, + TrackPlaceCity = track.TrackPlaceCity, + TrackPlaceCityId = track.TrackPlaceCityId, + Files = track.Files?.Select(x => new FileItemDto + { + OssKey = x.OssKey, + FileName = x.FileName + }).ToList(), + Remarks = track.Remarks, + Source = track.Source, + IsVisibility = track.IsVisibility, + TrackTimeZone = track.TrackTimeZone, + TrackTime = track.TrackTime, + TrackPlace = track.TrackPlace, + TrackStatusCode = track.TrackStatusCode, + EnStatus = track.TrackEnContent, + Content = track.TrackContent, + TrackCode = track.TrackCode, + SubSystemId = track.SubSystemId, + OrderNo = track.OrderNo, + OrderIdentifiers = new OrderIdentifier[] + { + new OrderIdentifier + { + OrderId = track.OrderId, + OrderNo = track.OrderNo, + OrderType = track.OrderType + } + }, + Extra = track.Extra + }; + _rabbitClientBus.Publish(GlobalConst.TrackPushExchange, $"TrackPush.{content.SubSystemCode}", Encoding.UTF8.GetBytes(data.ToJson())); + } } diff --git a/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs b/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs index e7901efa..93b5b277 100644 --- a/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs +++ b/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs @@ -57,5 +57,8 @@ public partial class GlobalConst /// public const string TrackChangeExchange = "sjzy.track.on_track_change_ex"; - + /// + /// 轨迹推送通知交换机 + /// + public const string TrackPushExchange = "sjzy.track.on_track_push_ex"; } From 9929331063761809622542e1b24df855b316d084 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Wed, 18 Dec 2024 16:05:05 +0800 Subject: [PATCH 06/80] =?UTF-8?q?=20update:=20=E8=B0=83=E6=95=B4=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=98=8E=E7=BB=86=E4=B8=AD=E6=89=A9=E5=B1=95=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E5=AD=98=E5=82=A8=E7=B1=BB=E5=9E=8B=20Dictionary=20=3D>=20string=EF=BC=8C=E6=B6=89=E5=8F=8A=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E4=BD=93=EF=BC=8CES=E5=AD=98=E5=82=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProvideServices/BatchUpsertTrackInput.cs | 2 +- .../Dtos/ProvideServices/GetTrackOutput.cs | 2 +- .../Dtos/ProvideServices/UpsertTrackInput.cs | 2 +- .../Events/TrackChangeEto.cs | 2 +- .../Events/TrackPushEto.cs | 2 +- .../Events/TrackPushEvent.cs | 2 +- .../Events/TrackUpsertEvent.cs | 2 +- .../EventHandlers/TrackPushEventHandler.cs | 98 +++++++++++++++---- .../TrackDetailsIndex.cs | 2 +- .../Repositories/TrackDetailsEsRepository.cs | 1 - 10 files changed, 86 insertions(+), 29 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs index a8ced808..98bab43c 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs @@ -123,5 +123,5 @@ public class BatchUpsertTrackInput : OrderNosInfo /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public Dictionary? Extra { get; set; } + public string? Extra { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs index 59a4065e..fca510a7 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs @@ -104,5 +104,5 @@ public class TrackDetail /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public Dictionary? Extra { get; set; } + public string? Extra { 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 22762d6c..dcda0b0f 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs @@ -127,5 +127,5 @@ public class UpsertTrackInput : OrderNoInfo /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public Dictionary? Extra { get; set; } + public string? Extra { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs b/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs index 5f49e9ff..6319446e 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs @@ -132,5 +132,5 @@ public class TrackChangeEto /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public Dictionary? Extra { get; set; } + public string? Extra { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushEto.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushEto.cs index 3c7bdffd..01a421fe 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackPushEto.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackPushEto.cs @@ -155,5 +155,5 @@ public class TrackPushEto /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public Dictionary? Extra { get; set; } + public string? Extra { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs index ea168d9d..86581528 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs @@ -73,5 +73,5 @@ public struct SystemPushStruct /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public Dictionary? Extra { get; set; } + public string? Extra { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index d08a1171..d6e2051b 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -144,7 +144,7 @@ public class TrackUpsertEvent /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public Dictionary? Extra { get; set; } + public string? Extra { get; set; } public override string ToString() { diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 0bb18a1e..6180b1bd 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using DotNetCore.CAP; using Microsoft.Extensions.Options; using Newtonsoft.Json; @@ -128,7 +129,10 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); if (config == null) return; - var tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds, @event.TrackCode); + var tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds, new List() + { + @event.TrackCode + }); tracks = tracks.DistinctBy(x => x.OrderId).ToList(); // 防止重复推送 if (tracks.Count == 0) return; // 一个能推的轨迹都不存在 @@ -254,14 +258,14 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var dict = new Dictionary() { // 推真实的发生地和发生时间(时间是计算后的) - { "Location", log.TrackPlace }, - { "Date", trackDateStr }, - { "TimeZone", config.TrackTimeZone ?? log.TrackTimeZone }, - { "Description", config.TrackEnContentValue }, - { "DescriptionCn", config.TrackContentValue }, - { "Code", config.TrackContentCodeValue }, - { "Status", config.TrackStatusValue }, - { "Extra", config.ExpandFieldsValue } + // { "location", log.TrackPlace }, + // { "date", trackDateStr }, + // { "timeZone", config.TrackTimeZone ?? log.TrackTimeZone }, + // { "description", config.TrackEnContentValue }, + // { "descriptionCn", config.TrackContentValue }, + // { "code", config.TrackContentCodeValue }, + // { "status", config.TrackStatusValue }, + // { "extra", config.ExpandFieldsValue } }; body.Data.Add(dict); log.PushContent = body.ToJson(); @@ -293,15 +297,15 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe }; var dict = new Dictionary() { - // 推真实的发生地和发生时间(时间是计算后的) - { "Location", log.TrackPlace }, - { "Date", trackDateStr }, - { "TimeZone", config.TrackTimeZone ?? log.TrackTimeZone }, - { "Description", config.TrackEnContentValue }, - { "DescriptionCn", config.TrackContentValue }, - { "Code", config.TrackContentCodeValue }, - { "Status", config.TrackStatusValue }, - { "Extra", config.ExpandFieldsValue } + // // 推真实的发生地和发生时间(时间是计算后的) + // { "location", log.TrackPlace }, + // { "date", trackDateStr }, + // { "timeZone", config.TrackTimeZone ?? log.TrackTimeZone }, + // { "description", config.TrackEnContentValue }, + // { "descriptionCn", config.TrackContentValue }, + // { "code", config.TrackContentCodeValue }, + // { "status", config.TrackStatusValue }, + // { "extra", config.ExpandFieldsValue } }; body.Data.Add(dict); @@ -395,12 +399,16 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe /// 要扩展的参数字典 /// 来源扩展字段的参数名 /// - private void FillExtraParam(Dictionary? trackExtra, Dictionary? dict, List? paramNames) + private void FillExtraParam(string? trackExtraStr, Dictionary? dict, List? paramNames) { if (paramNames == null || paramNames.Count == 0) return; if (dict == null) return; - if (trackExtra == null || trackExtra.Count == 0) return; + if (string.IsNullOrWhiteSpace(trackExtraStr)) return; + + var trackExtra = ExtractTrackExtraDict(trackExtraStr); + + if (trackExtra.Count == 0) return; foreach (var item in trackExtra.Where(x => x.Value != null && paramNames.Contains(x.Key))) { @@ -408,4 +416,54 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } } + + private Dictionary ExtractTrackExtraDict(string trackExtraStr) + { + var dict = new Dictionary(); + var trackExtra = JsonConvert.DeserializeObject>(trackExtraStr); + if (trackExtra == null) return dict; + foreach (var pair in trackExtra) + { + if (pair.Value is JsonElement jEl) + { + object? objVal = null; + switch (jEl.ValueKind) + { + case JsonValueKind.String: + objVal = jEl.GetString(); + // 处理字符串值 + break; + case JsonValueKind.Number: + objVal = jEl.GetDouble(); + // 处理数值 + break; + case JsonValueKind.True: + case JsonValueKind.False: + objVal = jEl.GetBoolean(); + // 处理布尔值 + break; + case JsonValueKind.Object: + // 处理对象 + break; + case JsonValueKind.Array: + // 处理数组 + break; + case JsonValueKind.Null: + // 处理空值 + break; + default: + // 处理未知类型 + break; + } + + if (objVal == null) continue; + dict.TryAdd(pair.Key, objVal); + continue; + } + + dict.TryAdd(pair.Key, pair.Value); + } + + return dict; + } } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index 60eed6a3..02cb6b51 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -190,5 +190,5 @@ public class TrackDetailsIndex : IdBaseIndex /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public Dictionary? Extra { get; set; } + public string? Extra { get; set; } } diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index e25c9b89..f0c8f048 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -3,7 +3,6 @@ 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; From 51860d85297edb72f7010107a0cb74750aa0599b Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Wed, 18 Dec 2024 16:18:15 +0800 Subject: [PATCH 07/80] =?UTF-8?q?update:=20=E6=96=B0=E5=A2=9E/=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E8=BD=A8=E8=BF=B9=E8=AE=A2=E5=8D=95=EF=BC=8C=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=A8=A1=E6=9D=BFcode=E5=85=81=E8=AE=B8=E4=BC=A0null?= =?UTF-8?q?=20pkg-update:=20=E5=8D=87=E7=BA=A7=E5=A5=91=E7=BA=A6=E5=8C=85?= =?UTF-8?q?=E7=89=88=E6=9C=AC=207.0.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/ProvideServices/UpdateOrderInput.cs | 2 +- .../SJZY.Track.Application.Contract.csproj | 2 +- .../Services/ProvideServices/OrderService.cs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpdateOrderInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpdateOrderInput.cs index d9d6d235..a37ab135 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpdateOrderInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpdateOrderInput.cs @@ -81,7 +81,7 @@ public class UpdateOrderInput : OrderNoInfo /// /// 模板code /// - public List TemplateCodes { get; set; } + public List? TemplateCodes { get; set; } } public class PullConfigInfo diff --git a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj index f8a1ce47..4782626f 100644 --- a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj +++ b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj @@ -5,7 +5,7 @@ net7.0 True - 7.0.5 + 7.0.7 True diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs index d529f83d..ed613ffb 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs @@ -76,7 +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); + order.TemplateCodes = input.TemplateCodes == null ? null : string.Join(',', input.TemplateCodes); var orderId = await _orderRepository.CreateOrderAsync(order); @@ -131,7 +131,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); + order.TemplateCodes = input.TemplateCodes == null ? null : string.Join(',', input.TemplateCodes); await _orderRepository.UpdateOrderAsync(order); } From 98d79712d6326bbcfbf7d3786dedadc1bcab7c25 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 19 Dec 2024 09:38:51 +0800 Subject: [PATCH 08/80] =?UTF-8?q?opt:=20=E6=9B=B4=E6=96=B0=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E9=80=9A=E6=8E=A5=E5=85=A5=E5=8C=85=E7=89=88=E6=9C=AC?= =?UTF-8?q?=207.2.5-alpha=20=3D>=207.2.5-alpha2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CAP/EventHandlers/TrackPushEventHandler.cs | 2 +- src/SJZY.Track.Application/SJZY.Track.Application.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 6180b1bd..41a5a0cf 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -383,7 +383,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe using (Track2InterfaceRelaySubSystemContext.Use( new Track2InterfaceRelaySubSystemContext(subSystemCode))) { - var res = await _httpClientProxy.Service.GetSystemInterfaceByIdAsync(_options.CurrentValue.PushTrackInterfaceId); + var res = await _httpClientProxy.Service.GetSystemInterfaceByIdAsync(_options.CurrentValue.PushTrackInterfaceCode, _options.CurrentValue.PushTrackInterfaceId); if (res == null) return new List(); return res.InParameterList .Where(x => x.Alias.StartsWith(_options.CurrentValue.PushTrackItemParamAliasPrefix)) diff --git a/src/SJZY.Track.Application/SJZY.Track.Application.csproj b/src/SJZY.Track.Application/SJZY.Track.Application.csproj index 8226317a..78816ec1 100644 --- a/src/SJZY.Track.Application/SJZY.Track.Application.csproj +++ b/src/SJZY.Track.Application/SJZY.Track.Application.csproj @@ -11,7 +11,7 @@ - + From 4e87546ed1f2bfb990d0eecae7d76ba65e83cbeb Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 19 Dec 2024 10:11:23 +0800 Subject: [PATCH 09/80] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E8=BD=A8=E8=BF=B9=E6=8E=A8=E9=80=81=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=A1=AB=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackPushEventHandler.cs | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 41a5a0cf..b0499656 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -257,15 +257,15 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe }; var dict = new Dictionary() { - // 推真实的发生地和发生时间(时间是计算后的) - // { "location", log.TrackPlace }, - // { "date", trackDateStr }, - // { "timeZone", config.TrackTimeZone ?? log.TrackTimeZone }, - // { "description", config.TrackEnContentValue }, - // { "descriptionCn", config.TrackContentValue }, - // { "code", config.TrackContentCodeValue }, - // { "status", config.TrackStatusValue }, - // { "extra", config.ExpandFieldsValue } + //推真实的发生地和发生时间(时间是计算后的) + { "location", log.TrackPlace }, + { "date", trackDateStr }, + { "timeZone", config.TrackTimeZone ?? log.TrackTimeZone }, + { "description", config.TrackEnContentValue }, + { "descriptionCn", config.TrackContentValue }, + { "code", config.TrackContentCodeValue }, + { "status", config.TrackStatusValue }, + { "extra", config.ExpandFieldsValue } }; body.Data.Add(dict); log.PushContent = body.ToJson(); @@ -297,15 +297,15 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe }; var dict = new Dictionary() { - // // 推真实的发生地和发生时间(时间是计算后的) - // { "location", log.TrackPlace }, - // { "date", trackDateStr }, - // { "timeZone", config.TrackTimeZone ?? log.TrackTimeZone }, - // { "description", config.TrackEnContentValue }, - // { "descriptionCn", config.TrackContentValue }, - // { "code", config.TrackContentCodeValue }, - // { "status", config.TrackStatusValue }, - // { "extra", config.ExpandFieldsValue } + // 推真实的发生地和发生时间(时间是计算后的) + { "location", log.TrackPlace }, + { "date", trackDateStr }, + { "timeZone", config.TrackTimeZone ?? log.TrackTimeZone }, + { "description", config.TrackEnContentValue }, + { "descriptionCn", config.TrackContentValue }, + { "code", config.TrackContentCodeValue }, + { "status", config.TrackStatusValue }, + { "extra", config.ExpandFieldsValue } }; body.Data.Add(dict); From f69436475431777807c509e4931a239866f06225 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 19 Dec 2024 10:52:05 +0800 Subject: [PATCH 10/80] =?UTF-8?q?update:=20=E4=B8=8B=E6=8B=89=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E5=86=85=E5=AE=B9=E5=A2=9E=E5=8A=A0=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E7=B1=BB=E5=9E=8B=EF=BC=8C=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E6=89=80=E6=9C=89=E8=BD=A8=E8=BF=B9=E5=86=85=E5=AE=B9=EF=BC=8C?= =?UTF-8?q?=20=20-=20=E8=A1=A5=E5=85=85=E9=80=BB=E8=BE=91=EF=BC=9A?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=A1=8C=E4=B8=BA=E4=B8=8B=E6=8B=89=EF=BC=8C?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E5=A4=96=E9=83=A8=E6=9C=8D=E5=8A=A1=E5=95=86?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackContents/GetAvailableContentInput.cs | 5 +++-- .../Services/TrackContents/TrackContentService.cs | 7 +++++++ 2 files changed, 10 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 47425b3c..39ae0073 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=修改 3=删除 + /// 操作类型 1=创建 2=修改 3=删除 4=推送 /// public TrackOptionType TrackOptionType { get; set; } } @@ -22,5 +22,6 @@ public enum TrackOptionType { 创建 = 1, 修改 = 2, - 删除 = 3 + 删除 = 3, + 推送 = 4, } diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index c5e23f8d..78c97d7b 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -14,6 +14,7 @@ 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.Enums; using SJZY.Track.Domain.Queries; namespace SJZY.Track.Application.Services.TrackContents; @@ -292,6 +293,12 @@ public class TrackContentService : ApplicationService //获取轨迹详情 var trackDetails = await _trackDetailsEsRepository.GetListAsync(order.Id); + // 删除时去除掉外部服务商轨迹 + if (input.TrackOptionType == TrackOptionType.删除) + { + trackDetails = trackDetails.Where(m => m.Source != (int) TrackSourceEnum.ExternalServiceProvide).ToList(); + } + //获取当前子系统下所有的轨迹内容 var contentList = await _trackContentRepository.GetListBySystemIdAsync(input.SystemId); if (contentList == null) From e0c18bda20a967c2ebf1a8b7b83bd3277cfebc82 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 19 Dec 2024 15:03:08 +0800 Subject: [PATCH 11/80] =?UTF-8?q?add-track:=20=20=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E4=B8=AD=E8=AF=B7=E6=B1=82=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E9=80=9A=E8=8E=B7=E5=8F=96=E6=8E=A5=E5=8F=A3=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CAP/EventHandlers/TrackPushEventHandler.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index b0499656..81505dc0 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -4,6 +4,7 @@ using Microsoft.Extensions.Options; using Newtonsoft.Json; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.InterfaceRelay.Application.Contracts; +using SJZY.OTel; using SJZY.Track.Application.Contract.Dtos.TrackPush; using SJZY.Track.Application.Contract.Events; using SJZY.Track.Application.Contract.Services; @@ -380,11 +381,14 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe /// private async Task> GetExtraParamNamesAsync(string subSystemCode) { + using var span = ActivityHelper.CreateSpanActivity("开始请求接口通,接口结构"); using (Track2InterfaceRelaySubSystemContext.Use( new Track2InterfaceRelaySubSystemContext(subSystemCode))) { var res = await _httpClientProxy.Service.GetSystemInterfaceByIdAsync(_options.CurrentValue.PushTrackInterfaceCode, _options.CurrentValue.PushTrackInterfaceId); if (res == null) return new List(); + span.SetTag("request-GetSystemInterfaceByIdAsync", $"{subSystemCode},{_options.CurrentValue.PushTrackInterfaceCode},{_options.CurrentValue.PushTrackInterfaceId}"); + span.SetTag("response-GetSystemInterfaceByIdAsync", res.ToJson()); return res.InParameterList .Where(x => x.Alias.StartsWith(_options.CurrentValue.PushTrackItemParamAliasPrefix)) .Select(x => x.Name) From 7d5b81683d2dccecb74f8545bd203949a766f924 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 19 Dec 2024 15:22:16 +0800 Subject: [PATCH 12/80] =?UTF-8?q?add-track:=20=E8=A1=A5=E5=85=85=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=8E=A8=E9=80=81=E9=93=BE=E8=B7=AF=E8=B7=9F=E8=B8=AA?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CAP/EventHandlers/TrackPushEventHandler.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 81505dc0..28c82e85 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -387,7 +387,10 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { var res = await _httpClientProxy.Service.GetSystemInterfaceByIdAsync(_options.CurrentValue.PushTrackInterfaceCode, _options.CurrentValue.PushTrackInterfaceId); if (res == null) return new List(); - span.SetTag("request-GetSystemInterfaceByIdAsync", $"{subSystemCode},{_options.CurrentValue.PushTrackInterfaceCode},{_options.CurrentValue.PushTrackInterfaceId}"); + span.SetTag("request-GetSystemInterfaceByIdAsync", $"PushTrackInterfaceCode[{subSystemCode}]," + + $"PushTrackInterfaceCode:[{_options.CurrentValue.PushTrackInterfaceCode}]," + + $"PushTrackInterfaceId:[{_options.CurrentValue.PushTrackInterfaceId}]," + + $"PushTrackItemParamAliasPrefix:[{_options.CurrentValue.PushTrackItemParamAliasPrefix}]"); span.SetTag("response-GetSystemInterfaceByIdAsync", res.ToJson()); return res.InParameterList .Where(x => x.Alias.StartsWith(_options.CurrentValue.PushTrackItemParamAliasPrefix)) From cfa241a36faca2f729fd077c23206df52df461b5 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 19 Dec 2024 18:06:06 +0800 Subject: [PATCH 13/80] =?UTF-8?q?update:=20=E4=BC=98=E5=8C=96=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=8E=A8=E9=80=81=E9=80=BB=E8=BE=91=EF=BC=8C=E6=9C=89?= =?UTF-8?q?=E6=95=88=E5=87=8F=E5=B0=91=E4=B8=8D=E5=BF=85=E8=A6=81=E7=9A=84?= =?UTF-8?q?=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackPushEventHandler.cs | 91 ++++++++----------- 1 file changed, 38 insertions(+), 53 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 28c82e85..0dcaf748 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -74,27 +74,25 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe case OptionType.无: return; case OptionType.新增: - //获取接口参数名称,稍后将用于轨迹扩展字段提取填充请求 - var paramsNames1 = await GetExtraParamNamesAsync(@event.SubSystemCode); - await DoPushAsync(@event, paramsNames1); + await DoPushAsync(@event); break; case OptionType.删除: break; case OptionType.修改: - //获取接口参数名称,稍后将用于轨迹扩展字段提取填充请求 - var paramsNames2 = await GetExtraParamNamesAsync(@event.SubSystemCode); - await DoUpdateAsync(@event, paramsNames2); + await DoUpdateAsync(@event); break; default: throw new ArgumentOutOfRangeException(); } } - private async Task DoPushAsync(TrackPushEvent @event, List paramNames) + private async Task DoPushAsync(TrackPushEvent @event) { - var items = new List(); + var items = new List(); TrackPushContentConfigDto? config; - if (@event.OperationMan == null) + var isSystemPush = @event.OperationMan == null; + var trackPushInputDict = new Dictionary(); + if (isSystemPush) { foreach (var order in _orders) { @@ -120,8 +118,6 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe }; var item = await BuiltPushItem(config, log); item.Log = JsonConvert.SerializeObject(log); - //根据轨迹扩展内容填充 - item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames)); items.Add(item); } } @@ -130,10 +126,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); if (config == null) return; - var tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds, new List() - { - @event.TrackCode - }); + var tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds, @event.TrackCode); tracks = tracks.DistinctBy(x => x.OrderId).ToList(); // 防止重复推送 if (tracks.Count == 0) return; // 一个能推的轨迹都不存在 @@ -164,21 +157,34 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe }; var item = await BuiltPushItem(config, log); item.Log = JsonConvert.SerializeObject(log); - //根据轨迹扩展内容填充 - item.Data.ForEach(dict => FillExtraParam(track.Extra, dict, paramNames)); + trackPushInputDict.Add(item, track); items.Add(item); } } if (items.Count == 0) return; + //获取参数结构名称 + var paramNames = await GetExtraParamNamesAsync(@event.SubSystemCode); + + //如果为系统推送,则从事件中取出轨迹扩展内容填充 + foreach (var item in items) + { + //根据事件中轨迹扩展内容填充 + if (isSystemPush) + item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames)); + //根据查出的轨迹中扩展内容填充 + else + item.Data.ForEach(dict => FillExtraParam(trackPushInputDict[item].Extra, dict, paramNames)); + } + using (Track2InterfaceRelaySubSystemContext.Use( new Track2InterfaceRelaySubSystemContext(@event.SubSystemCode))) { var asciiString = Base64Helper.SerializeObject(OptionType.新增.ToString()); var r = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( _options.CurrentValue.PushTrackInterfaceCode, - _pushConfigs.First().ServiceProviderCode, items, GlobalConst.TrackPushCompletedSubscribe, + _pushConfigs.First().ServiceProviderCode, items.Cast().ToList(), GlobalConst.TrackPushCompletedSubscribe, attach: asciiString); if (r.Code != GlobalConst.SuccessCode) @@ -188,12 +194,12 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } } - private async Task DoUpdateAsync(TrackPushEvent @event, List paramNames) + private async Task DoUpdateAsync(TrackPushEvent @event) { var config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); if (config == null || !config.IsCanUpdate) return; - var items = new List(); + var items = new List(); foreach (var order in _orders) { var log = new TrackPushRecordIndex @@ -211,20 +217,25 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe }; var item = BuiltUpdateItem(config, log); item.Log = JsonConvert.SerializeObject(log); - //根据轨迹扩展内容填充 - item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames)); items.Add(item); } if (items.Count == 0) return; + //获取参数结构名称 + var paramNames = await GetExtraParamNamesAsync(@event.SubSystemCode); + + //根据事件中轨迹扩展内容填充请求 + foreach (var item in items) + item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames)); + using (Track2InterfaceRelaySubSystemContext.Use( new Track2InterfaceRelaySubSystemContext(@event.SubSystemCode))) { var asciiString = Base64Helper.SerializeObject(OptionType.修改.ToString()); var r = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( _options.CurrentValue.TrackUpdateInterfaceCode, - _pushConfigs.First().ServiceProviderCode, items, GlobalConst.TrackPushCompletedSubscribe, + _pushConfigs.First().ServiceProviderCode, items.Cast().ToList(), GlobalConst.TrackPushCompletedSubscribe, attach: asciiString); if (r.Code != GlobalConst.SuccessCode) @@ -239,19 +250,6 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var trackDatetime = log.TrackTime.AddHours(config.TrackTimeZone ?? log.TrackTimeZone - log.TrackTimeZone); var trackDateStr = DateTimeFormat(trackDatetime, config.TrackTimeZone ?? log.TrackTimeZone, config); - // var track = new TrackItem - // { - // // 推真实的发生地和发生时间(时间是计算后的) - // Location = log.TrackPlace, - // Date = trackDateStr, - // TimeZone = config.TrackTimeZone ?? log.TrackTimeZone, - // Description = config.TrackEnContentValue, - // DescriptionCn = config.TrackContentValue, - // Code = config.TrackContentCodeValue, - // Status = config.TrackStatusValue, - // Extra = config.ExpandFieldsValue - // }; - var body = new TrackUpdateInput { OrderNo = log.OrderNo, @@ -279,19 +277,6 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var trackDatetime = log.TrackTime.AddHours(config.TrackTimeZone ?? log.TrackTimeZone - log.TrackTimeZone); var trackDateStr = DateTimeFormat(trackDatetime, config.TrackTimeZone ?? log.TrackTimeZone, config); - // var track = new TrackItem - // { - // // 推真实的发生地和发生时间(时间是计算后的) - // Location = log.TrackPlace, - // Date = trackDateStr, - // TimeZone = config.TrackTimeZone ?? log.TrackTimeZone, - // Description = config.TrackEnContentValue, - // DescriptionCn = config.TrackContentValue, - // Code = config.TrackContentCodeValue, - // Status = config.TrackStatusValue, - // Extra = config.ExpandFieldsValue - // }; - var body = new TrackPushInput { OrderNo = log.OrderNo, @@ -402,18 +387,18 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe /// /// 填充来源于轨迹扩展字段的参数 /// - /// 轨迹明细扩展字段 + /// 轨迹明细扩展字段Json /// 要扩展的参数字典 /// 来源扩展字段的参数名 /// - private void FillExtraParam(string? trackExtraStr, Dictionary? dict, List? paramNames) + private void FillExtraParam(string? trackExtraJson, Dictionary? dict, List? paramNames) { if (paramNames == null || paramNames.Count == 0) return; if (dict == null) return; - if (string.IsNullOrWhiteSpace(trackExtraStr)) return; + if (string.IsNullOrWhiteSpace(trackExtraJson)) return; - var trackExtra = ExtractTrackExtraDict(trackExtraStr); + var trackExtra = ExtractTrackExtraDict(trackExtraJson); if (trackExtra.Count == 0) return; foreach (var item in From cc32f5b2fda0cfa27236f745b8e8440973400603 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 20 Dec 2024 15:21:36 +0800 Subject: [PATCH 14/80] =?UTF-8?q?update:=20=E6=8E=A8=E9=80=81=E8=A1=8C?= =?UTF-8?q?=E4=B8=BA=E9=99=90=E5=88=B6=E6=8E=A8=E9=80=81=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=9A=84=E8=AE=A2=E5=8D=95=E7=B1=BB=E5=9E=8B=E5=92=8C=E8=A6=81?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E7=9A=84=E8=BD=A8=E8=BF=B9=E6=89=80=E5=B1=9E?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E7=9A=84=E8=AE=A2=E5=8D=95=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=BF=85=E9=A1=BB=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update: 进行删除/推送操作时,订单无轨迹时轨迹代码下拉应该显示为空, - 删除过滤外部服务商轨迹 - 推送过滤订单类型不一致轨迹 opt: 配置MQ,舰艇和轨迹推送完成回传 --- .../EventHandlers/TrackPushEventHandler.cs | 8 +++++++ .../Rabbit/TrackPushCompletedEventHandler.cs | 4 ++-- .../TrackContents/TrackContentService.cs | 24 +++++++++++++------ .../SjzyTrackApplicationModule.cs | 16 ++++++++++++- 4 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 0dcaf748..7431244e 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -100,7 +100,9 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行 config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); if (config == null) continue; + // 是否自动推送 if (!config.IsAutoPush) continue; + //配置的类型如何和订单类型不一致则不允许推送 if (config.OrderType != order.OrderType) continue; var log = new TrackPushRecordIndex @@ -142,6 +144,9 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (config == null) continue; + //配置的类型如何和订单类型不一致则不允许推送 + if (config.OrderType != order.OrderType) continue; + var log = new TrackPushRecordIndex { OptionType = @event.OptionType.ToString(), @@ -202,6 +207,9 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var items = new List(); foreach (var order in _orders) { + //配置的类型如何和订单类型不一致则不允许推送 + if (config.OrderType != order.OrderType) continue; + var log = new TrackPushRecordIndex { OptionType = @event.OptionType.ToString(), diff --git a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs index e467213d..5dd5e7ed 100644 --- a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs +++ b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs @@ -67,11 +67,11 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl var optionType = Base64Helper.DeSerialize(@event.Attach); if (optionType == OptionType.新增.ToString()) { - logStr = JsonConvert.DeserializeObject(@event.RequestParams)!.Log; + logStr = JsonConvert.DeserializeObject>(@event.RequestParams)!.First().Log; } else if (optionType == OptionType.修改.ToString()) { - logStr = JsonConvert.DeserializeObject(@event.RequestParams)!.Log; + logStr = JsonConvert.DeserializeObject>(@event.RequestParams)!.First().Log;; } if (logStr.IsNullOrEmpty()) throw new InvalidOperationException(); diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index 78c97d7b..95fed12e 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -13,7 +13,6 @@ 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.Enums; using SJZY.Track.Domain.Queries; @@ -290,6 +289,11 @@ public class TrackContentService : ApplicationService if (order == default) throw new BusinessException(message: "订单不存在!"); + var res = new UnifyResultDto>(true) + { + Data = new List() + }; + //获取轨迹详情 var trackDetails = await _trackDetailsEsRepository.GetListAsync(order.Id); @@ -298,6 +302,17 @@ public class TrackContentService : ApplicationService { trackDetails = trackDetails.Where(m => m.Source != (int) TrackSourceEnum.ExternalServiceProvide).ToList(); } + //进行推送时,匹配订单类型一致的轨迹 + if (input.TrackOptionType == TrackOptionType.推送) + { + trackDetails = trackDetails.Where(t => t.OrderType == order.OrderType).ToList(); + } + + //进行删除和推送行为无任何轨迹内容,直接返回为空即可 + if (input.TrackOptionType is TrackOptionType.删除 or TrackOptionType.推送 && trackDetails.Count == 0) + { + return res; + } //获取当前子系统下所有的轨迹内容 var contentList = await _trackContentRepository.GetListBySystemIdAsync(input.SystemId); @@ -312,11 +327,6 @@ public class TrackContentService : ApplicationService contentList = contentList.Where(m => template.Contains(m.Code)).ToList(); } - var res = new UnifyResultDto>(true) - { - Data = new List() - }; - foreach (var item in contentList) { //新增时跳过已存在轨迹内容 @@ -351,7 +361,7 @@ public class TrackContentService : ApplicationService } - //修改操作,查轨迹内容列表反映明细表数据,重新构造响应数据 + //修改/删除/推送 操作,查轨迹内容列表反映明细表数据,重新构造响应数据 var matchContent = new List(); var contents = res.Data.Select(x => new { diff --git a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs index 9318e6ca..a26eb785 100644 --- a/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs +++ b/src/SJZY.Track.Application/SjzyTrackApplicationModule.cs @@ -142,7 +142,8 @@ public class SjzyTrackApplicationModule : AbpModule options.PoolSize = configuration.GetValue("RabbitMQ:PoolSize"); options.Declarations = new List>() { - o=>o.ExchangeDeclare(GlobalConst.TrackChangeExchange, ExchangeType.Topic, true), + o => o.ExchangeDeclare(GlobalConst.TrackChangeExchange, ExchangeType.Topic, true), + o => o.ExchangeDeclare(GlobalConst.TrackPushExchange, ExchangeType.Topic, true) }; options.Consumes = new List { @@ -158,6 +159,19 @@ public class SjzyTrackApplicationModule : AbpModule o.QueueBind(GlobalConst.TrackRefreshSubscribe, GlobalConst.InterfaceRelayExchange, GlobalConst.TrackRefreshSubscribe); } + }, + new() + { + Queue = GlobalConst.TrackPushCompletedSubscribe, + FetchCount = configuration.GetValue("TrackApp:TrackRefreshFetchCount"), + FailedRequeue = false, + Declaration = o => + { + o.ExchangeDeclare(GlobalConst.InterfaceRelayExchange, ExchangeType.Direct, true); + o.QueueDeclare(GlobalConst.TrackPushCompletedSubscribe, true); + o.QueueBind(GlobalConst.TrackPushCompletedSubscribe, GlobalConst.InterfaceRelayExchange, + GlobalConst.TrackPushCompletedSubscribe); + } } }; }, typeof(SjzyTrackApplicationModule).Assembly); From 97bee1e3d976f8a3a759b912bfd651432b761786 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 20 Dec 2024 17:05:57 +0800 Subject: [PATCH 15/80] =?UTF-8?q?update:=20=E6=8E=A8=E9=80=81=E8=A1=8C?= =?UTF-8?q?=E4=B8=BA=E4=B8=8B=E6=8B=89=E5=88=97=E8=A1=A8=E5=8F=AA=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=8E=A8=E9=80=81=E6=98=A0=E5=B0=84=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E8=BD=A8=E8=BF=B9=20update:=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E/=E6=9B=B4=E6=96=B0=E8=BD=A8=E8=BF=B9=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BC=BA=E5=88=B6=E6=8E=A8=E9=80=81=E6=A0=87?= =?UTF-8?q?=E8=AF=86=EF=BC=8C=E6=AD=A4=E6=A0=87=E8=AF=86=E4=BC=9A=E5=BD=B1?= =?UTF-8?q?=E5=93=8D=E6=8E=A8=E9=80=81=E8=A1=8C=E4=B8=BA=E4=BD=BF=E5=85=B6?= =?UTF-8?q?=E5=8F=98=E4=B8=BA=EF=BC=8C=201.=E6=98=8E=E7=A1=AE=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E6=8E=A8=E9=80=81=E8=BD=A8=E8=BF=B9=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=202.=E4=B8=8D=E5=8F=97=E6=8E=A8=E9=80=81=E6=98=A0=E5=B0=84?= =?UTF-8?q?=E7=9A=84=E9=A1=BA=E5=BA=8F=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProvideServices/BatchUpsertTrackInput.cs | 5 +++++ .../Dtos/ProvideServices/UpsertTrackInput.cs | 5 +++++ .../Events/TrackPushEvent.cs | 5 +++++ .../Events/TrackUpsertEvent.cs | 6 +++++ .../EventHandlers/TrackPushEventHandler.cs | 22 +++++++++++++++---- .../EventHandlers/TrackUpsertEventHandler.cs | 3 ++- .../Services/ProvideServices/TrackService.cs | 3 ++- .../TrackContents/TrackContentService.cs | 16 ++++++++++++-- 8 files changed, 57 insertions(+), 8 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs index 98bab43c..399f9be0 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs @@ -124,4 +124,9 @@ public class BatchUpsertTrackInput : OrderNosInfo /// 扩展信息字段,用与轨迹推送的附加字段 /// public string? Extra { get; set; } + + /// + /// 是否强制推送 + /// + public bool ForcedPush { 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 dcda0b0f..b436b9ef 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs @@ -128,4 +128,9 @@ public class UpsertTrackInput : OrderNoInfo /// 扩展信息字段,用与轨迹推送的附加字段 /// public string? Extra { get; set; } + + /// + /// 是否强制推送 + /// + public bool ForcedPush { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs index 86581528..f51929db 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs @@ -41,6 +41,11 @@ public class TrackPushEvent /// 系统推送信息 /// public SystemPushStruct SystemPushInfo { get; set; } + + /// + /// 是否强制推送 + /// + public bool ForcedPush { get; set; } } public struct SystemPushStruct diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index d6e2051b..9b707cdb 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -146,6 +146,12 @@ public class TrackUpsertEvent /// public string? Extra { get; set; } + /// + /// 是否强制推送 + /// + public bool ForcedPush { get; set; } + + public override string ToString() { return diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 7431244e..e407d2ff 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -69,6 +69,12 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (orders.Count == 0) return; _orders = orders; + if (@event.ForcedPush) + { + await DoPushAsync(@event); + return; + } + switch (@event.OptionType) { case OptionType.无: @@ -97,12 +103,16 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe foreach (var order in _orders) { if (order.QuestionType == (int) TrackProblemType.Error) continue; // 系统不推异常单,只能人工操作 - // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行 - config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); + // 强制推送只需直接查出配置 + if (@event.ForcedPush) + config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); + // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行,为了约束顺序 + else + config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); if (config == null) continue; // 是否自动推送 if (!config.IsAutoPush) continue; - //配置的类型如何和订单类型不一致则不允许推送 + // 配置的类型如何和订单类型不一致则不允许推送 if (config.OrderType != order.OrderType) continue; var log = new TrackPushRecordIndex @@ -138,8 +148,12 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var order = _orders.First(x => x.Id == track.OrderId); if (config is { IsAllPush: true }) { + // 强制推送只需直接查出配置 + if (@event.ForcedPush) + config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); // 推断 本次推送 是否可行 - config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); + else + config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); } if (config == null) continue; diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 1d57d01e..a0a07af3 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -264,7 +264,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackTime = @event.NewTrackTime ?? @event.TrackTime, TrackTimeZone = @event.TrackTimeZone, Extra = @event.Extra - } + }, + ForcedPush = @event.ForcedPush }; await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, trackPushEvent); diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index a73ffe17..f124ce46 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -473,7 +473,8 @@ public partial class TrackService : ApplicationService, ITrackService TrackPlacePostcode = input.TrackPlacePostcode, EstimatedDeliveryDate = input.EstimatedDeliveryDate, DestinationTimeZone = input.DestinationTimeZone, - Extra = input.Extra + Extra = input.Extra, + ForcedPush = input.ForcedPush }; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); } diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index 95fed12e..4113d9ff 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -5,6 +5,7 @@ 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.Contract.Services; using SJZY.Track.Application.Localization; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackContentAggregate; @@ -32,6 +33,7 @@ public class TrackContentService : ApplicationService private readonly IBasicQuery _trackStatusBasicQuery; private readonly IOrderRepository _orderRepository; private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; + private readonly ITrackPushCacheService _trackPushCacheService; public TrackContentService( IStringLocalizer stringLocalizer, @@ -40,7 +42,7 @@ public class TrackContentService : ApplicationService IBasicQuery trackFlagBasicQuery, IOrderRepository orderRepository, ITrackDetailsEsRepository trackDetailsEsRepository, - ITrackTemplateRepository trackTemplateRepository) + ITrackTemplateRepository trackTemplateRepository, ITrackPushCacheService trackPushCacheService) { _stringLocalizer = stringLocalizer; _trackContentRepository = trackContentRepository; @@ -49,6 +51,7 @@ public class TrackContentService : ApplicationService _orderRepository = orderRepository; _trackDetailsEsRepository = trackDetailsEsRepository; _trackTemplateRepository = trackTemplateRepository; + _trackPushCacheService = trackPushCacheService; } /// @@ -305,7 +308,16 @@ public class TrackContentService : ApplicationService //进行推送时,匹配订单类型一致的轨迹 if (input.TrackOptionType == TrackOptionType.推送) { - trackDetails = trackDetails.Where(t => t.OrderType == order.OrderType).ToList(); + var pushConfigs = await _trackPushCacheService.GetPushContentConfigsAsync(order.SubSystemId, order.CustomId); + //没有推送配置也不会展示任何下拉 + if (pushConfigs == null || pushConfigs.Count == 0) return res; + //选订单类型和配置订单类型一致的配置的轨迹代码 + var trackCodes = pushConfigs.Where(m => m.OrderType == order.OrderType) + .Select(x=>x.TrackCode) + .Distinct() + .ToHashSet(); + //根据配置过滤轨迹 + trackDetails = trackDetails.Where(m => trackCodes.Contains(m.TrackCode)).ToList(); } //进行删除和推送行为无任何轨迹内容,直接返回为空即可 From 017cd7ffd4abca1e866c77a1a326edf9cf91708e Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Mon, 23 Dec 2024 14:29:54 +0800 Subject: [PATCH 16/80] =?UTF-8?q?update:=20=E8=BD=A8=E8=BF=B9=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E6=89=A9=E5=B1=95=E5=8F=82=E6=95=B0=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E5=85=A8=E9=87=8F=E7=9A=84=E8=BD=A8=E8=BF=B9=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E6=89=A9=E5=B1=95=E5=86=85=E5=AE=B9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackPushEventHandler.cs | 72 ++++++++++--------- 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index e407d2ff..d2669e14 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -97,7 +97,6 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var items = new List(); TrackPushContentConfigDto? config; var isSystemPush = @event.OperationMan == null; - var trackPushInputDict = new Dictionary(); if (isSystemPush) { foreach (var order in _orders) @@ -128,7 +127,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, CreateUser = GlobalConst.SystemUser, }; - var item = await BuiltPushItem(config, log); + var item = await BuiltPushItem(config, log, @event.SystemPushInfo.Extra); item.Log = JsonConvert.SerializeObject(log); items.Add(item); } @@ -174,9 +173,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe TrackTimeZone = track.TrackTimeZone, CreateUser = @event.OperationMan, }; - var item = await BuiltPushItem(config, log); + var item = await BuiltPushItem(config, log, track.Extra); item.Log = JsonConvert.SerializeObject(log); - trackPushInputDict.Add(item, track); items.Add(item); } } @@ -184,18 +182,18 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (items.Count == 0) return; //获取参数结构名称 - var paramNames = await GetExtraParamNamesAsync(@event.SubSystemCode); - - //如果为系统推送,则从事件中取出轨迹扩展内容填充 - foreach (var item in items) - { - //根据事件中轨迹扩展内容填充 - if (isSystemPush) - item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames)); - //根据查出的轨迹中扩展内容填充 - else - item.Data.ForEach(dict => FillExtraParam(trackPushInputDict[item].Extra, dict, paramNames)); - } + // var paramNames = await GetExtraParamNamesAsync(@event.SubSystemCode); + // + // //如果为系统推送,则从事件中取出轨迹扩展内容填充 + // foreach (var item in items) + // { + // //根据事件中轨迹扩展内容填充 + // if (isSystemPush) + // item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames)); + // //根据查出的轨迹中扩展内容填充 + // else + // item.Data.ForEach(dict => FillExtraParam(trackPushInputDict[item].Extra, dict, paramNames)); + // } using (Track2InterfaceRelaySubSystemContext.Use( new Track2InterfaceRelaySubSystemContext(@event.SubSystemCode))) @@ -237,19 +235,19 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, CreateUser = GlobalConst.SystemUser, }; - var item = BuiltUpdateItem(config, log); + var item = BuiltUpdateItem(config, log, @event.SystemPushInfo.Extra); item.Log = JsonConvert.SerializeObject(log); items.Add(item); } if (items.Count == 0) return; - //获取参数结构名称 - var paramNames = await GetExtraParamNamesAsync(@event.SubSystemCode); - - //根据事件中轨迹扩展内容填充请求 - foreach (var item in items) - item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames)); + // //获取参数结构名称 + // var paramNames = await GetExtraParamNamesAsync(@event.SubSystemCode); + // + // //根据事件中轨迹扩展内容填充请求 + // foreach (var item in items) + // item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames)); using (Track2InterfaceRelaySubSystemContext.Use( new Track2InterfaceRelaySubSystemContext(@event.SubSystemCode))) @@ -267,16 +265,16 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } } - private TrackUpdateInput BuiltUpdateItem(TrackPushContentConfigDto config, TrackPushRecordIndex log) + private TrackUpdateInput BuiltUpdateItem(TrackPushContentConfigDto config, TrackPushRecordIndex log, string? extraJson) { var trackDatetime = log.TrackTime.AddHours(config.TrackTimeZone ?? log.TrackTimeZone - log.TrackTimeZone); var trackDateStr = DateTimeFormat(trackDatetime, config.TrackTimeZone ?? log.TrackTimeZone, config); var body = new TrackUpdateInput { - OrderNo = log.OrderNo, + OrderNo = log.OrderNo }; - var dict = new Dictionary() + var dict = new Dictionary() { //推真实的发生地和发生时间(时间是计算后的) { "location", log.TrackPlace }, @@ -286,7 +284,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { "descriptionCn", config.TrackContentValue }, { "code", config.TrackContentCodeValue }, { "status", config.TrackStatusValue }, - { "extra", config.ExpandFieldsValue } + { "extra", DeserializeForTextJson(extraJson) } }; body.Data.Add(dict); log.PushContent = body.ToJson(); @@ -294,7 +292,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe return body; } - private async Task BuiltPushItem(TrackPushContentConfigDto config, TrackPushRecordIndex log) + private async Task BuiltPushItem(TrackPushContentConfigDto config, TrackPushRecordIndex log, string? extraJson) { var trackDatetime = log.TrackTime.AddHours(config.TrackTimeZone ?? log.TrackTimeZone - log.TrackTimeZone); var trackDateStr = DateTimeFormat(trackDatetime, config.TrackTimeZone ?? log.TrackTimeZone, config); @@ -303,7 +301,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { OrderNo = log.OrderNo, }; - var dict = new Dictionary() + var dict = new Dictionary() { // 推真实的发生地和发生时间(时间是计算后的) { "location", log.TrackPlace }, @@ -313,7 +311,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { "descriptionCn", config.TrackContentValue }, { "code", config.TrackContentCodeValue }, { "status", config.TrackStatusValue }, - { "extra", config.ExpandFieldsValue } + { "extra", DeserializeForTextJson(extraJson) } }; body.Data.Add(dict); @@ -322,12 +320,12 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var history = await _trackPushRecordEsRepository.GetLatestTrackPushRecordAsync(log.OrderId); if (history != default) { - body = JsonConvert.DeserializeObject(history.PushContent); + body = DeserializeForTextJson(history.PushContent); body!.Data.Add(dict); } } - log.PushContent = body.ToJson(); + log.PushContent = SerializeForTextJson(body); return body; } @@ -381,6 +379,15 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe return dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffK"); } + private string SerializeForTextJson(object? obj) + { + return obj == null ? string.Empty : System.Text.Json.JsonSerializer.Serialize(obj); + } + private T? DeserializeForTextJson(string? json) + { + return string.IsNullOrWhiteSpace(json) ? default : System.Text.Json.JsonSerializer.Deserialize(json); + } + /// /// 获取来源系统接口的参数名 /// @@ -430,7 +437,6 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } } - private Dictionary ExtractTrackExtraDict(string trackExtraStr) { var dict = new Dictionary(); From 7d8e8c584a505394fa85c2da4e8aa3d02ff70024 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Mon, 23 Dec 2024 14:33:27 +0800 Subject: [PATCH 17/80] =?UTF-8?q?update:=20=E6=9B=B4=E6=96=B0=E5=A5=91?= =?UTF-8?q?=E7=BA=A6=E6=A8=A1=E5=9E=8B=EF=BC=8C=E8=B0=83=E6=95=B4=E7=89=88?= =?UTF-8?q?=E6=9C=AC7.0.7=20=3D>=207.0.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackPush/TrackPushContentConfigDto.cs | 1 + .../Dtos/TrackPush/TrackPushInput.cs | 4 ++-- .../SJZY.Track.Application.Contract.csproj | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushContentConfigDto.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushContentConfigDto.cs index 7e4464ed..345bec99 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushContentConfigDto.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushContentConfigDto.cs @@ -70,6 +70,7 @@ public class TrackPushContentConfigDto /// /// 扩展字段参数值 /// + [Obsolete("废弃属性,调整为从轨迹明细扩展中获取扩展值填入")] public string? ExpandFieldsValue { get; set; } /// diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs index e650d04a..1111637f 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs @@ -5,7 +5,7 @@ public class TrackPushInput public string OrderNo { get; set; } = null!; //原TrackItem,为了扩展字段入参变更为字典 - public List> Data { get; set; } = new(); + public List> Data { get; set; } = new(); public string Log { get; set; } } @@ -15,7 +15,7 @@ public class TrackUpdateInput public string OrderNo { get; set; } = null!; //原TrackItem,为了扩展字段入参变更为字典 - public List> Data { get; set; } = new(); + public List> Data { get; set; } = new(); public string Log { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj index 4782626f..7645500b 100644 --- a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj +++ b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj @@ -5,7 +5,7 @@ net7.0 True - 7.0.7 + 7.0.8 True From 74c66fff3f763da6f4a734d9a460ec420d71aa0b Mon Sep 17 00:00:00 2001 From: xiaolipro <2357729423@qq.com> Date: Tue, 24 Dec 2024 11:52:58 +0800 Subject: [PATCH 18/80] review --- .../CAP/EventHandlers/TrackPushEventHandler.cs | 8 ++++++++ .../CAP/EventHandlers/TrackUpsertEventHandler.cs | 3 +++ .../Rabbit/TrackPushCompletedEventHandler.cs | 3 +++ 3 files changed, 14 insertions(+) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index d2669e14..bcec6d49 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -2,6 +2,7 @@ using System.Text.Json; using DotNetCore.CAP; using Microsoft.Extensions.Options; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.InterfaceRelay.Application.Contracts; using SJZY.OTel; @@ -388,6 +389,12 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe return string.IsNullOrWhiteSpace(json) ? default : System.Text.Json.JsonSerializer.Deserialize(json); } + + /* + * review by xiaolipro at 2024-12-24 + * todo:无用的方法,可以删除 @王云龙 + */ + /// /// 获取来源系统接口的参数名 /// @@ -427,6 +434,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (string.IsNullOrWhiteSpace(trackExtraJson)) return; + dict.TryAdd("extra",JObject.FromObject(trackExtraJson)); var trackExtra = ExtractTrackExtraDict(trackExtraJson); if (trackExtra.Count == 0) return; diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index a0a07af3..c168aa11 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -49,6 +49,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe var content = await HandleTrackAsync(@event, canNextOrderIds); + // todo: 广播提取到一个服务里去,异步处理,不影响主流程 // 处理广播事件 PublicTrackTopic(@event, content); @@ -247,6 +248,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe EstimatedDeliveryDate = @event.EstimatedDeliveryDate }); + + // todo:推送是否广播传入 // 触发轨迹推送事件(异步) var trackPushEvent = new TrackPushEvent { diff --git a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs index 5dd5e7ed..2e2c8c56 100644 --- a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs +++ b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs @@ -82,6 +82,7 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl log.Message = @event.Message; log.RequestId = @event.RequestId; + // todo:这里不需要查es,log里面有 //查出推送轨迹,写入推送广播 var tracks = await _trackDetailsEsRepository .GetListAsync(new[] { log.OrderId }, new List @@ -145,6 +146,8 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl /// private async Task PublicTrackPushTopicAsync(TrackDetailsIndex track, TrackPushRecordIndex pushRecord, bool isFailure = false, string? errorMsg = null) { + // view by xiaolipro at 2024-12-24 + // todo:热路径下进行数据库查询影响性能,建议减少或缓存,或异步处理@王云龙 var statusList = await _trackStatusRepository.GetListAsync(m => m.SubSystemId == track.SubSystemId); if (statusList == null) return; From b6a2cc8615be3d5afbd4b7fa36b702344c53ed64 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Tue, 24 Dec 2024 15:09:12 +0800 Subject: [PATCH 19/80] =?UTF-8?q?update:=20=E4=BC=98=E5=8C=96=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E7=9B=B8=E5=85=B3=E5=B9=BF=E6=92=AD,=E6=8A=BD?= =?UTF-8?q?=E7=A6=BB=E5=B9=BF=E6=92=AD=E4=B8=BABroadcastingService?= =?UTF-8?q?=EF=BC=8C=E6=B6=89=E5=8F=8A=E8=BD=A8=E8=BF=B9=E5=8F=98=E6=9B=B4?= =?UTF-8?q?=EF=BC=8C=E8=BD=A8=E8=BF=B9=E6=8E=A8=E9=80=81=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E3=80=82=20update-eto:=20=20-=20rename:=20TrackPushEto=20->=20?= =?UTF-8?q?TrackPushCompletedEvent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Events/TrackPushCompletedEvent.cs | 82 +++++++++++ .../Events/TrackPushEvent.cs | 5 + .../EventHandlers/TrackPushEventHandler.cs | 137 +----------------- .../EventHandlers/TrackUpsertEventHandler.cs | 65 ++------- .../Rabbit/TrackPushCompletedEventHandler.cs | 103 +------------ .../Broadcasting/BroadcastingService.cs | 103 +++++++++++++ .../TrackPushRecordIndex.cs | 10 ++ 7 files changed, 223 insertions(+), 282 deletions(-) create mode 100644 src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs create mode 100644 src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs new file mode 100644 index 00000000..6d8646ef --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs @@ -0,0 +1,82 @@ +namespace SJZY.Track.Application.Contract.Events; + +/// +/// 轨迹推送广播模型 +/// +public class TrackPushCompletedEvent +{ + /// + /// 是否为手动推送 + /// + public bool IsManualPush { get; set; } + + /// + /// 推送时间 + /// + public DateTime PushTime { get; set; } + + /// + /// 操作人 + /// + public string? OperationMan { get; set; } + + /// + /// 订单号 + /// + public string OrderNo { get; set; } = null!; + + /// + /// 接口通请求Id + /// + public Guid RequestId { get; set; } + + /// + /// 信息 + /// + public string Message { get; set; } = null!; + + /// + /// 操作类型 + /// + public string OptionType { get; set; } = null!; + + /// + /// 轨迹状态 + /// + public string TrackStatus { get; set; } = null!; + + /// + /// 轨迹内容代码 + /// + public string TrackCode { get; set; } = null!; + + /// + /// 轨迹内容 + /// + public string TrackContent { get; set; } = null!; + + /// + /// 轨迹发生地 + /// + public string TrackPlace { get; set; } = null!; + + /// + /// 轨迹发生时间 + /// + public DateTime TrackTime { get; set; } + + /// + /// 轨迹发生时区 + /// + public float TrackTimeZone { get; set; } + + /// + /// 是否成功 + /// + public bool IsSuccess { get; set; } + + /// + /// 推送内容(json) + /// + public string PushContent { get; set; } = null!; +} diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs index f51929db..ab033510 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs @@ -46,6 +46,11 @@ public class TrackPushEvent /// 是否强制推送 /// public bool ForcedPush { get; set; } + + /// + /// 是否发送到mq + /// + public bool IsToMq { get; set; } } public struct SystemPushStruct diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index bcec6d49..a4e74aeb 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -1,11 +1,8 @@ -using System.Text.Json; using DotNetCore.CAP; using Microsoft.Extensions.Options; using Newtonsoft.Json; -using Newtonsoft.Json.Linq; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.InterfaceRelay.Application.Contracts; -using SJZY.OTel; using SJZY.Track.Application.Contract.Dtos.TrackPush; using SJZY.Track.Application.Contract.Events; using SJZY.Track.Application.Contract.Services; @@ -127,6 +124,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe TrackTime = @event.SystemPushInfo.TrackTime, TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, CreateUser = GlobalConst.SystemUser, + SubSystemCode = @event.SubSystemCode, + IsToMq = @event.IsToMq }; var item = await BuiltPushItem(config, log, @event.SystemPushInfo.Extra); item.Log = JsonConvert.SerializeObject(log); @@ -173,6 +172,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe TrackTime = track.TrackTime, TrackTimeZone = track.TrackTimeZone, CreateUser = @event.OperationMan, + SubSystemCode = @event.SubSystemCode, + IsToMq = @event.IsToMq }; var item = await BuiltPushItem(config, log, track.Extra); item.Log = JsonConvert.SerializeObject(log); @@ -182,20 +183,6 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (items.Count == 0) return; - //获取参数结构名称 - // var paramNames = await GetExtraParamNamesAsync(@event.SubSystemCode); - // - // //如果为系统推送,则从事件中取出轨迹扩展内容填充 - // foreach (var item in items) - // { - // //根据事件中轨迹扩展内容填充 - // if (isSystemPush) - // item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames)); - // //根据查出的轨迹中扩展内容填充 - // else - // item.Data.ForEach(dict => FillExtraParam(trackPushInputDict[item].Extra, dict, paramNames)); - // } - using (Track2InterfaceRelaySubSystemContext.Use( new Track2InterfaceRelaySubSystemContext(@event.SubSystemCode))) { @@ -235,6 +222,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe TrackTime = @event.SystemPushInfo.TrackTime, TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, CreateUser = GlobalConst.SystemUser, + SubSystemCode = @event.SubSystemCode, + IsToMq = @event.IsToMq }; var item = BuiltUpdateItem(config, log, @event.SystemPushInfo.Extra); item.Log = JsonConvert.SerializeObject(log); @@ -243,13 +232,6 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (items.Count == 0) return; - // //获取参数结构名称 - // var paramNames = await GetExtraParamNamesAsync(@event.SubSystemCode); - // - // //根据事件中轨迹扩展内容填充请求 - // foreach (var item in items) - // item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames)); - using (Track2InterfaceRelaySubSystemContext.Use( new Track2InterfaceRelaySubSystemContext(@event.SubSystemCode))) { @@ -384,114 +366,9 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { return obj == null ? string.Empty : System.Text.Json.JsonSerializer.Serialize(obj); } + private T? DeserializeForTextJson(string? json) { return string.IsNullOrWhiteSpace(json) ? default : System.Text.Json.JsonSerializer.Deserialize(json); } - - - /* - * review by xiaolipro at 2024-12-24 - * todo:无用的方法,可以删除 @王云龙 - */ - - /// - /// 获取来源系统接口的参数名 - /// - /// - /// - private async Task> GetExtraParamNamesAsync(string subSystemCode) - { - using var span = ActivityHelper.CreateSpanActivity("开始请求接口通,接口结构"); - using (Track2InterfaceRelaySubSystemContext.Use( - new Track2InterfaceRelaySubSystemContext(subSystemCode))) - { - var res = await _httpClientProxy.Service.GetSystemInterfaceByIdAsync(_options.CurrentValue.PushTrackInterfaceCode, _options.CurrentValue.PushTrackInterfaceId); - if (res == null) return new List(); - span.SetTag("request-GetSystemInterfaceByIdAsync", $"PushTrackInterfaceCode[{subSystemCode}]," + - $"PushTrackInterfaceCode:[{_options.CurrentValue.PushTrackInterfaceCode}]," + - $"PushTrackInterfaceId:[{_options.CurrentValue.PushTrackInterfaceId}]," + - $"PushTrackItemParamAliasPrefix:[{_options.CurrentValue.PushTrackItemParamAliasPrefix}]"); - span.SetTag("response-GetSystemInterfaceByIdAsync", res.ToJson()); - return res.InParameterList - .Where(x => x.Alias.StartsWith(_options.CurrentValue.PushTrackItemParamAliasPrefix)) - .Select(x => x.Name) - .ToList(); - } - } - - /// - /// 填充来源于轨迹扩展字段的参数 - /// - /// 轨迹明细扩展字段Json - /// 要扩展的参数字典 - /// 来源扩展字段的参数名 - /// - private void FillExtraParam(string? trackExtraJson, Dictionary? dict, List? paramNames) - { - if (paramNames == null || paramNames.Count == 0) return; - if (dict == null) return; - - if (string.IsNullOrWhiteSpace(trackExtraJson)) return; - - dict.TryAdd("extra",JObject.FromObject(trackExtraJson)); - var trackExtra = ExtractTrackExtraDict(trackExtraJson); - - if (trackExtra.Count == 0) return; - foreach (var item in - trackExtra.Where(x => x.Value != null && paramNames.Contains(x.Key))) - { - dict.TryAdd(item.Key, item.Value); - } - } - - private Dictionary ExtractTrackExtraDict(string trackExtraStr) - { - var dict = new Dictionary(); - var trackExtra = JsonConvert.DeserializeObject>(trackExtraStr); - if (trackExtra == null) return dict; - foreach (var pair in trackExtra) - { - if (pair.Value is JsonElement jEl) - { - object? objVal = null; - switch (jEl.ValueKind) - { - case JsonValueKind.String: - objVal = jEl.GetString(); - // 处理字符串值 - break; - case JsonValueKind.Number: - objVal = jEl.GetDouble(); - // 处理数值 - break; - case JsonValueKind.True: - case JsonValueKind.False: - objVal = jEl.GetBoolean(); - // 处理布尔值 - break; - case JsonValueKind.Object: - // 处理对象 - break; - case JsonValueKind.Array: - // 处理数组 - break; - case JsonValueKind.Null: - // 处理空值 - break; - default: - // 处理未知类型 - break; - } - - if (objVal == null) continue; - dict.TryAdd(pair.Key, objVal); - continue; - } - - dict.TryAdd(pair.Key, pair.Value); - } - - return dict; - } } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index c168aa11..c9fa94d1 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -1,9 +1,8 @@ -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.Application.Services.Broadcasting; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Dtos.TrackContents; @@ -20,7 +19,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe private readonly IOrderRepository _orderRepository; private readonly IProvideQueries _provideQueries; private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; - private readonly RabbitClientBus _rabbitClientBus; + private readonly BroadcastingService _broadcastingService; private readonly IOrderOperationRecordEsRepository _orderOperationRecordEsRepository; public TrackUpsertEventHandler( @@ -28,15 +27,15 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe ICapPublisher capPublisher, IProvideQueries provideQueries, ITrackDetailsEsRepository trackDetailsEsRepository, - RabbitClientBus rabbitClientBus, - IOrderOperationRecordEsRepository orderOperationRecordEsRepository) + IOrderOperationRecordEsRepository orderOperationRecordEsRepository, + BroadcastingService broadcastingService) { _orderRepository = orderRepository; _capPublisher = capPublisher; _provideQueries = provideQueries; _trackDetailsEsRepository = trackDetailsEsRepository; - _rabbitClientBus = rabbitClientBus; _orderOperationRecordEsRepository = orderOperationRecordEsRepository; + _broadcastingService = broadcastingService; } [CapSubscribe(GlobalConst.TrackUpsertSubscribe, Group = GlobalConst.TrackUpsertSubscribe)] @@ -49,62 +48,15 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe var content = await HandleTrackAsync(@event, canNextOrderIds); - // todo: 广播提取到一个服务里去,异步处理,不影响主流程 // 处理广播事件 - PublicTrackTopic(@event, content); + if (content is { IsToMq: true }) + await _broadcastingService.TrackChangePublicTopicAsync(@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, - TrackPlaceNationId = eto.TrackPlaceNationId, - TrackPlaceProvince = eto.TrackPlaceProvince, - TrackPlaceProvinceId = eto.TrackPlaceProvinceId, - TrackPlaceCity = eto.TrackPlaceCity, - TrackPlaceCityId = eto.TrackPlaceCityId, - 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, - Extra = eto.Extra - }; - - 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) { // 根据订单关联关系异步向下刷(异步) @@ -268,7 +220,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackTimeZone = @event.TrackTimeZone, Extra = @event.Extra }, - ForcedPush = @event.ForcedPush + ForcedPush = @event.ForcedPush, + IsToMq = trackContent.IsToMq }; await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, trackPushEvent); diff --git a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs index 2e2c8c56..3a5fed9f 100644 --- a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs +++ b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs @@ -4,17 +4,12 @@ using BSI.Stack.Rabbit.Handler; using Newtonsoft.Json; using RabbitMQ.Client.Events; using SJZY.Expand.ABP.Core.Logger; -using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.InterfaceRelay.Application.Contracts; -using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Dtos.TrackPush; -using SJZY.Track.Application.Contract.Events; using SJZY.Track.Application.Helpers; +using SJZY.Track.Application.Services.Broadcasting; 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.Enums; using Volo.Abp.DependencyInjection; @@ -24,24 +19,15 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl { private readonly IOrderRepository _orderRepository; private readonly ITrackPushRecordEsRepository _trackPushRecordEsRepository; - private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; - private readonly ITrackStatusRepository _trackStatusRepository; - private readonly ITrackContentRepository _trackContentRepository; - private readonly RabbitClientBus _rabbitClientBus; + private readonly BroadcastingService _broadcastingService; public TrackPushCompletedEventHandler(IOrderRepository orderRepository, ITrackPushRecordEsRepository trackPushRecordEsRepository, - ITrackDetailsEsRepository trackDetailsEsRepository, - ITrackStatusRepository trackStatusRepository, - ITrackContentRepository trackContentRepository, - RabbitClientBus rabbitClientBus) + BroadcastingService broadcastingService) { _orderRepository = orderRepository; _trackPushRecordEsRepository = trackPushRecordEsRepository; - _trackDetailsEsRepository = trackDetailsEsRepository; - _trackStatusRepository = trackStatusRepository; - _trackContentRepository = trackContentRepository; - _rabbitClientBus = rabbitClientBus; + _broadcastingService = broadcastingService; } public ConsumeOptions Options() @@ -71,7 +57,7 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl } else if (optionType == OptionType.修改.ToString()) { - logStr = JsonConvert.DeserializeObject>(@event.RequestParams)!.First().Log;; + logStr = JsonConvert.DeserializeObject>(@event.RequestParams)!.First().Log; } if (logStr.IsNullOrEmpty()) throw new InvalidOperationException(); @@ -82,16 +68,9 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl log.Message = @event.Message; log.RequestId = @event.RequestId; - // todo:这里不需要查es,log里面有 - //查出推送轨迹,写入推送广播 - var tracks = await _trackDetailsEsRepository - .GetListAsync(new[] { log.OrderId }, new List - { - log.TrackCode - }); - // 推送广播 - await PublicTrackPushTopicAsync(tracks.First(), log, !log.IsSuccess, log.Message); + if (log.IsToMq) + await _broadcastingService.TrackPushCompletedPublicTopicAsync(log); // 往es 写推送日志 await _trackPushRecordEsRepository.AddAsync(log); @@ -140,72 +119,4 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl }); } } - - /// - /// 轨迹推送广播 - /// - private async Task PublicTrackPushTopicAsync(TrackDetailsIndex track, TrackPushRecordIndex pushRecord, bool isFailure = false, string? errorMsg = null) - { - // view by xiaolipro at 2024-12-24 - // todo:热路径下进行数据库查询影响性能,建议减少或缓存,或异步处理@王云龙 - var statusList = await _trackStatusRepository.GetListAsync(m => m.SubSystemId == track.SubSystemId); - if (statusList == null) - return; - - var contentList = await _trackContentRepository.GetTrackContentBySyetemIdAsync(track.SubSystemId); - if (contentList == null) - return; - - var status = statusList.FirstOrDefault(m => m.Code == track.TrackStatusCode); - if (status == null || !status.IsToMq) - return; - - var content = contentList.FirstOrDefault(m => m.TrackContentCode == track.TrackCode); - - var data = new TrackPushEto - { - Option = pushRecord.OptionType == OptionType.新增.ToString() ? OptionType.新增 : OptionType.修改, - IsManualPush = !string.Equals(pushRecord.CreateUser, GlobalConst.SystemUser), //操作人不为系统用户,则认为是仍推送 - IsFailure = isFailure, - FailureReason = errorMsg, - PushTime = DateTime.Now, - OperationMan = pushRecord.CreateUser, - EstimatedDeliveryDate = track.EstimatedDeliveryDate, - TrackPlacePostcode = track.TrackPlacePostcode, - TrackPlaceNation = track.TrackPlaceNation, - TrackPlaceNationId = track.TrackPlaceNationId, - TrackPlaceProvince = track.TrackPlaceProvince, - TrackPlaceProvinceId = track.TrackPlaceProvinceId, - TrackPlaceCity = track.TrackPlaceCity, - TrackPlaceCityId = track.TrackPlaceCityId, - Files = track.Files?.Select(x => new FileItemDto - { - OssKey = x.OssKey, - FileName = x.FileName - }).ToList(), - Remarks = track.Remarks, - Source = track.Source, - IsVisibility = track.IsVisibility, - TrackTimeZone = track.TrackTimeZone, - TrackTime = track.TrackTime, - TrackPlace = track.TrackPlace, - TrackStatusCode = track.TrackStatusCode, - EnStatus = track.TrackEnContent, - Content = track.TrackContent, - TrackCode = track.TrackCode, - SubSystemId = track.SubSystemId, - OrderNo = track.OrderNo, - OrderIdentifiers = new OrderIdentifier[] - { - new OrderIdentifier - { - OrderId = track.OrderId, - OrderNo = track.OrderNo, - OrderType = track.OrderType - } - }, - Extra = track.Extra - }; - _rabbitClientBus.Publish(GlobalConst.TrackPushExchange, $"TrackPush.{content.SubSystemCode}", Encoding.UTF8.GetBytes(data.ToJson())); - } } diff --git a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs new file mode 100644 index 00000000..68b3ddea --- /dev/null +++ b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs @@ -0,0 +1,103 @@ +using System.Text; +using BSI.Stack.Rabbit; +using SJZY.Expand.ABP.Core.PublicMethords; +using SJZY.Track.Application.Contract.Events; +using SJZY.Track.Domain.Aggregates.TrackPushAggregate; +using SJZY.Track.Domain.Dtos.TrackContents; +using Volo.Abp.DependencyInjection; + +namespace SJZY.Track.Application.Services.Broadcasting; + +/// +/// 广播服务 +/// +public class BroadcastingService : ITransientDependency +{ + private readonly RabbitClientBus _rabbitClientBus; + + public BroadcastingService(RabbitClientBus rabbitClientBus) + { + _rabbitClientBus = rabbitClientBus; + } + + /// + /// 轨迹变更广播 + /// + /// + /// + /// + public Task TrackChangePublicTopicAsync(TrackUpsertEvent eto, TrackContentVO content) + { + return Task.Run(() => + { + var data = new TrackChangeEto + { + 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, + 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, + Extra = eto.Extra + }; + + if (eto.IsAdd) + data.Option = 1; + else + data.Option = 3; + + _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{content.SubSystemCode}", Encoding.UTF8.GetBytes(data.ToJson())); + return Task.CompletedTask; + }); + } + + /// + /// 轨迹推送完成广播 + /// + /// + /// + public Task TrackPushCompletedPublicTopicAsync(TrackPushRecordIndex log) + { + return Task.Run(() => + { + var data = new TrackPushCompletedEvent + { + RequestId = log.RequestId, + IsSuccess = log.IsSuccess, + Message = log.Message, + OperationMan = log.CreateUser, + PushTime = DateTime.Now, + OptionType = log.OptionType, + IsManualPush = !string.Equals(log.CreateUser, GlobalConst.SystemUser), //操作人不为系统用户,则认为是仍推送 + PushContent = log.PushContent, + OrderNo = log.OrderNo, + TrackStatus = log.TrackStatus, + TrackContent = log.TrackContent, + TrackTimeZone = log.TrackTimeZone, + TrackTime = log.TrackTime, + TrackPlace = log.TrackPlace, + TrackCode = log.TrackCode + }; + + _rabbitClientBus.Publish(GlobalConst.TrackPushExchange, $"TrackPush.{log.SubSystemCode}", Encoding.UTF8.GetBytes(data.ToJson())); + return Task.CompletedTask; + }); + } +} diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs index f983a5a6..c8731039 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs @@ -82,4 +82,14 @@ public class TrackPushRecordIndex : IdBaseIndex /// 创建时间 public DateTime CreateTime { get; set; } + + /// + /// 子系统代码 + /// + public string SubSystemCode { get; set; } + + /// + /// 是否广播 + /// + public bool IsToMq { get; set; } } From 64b19d88d6e8d979374c00bd88b33583ae97fdfa Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Tue, 24 Dec 2024 15:09:50 +0800 Subject: [PATCH 20/80] =?UTF-8?q?del:=E5=88=A0=E9=99=A4TrackPushEto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Events/TrackPushEto.cs | 159 ------------------ 1 file changed, 159 deletions(-) delete mode 100644 src/SJZY.Track.Application.Contract/Events/TrackPushEto.cs diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushEto.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushEto.cs deleted file mode 100644 index 01a421fe..00000000 --- a/src/SJZY.Track.Application.Contract/Events/TrackPushEto.cs +++ /dev/null @@ -1,159 +0,0 @@ -using SJZY.Track.Application.Contract.Dtos.ProvideServices; - -namespace SJZY.Track.Application.Contract.Events; - -/// -/// 轨迹推送广播模型 -/// -public class TrackPushEto -{ - /// - /// 是否新增 - /// - public OptionType Option { get; set; } - - /// - /// 是否为手动推送 - /// - public bool IsManualPush { get; set; } - - /// - /// 推送是否失败 - /// - public bool IsFailure { get; set; } - - /// - /// 失败原因 - /// - public string? FailureReason { get; set; } - - /// - /// 推送时间 - /// - public DateTime PushTime { get; set; } - - /// - /// 操作人 - /// - public string? OperationMan { get; set; } - - /// - /// 子系统id - /// - public int SubSystemId { get; set; } - - /// - /// 单号 - /// - public string OrderNo { get; set; } - - /// - /// 客户id - /// - public int CustomId { get; set; } - - /// - /// 订单id - /// - public OrderIdentifier[] OrderIdentifiers { get; set; } = null!; - - /// - /// 轨迹内容代码 - /// - 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; } - - /// - /// 轨迹发生地(城市)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 string? Extra { get; set; } -} From 4c5db5cc360da938807683cd2d42ddd0990af94a Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Tue, 24 Dec 2024 15:31:54 +0800 Subject: [PATCH 21/80] =?UTF-8?q?config-change:=E6=9B=B4=E6=96=B0apollo?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SJZY.Track.Api/appsettings.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/SJZY.Track.Api/appsettings.json b/src/SJZY.Track.Api/appsettings.json index 0c0044ed..beb55965 100644 --- a/src/SJZY.Track.Api/appsettings.json +++ b/src/SJZY.Track.Api/appsettings.json @@ -1,16 +1,16 @@ { "Configuration": { - "UseLocalConfiguration": true, + "UseLocalConfiguration": false, //是否使用本地配置文件 "ConfiguraFileName": "appsettings.Development.json", //指定配置文件名称,开启UseLocalConfiguration时生效 "Apollo": { "AppId": "SJZY.Track.Configuration", "Env": "DEV", - "Namespace": "dev", - "MetaServer": "http://apollo-service-test-apollo-configservice.apollo.svc.cluster.local:8080", + "Namespace": "test", + "MetaServer": "https://apollo.test.shijizhongyun.com", "ConfigServer": [ - "http://apollo-service-test-apollo-configservice.apollo.svc.cluster.local:8080" + "https://apollo.test.shijizhongyun.com" ] } }, From 22a2019cc1130dd7c42579abb5272c3092cc09e5 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 26 Dec 2024 10:43:48 +0800 Subject: [PATCH 22/80] =?UTF-8?q?update:=20=E5=88=A0=E9=99=A4=E4=B8=8D?= =?UTF-8?q?=E5=BF=85=E8=A6=81=E7=9A=84=E4=BF=AE=E9=A5=B0=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=EF=BC=8C=E5=8E=BB=E6=8E=89=E5=A4=9A=E4=BD=99todo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CAP/EventHandlers/TrackDeleteEventHandler.cs | 2 +- .../CAP/EventHandlers/TrackUpsertEventHandler.cs | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index 038f9499..9a2c74f2 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -276,7 +276,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe OrderId = order.Id, OrderNo = order.OrderNo, OptionType = OrderOperationType.删除轨迹.ToString(), - Content = deleteTracks?.Where(m => m.OrderId == order.Id).ToList().ToJson(), + Content = deleteTracks.Where(m => m.OrderId == order.Id).ToList().ToJson(), CreateUserId = @event.OperationManId, CreateUserName = @event.OperationMan ?? "", CreateTime = DateTime.Now diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index c9fa94d1..a20ec106 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -199,9 +199,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe DestinationTimeZone = @event.DestinationTimeZone, EstimatedDeliveryDate = @event.EstimatedDeliveryDate }); - - - // todo:推送是否广播传入 + // 触发轨迹推送事件(异步) var trackPushEvent = new TrackPushEvent { From 988ab384f99c4c9d4e2072ea38196ac79db2069d Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 26 Dec 2024 10:50:32 +0800 Subject: [PATCH 23/80] =?UTF-8?q?update:=20=E6=A0=87=E8=AE=B0[CustomerResu?= =?UTF-8?q?lt]=E4=BD=BF=E5=BE=97=E4=B8=89=E6=96=B9=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E6=AD=A3=E5=B8=B8=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ProvideServices/TrackPushService.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs index 3934c950..49000107 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs @@ -1,4 +1,5 @@ using DotNetCore.CAP; +using SJZY.Expand.ABP.Core.Common; using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Dtos.TrackOrder; using SJZY.Track.Application.Contract.Dtos.TrackPush; @@ -47,6 +48,7 @@ public class TrackPushService : ApplicationService, ITrackPushService /// /// [HttpPost("Track/Push")] + [CustomerResult] public async Task PushTrackAsync(PushTrackInput input) { input.OrderNos = input.OrderNos.Where(x => !x.IsNullOrWhiteSpace()).Distinct().ToList(); // 单号去重、去空 @@ -101,6 +103,7 @@ public class TrackPushService : ApplicationService, ITrackPushService /// /// [HttpGet("Track/GetTrackPushContentList")] + [CustomerResult] public async Task> GetTrackPushContentListAsync(int subSystemId, int customerId) { var list = await _trackPushConfigRepository.GetTrackPushContentListAsync(subSystemId, customerId); @@ -116,6 +119,7 @@ public class TrackPushService : ApplicationService, ITrackPushService /// /// [HttpGet("Track/GetTrackPushRecords")] + [CustomerResult] public async Task> GetTrackPushRecordsAsync([FromQuery] OrderNoInfo input) { var orderId = await _orderRepository.GetFirstAsync(x => From 801b58bdee7924c2eea14e56e8d063ff6ad1c5c7 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 26 Dec 2024 11:27:13 +0800 Subject: [PATCH 24/80] =?UTF-8?q?update:=20=E4=BD=BF=E7=94=A8UnifyResultDt?= =?UTF-8?q?o=E5=8C=85=E8=A3=85=EF=BC=8C=E6=9B=B4=E6=96=B0=E5=A5=91?= =?UTF-8?q?=E7=BA=A6=E5=8C=85=E8=87=B37.0.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SJZY.Track.Application.Contract.csproj | 2 +- .../Services/ProvideServices/ITrackPushService.cs | 6 +++--- .../Services/ProvideServices/TrackPushService.cs | 13 +++++++------ 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj index 7645500b..1912b1d1 100644 --- a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj +++ b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj @@ -5,7 +5,7 @@ net7.0 True - 7.0.8 + 7.0.9 True diff --git a/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackPushService.cs b/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackPushService.cs index 4ddeb81d..b7029aa6 100644 --- a/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackPushService.cs +++ b/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackPushService.cs @@ -12,7 +12,7 @@ public interface ITrackPushService : IRemoteService /// /// /// - public Task PushTrackAsync(PushTrackInput input); + public Task PushTrackAsync(PushTrackInput input); /// /// 获取轨迹推送内容 @@ -20,12 +20,12 @@ public interface ITrackPushService : IRemoteService /// /// 子系统id /// 客户id - public Task> GetTrackPushContentListAsync(int subSystemId, int customerId); + public Task>> GetTrackPushContentListAsync(int subSystemId, int customerId); /// /// 获取轨迹推送记录 /// /// /// - public Task> GetTrackPushRecordsAsync(OrderNoInfo input); + public Task>> GetTrackPushRecordsAsync(OrderNoInfo input); } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs index 49000107..ce902649 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs @@ -49,7 +49,7 @@ public class TrackPushService : ApplicationService, ITrackPushService /// [HttpPost("Track/Push")] [CustomerResult] - public async Task PushTrackAsync(PushTrackInput input) + public async Task PushTrackAsync(PushTrackInput input) { input.OrderNos = input.OrderNos.Where(x => !x.IsNullOrWhiteSpace()).Distinct().ToList(); // 单号去重、去空 @@ -92,7 +92,7 @@ public class TrackPushService : ApplicationService, ITrackPushService await _capPublisher.PublishAsync(GlobalConst.TrackManualPushSubscribe, trackPushEvent); } - return $"即将推送轨迹代码{input.TrackCode}给{orders.Length}个订单"; + return new UnifyResultDto(true,$"即将推送轨迹代码{input.TrackCode}给{orders.Length}个订单"); } @@ -104,13 +104,13 @@ public class TrackPushService : ApplicationService, ITrackPushService /// [HttpGet("Track/GetTrackPushContentList")] [CustomerResult] - public async Task> GetTrackPushContentListAsync(int subSystemId, int customerId) + public async Task>> GetTrackPushContentListAsync(int subSystemId, int customerId) { var list = await _trackPushConfigRepository.GetTrackPushContentListAsync(subSystemId, customerId); var result = ObjectMapper.Map, List>(list); - return result; + return new UnifyResultDto>(true, result, "操作成功"); } /// @@ -120,7 +120,7 @@ public class TrackPushService : ApplicationService, ITrackPushService /// [HttpGet("Track/GetTrackPushRecords")] [CustomerResult] - public async Task> GetTrackPushRecordsAsync([FromQuery] OrderNoInfo input) + public async Task>> GetTrackPushRecordsAsync([FromQuery] OrderNoInfo input) { var orderId = await _orderRepository.GetFirstAsync(x => x.SubSystemId == input.SubSystemId && x.OrderType == input.OrderType && input.OrderNo == x.OrderNo, @@ -132,6 +132,7 @@ public class TrackPushService : ApplicationService, ITrackPushService var records = await _trackPushRecordEsRepository.GetTrackPushRecordsAsync(orderId); - return ObjectMapper.Map, List>(records); + var res = ObjectMapper.Map, List>(records); + return new UnifyResultDto>(true, res, "操作成功"); } } From 891e01ceca169c4e4395bc0ee09f32759067720d Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 27 Dec 2024 09:59:42 +0800 Subject: [PATCH 25/80] =?UTF-8?q?update:=20=E6=96=B0=E5=A2=9E/=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E8=BD=A8=E8=BF=B9=EF=BC=88=E5=8D=95=E4=B8=AA=EF=BC=89?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=8E=B7=E5=8F=96=E4=BF=A1=E6=81=AF=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=EF=BC=8C=E4=BC=98=E5=85=88=E9=80=89=E6=8B=A9=E7=94=A8?= =?UTF-8?q?=E6=88=B7token=E8=A7=A3=E6=9E=90=EF=BC=8C=E5=A4=87=E9=80=89?= =?UTF-8?q?=E4=BC=A0=E5=85=A5=E7=9A=84OptionUserId=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update: 轨迹推送完成广播增加,轨迹明细扩展参数Extra --- .../Events/TrackPushCompletedEvent.cs | 5 +++++ .../CAP/EventHandlers/TrackPushEventHandler.cs | 9 ++++++--- .../Services/Broadcasting/BroadcastingService.cs | 3 ++- .../Services/ProvideServices/TrackService.cs | 9 ++++++--- .../TrackPushAggregate/TrackPushRecordIndex.cs | 5 +++++ .../Repositories/OrderRepository.cs | 1 - 6 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs index 6d8646ef..6e3d3987 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs @@ -79,4 +79,9 @@ public class TrackPushCompletedEvent /// 推送内容(json) /// public string PushContent { get; set; } = null!; + + /// + /// 轨迹的额外新 + /// + public string? Extra { get; set; } } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index a4e74aeb..e98c7cde 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -125,7 +125,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, CreateUser = GlobalConst.SystemUser, SubSystemCode = @event.SubSystemCode, - IsToMq = @event.IsToMq + IsToMq = @event.IsToMq, + Extra = @event.SystemPushInfo.Extra }; var item = await BuiltPushItem(config, log, @event.SystemPushInfo.Extra); item.Log = JsonConvert.SerializeObject(log); @@ -173,7 +174,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe TrackTimeZone = track.TrackTimeZone, CreateUser = @event.OperationMan, SubSystemCode = @event.SubSystemCode, - IsToMq = @event.IsToMq + IsToMq = @event.IsToMq, + Extra = track.Extra }; var item = await BuiltPushItem(config, log, track.Extra); item.Log = JsonConvert.SerializeObject(log); @@ -223,7 +225,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, CreateUser = GlobalConst.SystemUser, SubSystemCode = @event.SubSystemCode, - IsToMq = @event.IsToMq + IsToMq = @event.IsToMq, + Extra = @event.SystemPushInfo.Extra }; var item = BuiltUpdateItem(config, log, @event.SystemPushInfo.Extra); item.Log = JsonConvert.SerializeObject(log); diff --git a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs index 68b3ddea..ad52c841 100644 --- a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs +++ b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs @@ -93,7 +93,8 @@ public class BroadcastingService : ITransientDependency TrackTimeZone = log.TrackTimeZone, TrackTime = log.TrackTime, TrackPlace = log.TrackPlace, - TrackCode = log.TrackCode + TrackCode = log.TrackCode, + Extra = log.Extra }; _rabbitClientBus.Publish(GlobalConst.TrackPushExchange, $"TrackPush.{log.SubSystemCode}", Encoding.UTF8.GetBytes(data.ToJson())); diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index f124ce46..5e4b7865 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -140,11 +140,14 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: $"订单:{input.OrderNo},轨迹代码:{input.TrackCode}存在多条记录,不允许修改"); } - var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(input.OptionUserId); + var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(); if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) { - //TODO: log || ex - throw new BusinessException(message: $"调用用户中心,获取用户信息失败:{userInfo.Msg}"); + //todo:保留之前的方式 后续可去除 + userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(input.OptionUserId); + if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) + //TODO: log || ex + throw new BusinessException(message: $"调用用户中心,获取用户信息失败:{userInfo.Msg}"); } var name = userInfo.Data.UserName; diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs index c8731039..d127b5c4 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs @@ -92,4 +92,9 @@ public class TrackPushRecordIndex : IdBaseIndex /// 是否广播 /// public bool IsToMq { get; set; } + + /// + /// 轨迹额外信息 + /// + public string? Extra { get; set; } } diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index 413097c8..90e6c5bf 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -1,4 +1,3 @@ -using NUglify.Helpers; using SJZY.Expand.ABP.Core.Logger; using SJZY.Track.Domain; using SJZY.Track.Domain.Aggregates.OrderAggregate; From a9eaa5e41f4fe84fd10178d61bcc5f9e7a740743 Mon Sep 17 00:00:00 2001 From: xiaolipro <2357729423@qq.com> Date: Fri, 27 Dec 2024 10:36:57 +0800 Subject: [PATCH 26/80] review --- .../Services/Broadcasting/BroadcastingService.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs index ad52c841..de070657 100644 --- a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs +++ b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs @@ -63,7 +63,8 @@ public class BroadcastingService : ITransientDependency else data.Option = 3; - _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{content.SubSystemCode}", Encoding.UTF8.GetBytes(data.ToJson())); + _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{content.SubSystemCode}", + Encoding.UTF8.GetBytes(data.ToJson())); return Task.CompletedTask; }); } @@ -75,6 +76,7 @@ public class BroadcastingService : ITransientDependency /// public Task TrackPushCompletedPublicTopicAsync(TrackPushRecordIndex log) { + // todo: 不需要异步 return Task.Run(() => { var data = new TrackPushCompletedEvent @@ -97,7 +99,8 @@ public class BroadcastingService : ITransientDependency Extra = log.Extra }; - _rabbitClientBus.Publish(GlobalConst.TrackPushExchange, $"TrackPush.{log.SubSystemCode}", Encoding.UTF8.GetBytes(data.ToJson())); + _rabbitClientBus.Publish(GlobalConst.TrackPushExchange, $"TrackPush.{log.SubSystemCode}", + Encoding.UTF8.GetBytes(data.ToJson())); return Task.CompletedTask; }); } From 5edaa2f80cde957095dfaf9cc8ad12c83cc1bc23 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 27 Dec 2024 11:18:20 +0800 Subject: [PATCH 27/80] =?UTF-8?q?update:=20=E6=96=B0=E5=A2=9E/=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E8=BD=A8=E8=BF=B9=E5=A2=9E=E5=8A=A0IsToMq=E5=8F=82?= =?UTF-8?q?=E6=95=B0=EF=BC=8C=E6=A0=87=E8=AE=B0=E4=B8=BAtrue=E5=88=99?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E6=93=8D=E4=BD=9C=E5=90=8E=E4=B8=80=E5=AE=9A?= =?UTF-8?q?=E4=BC=9A=E6=8E=A8=E9=80=81=20update:=20MQ=E5=B9=BF=E6=92=AD?= =?UTF-8?q?=E5=BC=82=E6=AD=A5=E6=94=B9=E5=90=8C=E6=AD=A5=20update:=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=A5=91=E7=BA=A6=E5=8C=85=E7=89=88=E6=9C=AC?= =?UTF-8?q?7.0.10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProvideServices/BatchUpsertTrackInput.cs | 5 + .../Dtos/ProvideServices/UpsertTrackInput.cs | 5 + .../Events/TrackUpsertEvent.cs | 4 + .../SJZY.Track.Application.Contract.csproj | 2 +- .../EventHandlers/TrackPushEventHandler.cs | 16 ++- .../EventHandlers/TrackUpsertEventHandler.cs | 8 +- .../Rabbit/TrackPushCompletedEventHandler.cs | 2 +- .../Broadcasting/BroadcastingService.cs | 117 ++++++++---------- .../Services/ProvideServices/TrackService.cs | 4 +- 9 files changed, 88 insertions(+), 75 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs index 399f9be0..90e159cc 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs @@ -129,4 +129,9 @@ public class BatchUpsertTrackInput : OrderNosInfo /// 是否强制推送 /// public bool ForcedPush { get; set; } + + /// + /// 指定是否推送 + /// + public bool IsToMq { 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 b436b9ef..8f743c7f 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs @@ -133,4 +133,9 @@ public class UpsertTrackInput : OrderNoInfo /// 是否强制推送 /// public bool ForcedPush { get; set; } + + /// + /// 指定是否推送 + /// + public bool IsToMq { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index 9b707cdb..877fa365 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -151,6 +151,10 @@ public class TrackUpsertEvent /// public bool ForcedPush { get; set; } + /// + /// 指定是否推送 + /// + public bool IsToMq { get; set; } public override string ToString() { diff --git a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj index 1912b1d1..a1a6ebf2 100644 --- a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj +++ b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj @@ -5,7 +5,7 @@ net7.0 True - 7.0.9 + 7.0.10 True diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index e98c7cde..f6a60425 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -69,6 +69,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (@event.ForcedPush) { + //当为强制推送,会走手动推送逻辑 await DoPushAsync(@event); return; } @@ -95,7 +96,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var items = new List(); TrackPushContentConfigDto? config; var isSystemPush = @event.OperationMan == null; - if (isSystemPush) + if (isSystemPush && !@event.ForcedPush) { foreach (var order in _orders) { @@ -139,13 +140,18 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (config == null) return; var tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds, @event.TrackCode); - tracks = tracks.DistinctBy(x => x.OrderId).ToList(); // 防止重复推送 - if (tracks.Count == 0) return; // 一个能推的轨迹都不存在 // tips:人工推送只要能推就推了,不会校验已推和顺序问题,因为可能是更新 - foreach (var track in tracks) + foreach (var order in _orders) { - var order = _orders.First(x => x.Id == track.OrderId); + //取订单的下某个code的最新创建时间的轨迹 防止重复推送 + var track = tracks + .Where(x => x.OrderId == order.Id && x.TrackCode == @event.TrackCode) + .OrderByDescending(x => x.CreateTime) + .FirstOrDefault(); + + if (track == null) return; // 一个能推的轨迹都不存在 + if (config is { IsAllPush: true }) { // 强制推送只需直接查出配置 diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index a20ec106..f521f11a 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -49,8 +49,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe var content = await HandleTrackAsync(@event, canNextOrderIds); // 处理广播事件 - if (content is { IsToMq: true }) - await _broadcastingService.TrackChangePublicTopicAsync(@event, content); + if (content != null && (content.IsToMq || @event.IsToMq)) + _broadcastingService.TrackChangePublicTopicAsync(@event, content); if (canNextOrderIds.Count == 0) return; // 根据订单关联关系异步向下刷(异步) @@ -199,7 +199,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe DestinationTimeZone = @event.DestinationTimeZone, EstimatedDeliveryDate = @event.EstimatedDeliveryDate }); - + // 触发轨迹推送事件(异步) var trackPushEvent = new TrackPushEvent { @@ -219,7 +219,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe Extra = @event.Extra }, ForcedPush = @event.ForcedPush, - IsToMq = trackContent.IsToMq + IsToMq = (trackContent.IsToMq || @event.IsToMq) }; await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, trackPushEvent); diff --git a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs index 3a5fed9f..471ea081 100644 --- a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs +++ b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs @@ -70,7 +70,7 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl // 推送广播 if (log.IsToMq) - await _broadcastingService.TrackPushCompletedPublicTopicAsync(log); + _broadcastingService.TrackPushCompletedPublicTopicAsync(log); // 往es 写推送日志 await _trackPushRecordEsRepository.AddAsync(log); diff --git a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs index de070657..7e02475e 100644 --- a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs +++ b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs @@ -26,47 +26,43 @@ public class BroadcastingService : ITransientDependency /// /// /// - public Task TrackChangePublicTopicAsync(TrackUpsertEvent eto, TrackContentVO content) + public void TrackChangePublicTopicAsync(TrackUpsertEvent eto, TrackContentVO content) { - return Task.Run(() => + var data = new TrackChangeEto { - var data = new TrackChangeEto - { - 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, - 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, - Extra = eto.Extra - }; + 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, + 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, + Extra = eto.Extra + }; - if (eto.IsAdd) - data.Option = 1; - else - data.Option = 3; + if (eto.IsAdd) + data.Option = 1; + else + data.Option = 3; - _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{content.SubSystemCode}", - Encoding.UTF8.GetBytes(data.ToJson())); - return Task.CompletedTask; - }); + _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{content.SubSystemCode}", + Encoding.UTF8.GetBytes(data.ToJson())); } /// @@ -74,34 +70,29 @@ public class BroadcastingService : ITransientDependency /// /// /// - public Task TrackPushCompletedPublicTopicAsync(TrackPushRecordIndex log) + public void TrackPushCompletedPublicTopicAsync(TrackPushRecordIndex log) { - // todo: 不需要异步 - return Task.Run(() => + var data = new TrackPushCompletedEvent { - var data = new TrackPushCompletedEvent - { - RequestId = log.RequestId, - IsSuccess = log.IsSuccess, - Message = log.Message, - OperationMan = log.CreateUser, - PushTime = DateTime.Now, - OptionType = log.OptionType, - IsManualPush = !string.Equals(log.CreateUser, GlobalConst.SystemUser), //操作人不为系统用户,则认为是仍推送 - PushContent = log.PushContent, - OrderNo = log.OrderNo, - TrackStatus = log.TrackStatus, - TrackContent = log.TrackContent, - TrackTimeZone = log.TrackTimeZone, - TrackTime = log.TrackTime, - TrackPlace = log.TrackPlace, - TrackCode = log.TrackCode, - Extra = log.Extra - }; + RequestId = log.RequestId, + IsSuccess = log.IsSuccess, + Message = log.Message, + OperationMan = log.CreateUser, + PushTime = DateTime.Now, + OptionType = log.OptionType, + IsManualPush = !string.Equals(log.CreateUser, GlobalConst.SystemUser), //操作人不为系统用户,则认为是仍推送 + PushContent = log.PushContent, + OrderNo = log.OrderNo, + TrackStatus = log.TrackStatus, + TrackContent = log.TrackContent, + TrackTimeZone = log.TrackTimeZone, + TrackTime = log.TrackTime, + TrackPlace = log.TrackPlace, + TrackCode = log.TrackCode, + Extra = log.Extra + }; - _rabbitClientBus.Publish(GlobalConst.TrackPushExchange, $"TrackPush.{log.SubSystemCode}", - Encoding.UTF8.GetBytes(data.ToJson())); - return Task.CompletedTask; - }); + _rabbitClientBus.Publish(GlobalConst.TrackPushExchange, $"TrackPush.{log.SubSystemCode}", + Encoding.UTF8.GetBytes(data.ToJson())); } } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 5e4b7865..83b36226 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -145,6 +145,7 @@ public partial class TrackService : ApplicationService, ITrackService { //todo:保留之前的方式 后续可去除 userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(input.OptionUserId); + if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) //TODO: log || ex throw new BusinessException(message: $"调用用户中心,获取用户信息失败:{userInfo.Msg}"); @@ -477,7 +478,8 @@ public partial class TrackService : ApplicationService, ITrackService EstimatedDeliveryDate = input.EstimatedDeliveryDate, DestinationTimeZone = input.DestinationTimeZone, Extra = input.Extra, - ForcedPush = input.ForcedPush + ForcedPush = input.ForcedPush, + IsToMq = input.IsToMq, }; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); } From 7148bfdc6bf3937223a9071592de92c2f402e0dc Mon Sep 17 00:00:00 2001 From: xiaolipro <2357729423@qq.com> Date: Fri, 27 Dec 2024 11:41:59 +0800 Subject: [PATCH 28/80] review --- .../CAP/EventHandlers/TrackDeleteEventHandler.cs | 16 +++++++++------- .../CAP/EventHandlers/TrackUpsertEventHandler.cs | 7 ++++--- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index 9a2c74f2..7d3c37bc 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -18,13 +18,13 @@ namespace SJZY.Track.Application.CAP.EventHandlers; 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; private readonly IOrderOperationRecordEsRepository _orderOperationRecordEsRepository; + private readonly IOrderRepository _orderRepository; + private readonly IProvideQueries _provideQueries; + private readonly RabbitClientBus _rabbitClientBus; + private readonly ITrackContentRepository _trackContentRepository; + private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; + private readonly ITrackStatusRepository _trackStatusRepository; public TrackDeleteEventHandler(IProvideQueries provideQueries, IOrderRepository orderRepository, ICapPublisher capPublisher, @@ -128,6 +128,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe private async Task PublicTrackTopicAsync(TrackDeleteEvent eto, List trackList) { + // // todo: review 这里查库太多了 if (trackList == null) return; @@ -167,7 +168,8 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe Option = 2 }; - _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{content.SubSystemCode}", Encoding.UTF8.GetBytes(data.ToJson())); + _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{content.SubSystemCode}", + Encoding.UTF8.GetBytes(data.ToJson())); } } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index a20ec106..b2d26a9a 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -15,12 +15,12 @@ namespace SJZY.Track.Application.CAP.EventHandlers; public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe { + private readonly BroadcastingService _broadcastingService; private readonly ICapPublisher _capPublisher; + private readonly IOrderOperationRecordEsRepository _orderOperationRecordEsRepository; private readonly IOrderRepository _orderRepository; private readonly IProvideQueries _provideQueries; private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; - private readonly BroadcastingService _broadcastingService; - private readonly IOrderOperationRecordEsRepository _orderOperationRecordEsRepository; public TrackUpsertEventHandler( IOrderRepository orderRepository, @@ -50,6 +50,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe // 处理广播事件 if (content is { IsToMq: true }) + // todo: review BroadcastingService抽一层接口,面向抽象编程 await _broadcastingService.TrackChangePublicTopicAsync(@event, content); if (canNextOrderIds.Count == 0) return; @@ -199,7 +200,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe DestinationTimeZone = @event.DestinationTimeZone, EstimatedDeliveryDate = @event.EstimatedDeliveryDate }); - + // 触发轨迹推送事件(异步) var trackPushEvent = new TrackPushEvent { From 987d533341b3eabfdf3a2fe56a2e424746a7fbca Mon Sep 17 00:00:00 2001 From: xiaolipro <2357729423@qq.com> Date: Fri, 27 Dec 2024 11:43:40 +0800 Subject: [PATCH 29/80] review --- .../CAP/EventHandlers/TrackUpsertEventHandler.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index f521f11a..f1f3747d 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -50,6 +50,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe // 处理广播事件 if (content != null && (content.IsToMq || @event.IsToMq)) + // todo: review BroadcastingService抽一层接口,面向抽象编程 _broadcastingService.TrackChangePublicTopicAsync(@event, content); if (canNextOrderIds.Count == 0) return; From 750e96d7cf454a47fb7c1609a504b0de729b5924 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 27 Dec 2024 15:04:59 +0800 Subject: [PATCH 30/80] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E8=BD=A8=E8=BF=B9=E6=97=B6=EF=BC=8C=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E4=B8=8D=E5=AE=8C=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repositories/TrackDetailsEsRepository.cs | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index f0c8f048..c6247003 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -378,18 +378,7 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract(x => x .Index(GlobalConst.TrackDetailsIndex) - .Source(s => s.Includes(fd => fd - .Field(f => f.OrderId) - .Field(f => f.OrderNo) - .Field(f => f.TrackStatus) - .Field(f => f.TrackCode) - .Field(f => f.TrackContent) - .Field(f => f.OriginTrackContent) - .Field(f => f.TrackPlace) - .Field(f => f.TrackTime) - .Field(f => f.ZeroTrackTime) - .Field(f => f.TrackTimeZone) - )) + .Source() .Query(q => q.Bool(b => b .Must( From c27e55b69fee6efccfcc71e0fa7392cfedd0ea1d Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 27 Dec 2024 15:52:36 +0800 Subject: [PATCH 31/80] =?UTF-8?q?update:=20=E8=8E=B7=E5=8F=96=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=A8=A1=E6=9D=BF=E5=86=85=E5=AE=B9=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=8C=89=E6=8E=92=E5=BA=8F=E9=94=AE=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackTemplate/TrackTemplateOutputVo.cs | 5 +++++ .../Repositories/TrackTemplateRepository.cs | 11 ++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/SJZY.Track.Domain/Dtos/TrackTemplate/TrackTemplateOutputVo.cs b/src/SJZY.Track.Domain/Dtos/TrackTemplate/TrackTemplateOutputVo.cs index f84f4294..9996c9b7 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackTemplate/TrackTemplateOutputVo.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackTemplate/TrackTemplateOutputVo.cs @@ -54,4 +54,9 @@ public class TemplateContentDtoVo /// 轨迹节点 /// public string Node { get; set; } + + /// + /// 排序键 + /// + public int Sort { get; set; } } diff --git a/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs index d399bcd1..2f9b4a2d 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs @@ -214,7 +214,8 @@ public class TrackTemplateRepository : BasicRepository, ITr ContentCn = b.Content, ContentEn = b.EnContent, Status = c.Status, - Node = d.NodeName + Node = d.NodeName, + Sort = a.Sort }) .ToListAsync(); @@ -222,7 +223,8 @@ public class TrackTemplateRepository : BasicRepository, ITr { var templateContents = contents.Where(x => x.TemplateId == template.Id).ToList(); - template.TemplateContents = templateContents; + //根据排序键排序 + template.TemplateContents = templateContents.OrderBy(x => x.Sort).ToList(); } return templates; @@ -262,10 +264,13 @@ public class TrackTemplateRepository : BasicRepository, ITr ContentCn = b.Content, ContentEn = b.EnContent, Status = c.Status, - Node = d.NodeName + Node = d.NodeName, + Sort = a.Sort }) .ToPagedListAsync(input.PageIndex, input.PageSize); + //返回轨迹模板内容时按排序键排序 + contents.List = contents.List.OrderBy(x => x.Sort).ToList(); return contents; } From 398f3b330f127ec16fd3641e64adb74b6216c42c Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 27 Dec 2024 16:12:07 +0800 Subject: [PATCH 32/80] =?UTF-8?q?update:=20=E8=8E=B7=E5=8F=96=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=A8=A1=E6=9D=BF=E5=A2=9E=E5=8A=A0=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=E9=94=AE=E5=8F=8D=E5=8F=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/ProvideServices/TrackTemplateContentDto.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackTemplateContentDto.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackTemplateContentDto.cs index 5e673fa4..ffabeb90 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackTemplateContentDto.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackTemplateContentDto.cs @@ -44,4 +44,9 @@ public class TemplateContentDto /// 轨迹节点 /// public string Node { get; set; } + + /// + /// 排序键 + /// + public int Sort { get; set; } } From c4ceca39c4db58fd7596544ce673dbaefe28568a Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 27 Dec 2024 18:05:41 +0800 Subject: [PATCH 33/80] =?UTF-8?q?update:=20=E5=A4=96=E9=83=A8=E6=89=8B?= =?UTF-8?q?=E5=8A=A8=E6=8E=A8=E9=80=81=EF=BC=8C=E5=85=88=E6=9F=A5=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E5=90=8E=E8=BF=9B=E8=A1=8C=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackPushEventHandler.cs | 46 ++++++++++++++ .../ProvideServices/TrackPushService.cs | 60 +++++++++++++++++-- .../ITrackDetailsEsRepository.cs | 2 +- .../Repositories/TrackDetailsEsRepository.cs | 35 +++++++---- 4 files changed, 126 insertions(+), 17 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index f6a60425..8ac75e98 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -139,6 +139,9 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); if (config == null) return; + //使用事件参数传递要推送的轨迹 + await ManualPushV2Async(@event, items, config); + goto Push; var tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds, @event.TrackCode); // tips:人工推送只要能推就推了,不会校验已推和顺序问题,因为可能是更新 @@ -189,6 +192,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } } + Push: if (items.Count == 0) return; using (Track2InterfaceRelaySubSystemContext.Use( @@ -207,6 +211,48 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } } + private async Task ManualPushV2Async(TrackPushEvent @event, List items, TrackPushContentConfigDto? config) + { + // tips:人工推送只要能推就推了,不会校验已推和顺序问题,因为可能是更新 + foreach (var order in _orders) + { + if (config is { IsAllPush: true }) + { + // 强制推送只需直接查出配置 + if (@event.ForcedPush) + config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); + // 推断 本次推送 是否可行 + else + config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); + } + + if (config == null) continue; + + //配置的类型如何和订单类型不一致则不允许推送 + if (config.OrderType != order.OrderType) continue; + + var log = new TrackPushRecordIndex + { + OptionType = @event.OptionType.ToString(), + OrderId = order.Id, + OrderNo = order.OrderNo, + TrackStatus = @event.SystemPushInfo.TrackStatus, + TrackCode = @event.TrackCode, + TrackContent = @event.SystemPushInfo.TrackContent, + TrackPlace = @event.SystemPushInfo.TrackPlace, + TrackTime = @event.SystemPushInfo.TrackTime, + TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, + CreateUser = @event.OperationMan, + SubSystemCode = @event.SubSystemCode, + IsToMq = @event.IsToMq, + Extra = @event.SystemPushInfo.Extra + }; + var item = await BuiltPushItem(config, log, @event.SystemPushInfo.Extra); + item.Log = JsonConvert.SerializeObject(log); + items.Add(item); + } + } + private async Task DoUpdateAsync(TrackPushEvent @event) { var config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs index ce902649..a7efbb5e 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs @@ -6,6 +6,7 @@ using SJZY.Track.Application.Contract.Dtos.TrackPush; using SJZY.Track.Application.Contract.Events; using SJZY.Track.Application.Contract.Services.ProvideServices; using SJZY.Track.Domain.Aggregates.OrderAggregate; +using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Dtos.TrackPush; using SJZY.Track.Domain.Queries; @@ -27,12 +28,14 @@ public class TrackPushService : ApplicationService, ITrackPushService private readonly IHttpClientProxy _requestCurrentUserService; private readonly ITrackPushConfigRepository _trackPushConfigRepository; private readonly ITrackPushRecordEsRepository _trackPushRecordEsRepository; + private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; public TrackPushService(IOrderRepository orderRepository , ICapPublisher capPublisher , ITrackPushRecordEsRepository trackPushRecordEsRepository , IHttpClientProxy requestCurrentUserService - , ITrackPushConfigRepository trackPushConfigRepository, IProvideQueries provideQueries) + , ITrackPushConfigRepository trackPushConfigRepository, IProvideQueries provideQueries, + ITrackDetailsEsRepository trackDetailsEsRepository) { _orderRepository = orderRepository; _capPublisher = capPublisher; @@ -40,6 +43,7 @@ public class TrackPushService : ApplicationService, ITrackPushService _requestCurrentUserService = requestCurrentUserService; _trackPushConfigRepository = trackPushConfigRepository; _provideQueries = provideQueries; + _trackDetailsEsRepository = trackDetailsEsRepository; } /// @@ -76,23 +80,69 @@ public class TrackPushService : ApplicationService, ITrackPushService var name = userInfo.Data.UserName; - foreach (var group in orders.GroupBy(x => x.CustomId)) + //查出需要推送的轨迹 + var tracks = await _trackDetailsEsRepository + .GetListAsync(input.SubSystemId, input.OrderType, input.OrderNos, + new List + { + input.TrackCode + }); + if (tracks.Count == 0) { + throw new BusinessException(message: "没有需要推送的轨迹"); + } + + //不同单可能会有不同的轨迹内容,先推送只推送最新的一条 + foreach (var order in orders) + { + //找出每个单的某个code的最新轨迹内容 + var track = tracks.Where(x => x.OrderId == order.Id) + .OrderByDescending(x => x.CreateTime) + .FirstOrDefault(); + if (track == null) continue; + var trackPushEvent = new TrackPushEvent { OptionType = OptionType.新增, SubSystemId = input.SubSystemId, SubSystemCode = subSystemCode, - CustomId = group.Key, - OrderIds = group.Select(x => x.Id).ToArray(), + CustomId = order.CustomId, + OrderIds = new[] { order.Id }, TrackCode = input.TrackCode, OperationMan = name, + SystemPushInfo = new SystemPushStruct() + { + TrackStatus = track.TrackStatus, + TrackContent = track.TrackContent, + TrackPlace = track.TrackPlace, + TrackTime = track.TrackTime, + TrackTimeZone = track.TrackTimeZone, + Extra = track.Extra + } }; await _capPublisher.PublishAsync(GlobalConst.TrackManualPushSubscribe, trackPushEvent); } - return new UnifyResultDto(true,$"即将推送轨迹代码{input.TrackCode}给{orders.Length}个订单"); + + // foreach (var group in orders.GroupBy(x => x.CustomId)) + // { + // var trackPushEvent = new TrackPushEvent + // { + // OptionType = OptionType.新增, + // SubSystemId = input.SubSystemId, + // SubSystemCode = subSystemCode, + // CustomId = group.Key, + // OrderIds = group.Select(x => x.Id).ToArray(), + // TrackCode = input.TrackCode, + // OperationMan = name, + // SystemPushInfo = new SystemPushStruct() + // }; + // + // await _capPublisher.PublishAsync(GlobalConst.TrackManualPushSubscribe, trackPushEvent); + // } + + return new UnifyResultDto(true, $"即将推送轨迹代码{input.TrackCode}给{orders.Length}个订单"); } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs index 6f182653..ebb18d38 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs @@ -10,7 +10,7 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService> GetLatestListAsync(int[] eventOrderIds, List trackCodes); - Task> GetListAsync(int subSystemId, int orderType, List orderNos); + Task> GetListAsync(int subSystemId, int orderType, List orderNos, List? trackCodes = null); Task AnyAsync(int orderId, string originTrackDataHash); diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index c6247003..80398584 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -372,25 +372,38 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract> GetListAsync(int subSystemId, int orderType, List orderNos) + public async Task> GetListAsync(int subSystemId, int orderType, List orderNos, List? trackCodes = null) { if (orderNos.Count < 1) return new List(); + var musts = new List, QueryContainer>> + { + mu => mu.Term(f => f.SubSystemId, subSystemId), + mu => mu + .Terms(t => t + .Field(f => f.OrderNo.Suffix("keyword")) + .Terms(orderNos) + ), + mu => mu + .Term(f => f.OrderType, orderType) + }; + + if (trackCodes != null && trackCodes.Count > 0) + { + musts.Add(mu => mu + .Terms(t => t + .Field(f => f.TrackCode.Suffix("keyword")) + .Terms(trackCodes) + )); + } + + var r = await Context.SearchAsync(x => x .Index(GlobalConst.TrackDetailsIndex) .Source() .Query(q => q.Bool(b => b - .Must( - mu => mu.Term(f => f.SubSystemId, subSystemId), - mu => mu - .Terms(t => t - .Field(f => f.OrderNo.Suffix("keyword")) - .Terms(orderNos) - ), - mu => mu - .Term(f => f.OrderType, orderType) - ) + .Must(musts) // tips:对外不暴露服务商轨迹 .MustNot(mn => mn .Term(t => t.TrackCode.Suffix("keyword"), GlobalConst.EmptyString) From 6e0ff2961433f6c50342868cc7c30d630e51a41b Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Mon, 30 Dec 2024 09:41:56 +0800 Subject: [PATCH 34/80] =?UTF-8?q?update:=E5=B9=BF=E6=92=AD=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E6=8A=BD=E8=B1=A1=E5=87=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackPush/TrackPushRecordDto.cs | 89 +++++++++++++++++++ .../Services/IBroadcastingService.cs | 22 +++++ .../EventHandlers/TrackUpsertEventHandler.cs | 9 +- .../Rabbit/TrackPushCompletedEventHandler.cs | 32 ++++++- .../Broadcasting/BroadcastingService.cs | 24 ++--- .../Dtos/TrackContents/TrackContentVO.cs | 5 ++ .../Queries/IProvideQueries.cs | 8 ++ .../Queries/ProvideQueries.cs | 24 +++++ 8 files changed, 192 insertions(+), 21 deletions(-) create mode 100644 src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs create mode 100644 src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs new file mode 100644 index 00000000..7bb84c1c --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs @@ -0,0 +1,89 @@ +namespace SJZY.Track.Application.Contract.Dtos.TrackPush; + +public class TrackPushRecordDto +{ + /// + /// 子系统代码 + /// + public string SubSystemCode { get; set; } + + /// + /// 是否为手动推送 + /// + public bool IsManualPush { get; set; } + + /// + /// 推送时间 + /// + public DateTime PushTime { get; set; } + + /// + /// 操作人 + /// + public string? OperationMan { get; set; } + + /// + /// 订单号 + /// + public string OrderNo { get; set; } = null!; + + /// + /// 接口通请求Id + /// + public Guid RequestId { get; set; } + + /// + /// 信息 + /// + public string Message { get; set; } = null!; + + /// + /// 操作类型 + /// + public string OptionType { get; set; } = null!; + + /// + /// 轨迹状态 + /// + public string TrackStatus { get; set; } = null!; + + /// + /// 轨迹内容代码 + /// + public string TrackCode { get; set; } = null!; + + /// + /// 轨迹内容 + /// + public string TrackContent { get; set; } = null!; + + /// + /// 轨迹发生地 + /// + public string TrackPlace { get; set; } = null!; + + /// + /// 轨迹发生时间 + /// + public DateTime TrackTime { get; set; } + + /// + /// 轨迹发生时区 + /// + public float TrackTimeZone { get; set; } + + /// + /// 是否成功 + /// + public bool IsSuccess { get; set; } + + /// + /// 推送内容(json) + /// + public string PushContent { get; set; } = null!; + + /// + /// 轨迹的额外新 + /// + public string? Extra { get; set; } +} diff --git a/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs new file mode 100644 index 00000000..1b2fdbd9 --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs @@ -0,0 +1,22 @@ +using SJZY.Track.Application.Contract.Dtos.TrackPush; +using SJZY.Track.Application.Contract.Events; +using Volo.Abp.DependencyInjection; + +namespace SJZY.Track.Application.Contract.Services; + +public interface IBroadcastingService :ITransientDependency +{ + /// + /// 轨迹变更广播 + /// + /// + /// + /// + void TrackChangePublicTopicAsync(TrackUpsertEvent eto, string subSystemCode, string trackStatusCode); + + /// + /// 轨迹推送完成广播 + /// + /// + void TrackPushCompletedPublicTopicAsync(TrackPushRecordDto log); +} diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index f1f3747d..85266ae1 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -2,7 +2,7 @@ using DotNetCore.CAP; using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Track.Application.Contract.Events; -using SJZY.Track.Application.Services.Broadcasting; +using SJZY.Track.Application.Contract.Services; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Dtos.TrackContents; @@ -19,7 +19,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe private readonly IOrderRepository _orderRepository; private readonly IProvideQueries _provideQueries; private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; - private readonly BroadcastingService _broadcastingService; + private readonly IBroadcastingService _broadcastingService; private readonly IOrderOperationRecordEsRepository _orderOperationRecordEsRepository; public TrackUpsertEventHandler( @@ -28,7 +28,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe IProvideQueries provideQueries, ITrackDetailsEsRepository trackDetailsEsRepository, IOrderOperationRecordEsRepository orderOperationRecordEsRepository, - BroadcastingService broadcastingService) + IBroadcastingService broadcastingService) { _orderRepository = orderRepository; _capPublisher = capPublisher; @@ -50,8 +50,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe // 处理广播事件 if (content != null && (content.IsToMq || @event.IsToMq)) - // todo: review BroadcastingService抽一层接口,面向抽象编程 - _broadcastingService.TrackChangePublicTopicAsync(@event, content); + _broadcastingService.TrackChangePublicTopicAsync(@event, content.SubSystemCode, content.TrackStatusCode); if (canNextOrderIds.Count == 0) return; // 根据订单关联关系异步向下刷(异步) diff --git a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs index 471ea081..8144eb1c 100644 --- a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs +++ b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs @@ -6,8 +6,8 @@ using RabbitMQ.Client.Events; using SJZY.Expand.ABP.Core.Logger; using SJZY.InterfaceRelay.Application.Contracts; using SJZY.Track.Application.Contract.Dtos.TrackPush; +using SJZY.Track.Application.Contract.Services; using SJZY.Track.Application.Helpers; -using SJZY.Track.Application.Services.Broadcasting; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Enums; @@ -19,11 +19,11 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl { private readonly IOrderRepository _orderRepository; private readonly ITrackPushRecordEsRepository _trackPushRecordEsRepository; - private readonly BroadcastingService _broadcastingService; + private readonly IBroadcastingService _broadcastingService; public TrackPushCompletedEventHandler(IOrderRepository orderRepository, ITrackPushRecordEsRepository trackPushRecordEsRepository, - BroadcastingService broadcastingService) + IBroadcastingService broadcastingService) { _orderRepository = orderRepository; _trackPushRecordEsRepository = trackPushRecordEsRepository; @@ -70,7 +70,7 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl // 推送广播 if (log.IsToMq) - _broadcastingService.TrackPushCompletedPublicTopicAsync(log); + _broadcastingService.TrackPushCompletedPublicTopicAsync(BuildDto(log)); // 往es 写推送日志 await _trackPushRecordEsRepository.AddAsync(log); @@ -119,4 +119,28 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl }); } } + + private TrackPushRecordDto BuildDto(TrackPushRecordIndex log) + { + return new TrackPushRecordDto + { + SubSystemCode = log.SubSystemCode, + RequestId = log.RequestId, + IsSuccess = log.IsSuccess, + Message = log.Message, + OperationMan = log.CreateUser, + PushTime = DateTime.Now, + OptionType = log.OptionType, + IsManualPush = !string.Equals(log.CreateUser, GlobalConst.SystemUser), //操作人不为系统用户,则认为是仍推送 + PushContent = log.PushContent, + OrderNo = log.OrderNo, + TrackStatus = log.TrackStatus, + TrackContent = log.TrackContent, + TrackTimeZone = log.TrackTimeZone, + TrackTime = log.TrackTime, + TrackPlace = log.TrackPlace, + TrackCode = log.TrackCode, + Extra = log.Extra + }; + } } diff --git a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs index 7e02475e..1fc0f24a 100644 --- a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs +++ b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs @@ -1,17 +1,16 @@ using System.Text; using BSI.Stack.Rabbit; using SJZY.Expand.ABP.Core.PublicMethords; +using SJZY.Track.Application.Contract.Dtos.TrackPush; using SJZY.Track.Application.Contract.Events; -using SJZY.Track.Domain.Aggregates.TrackPushAggregate; -using SJZY.Track.Domain.Dtos.TrackContents; -using Volo.Abp.DependencyInjection; +using SJZY.Track.Application.Contract.Services; namespace SJZY.Track.Application.Services.Broadcasting; /// /// 广播服务 /// -public class BroadcastingService : ITransientDependency +public class BroadcastingService : IBroadcastingService { private readonly RabbitClientBus _rabbitClientBus; @@ -24,9 +23,10 @@ public class BroadcastingService : ITransientDependency /// 轨迹变更广播 /// /// - /// + /// 子系统代码 + /// 轨迹状态代码 /// - public void TrackChangePublicTopicAsync(TrackUpsertEvent eto, TrackContentVO content) + public void TrackChangePublicTopicAsync(TrackUpsertEvent eto, string subSystemCode, string trackStatusCode) { var data = new TrackChangeEto { @@ -45,7 +45,7 @@ public class BroadcastingService : ITransientDependency TrackTimeZone = eto.TrackTimeZone, TrackTime = eto.TrackTime, TrackPlace = eto.TrackPlace, - TrackStatusCode = content.TrackStatusCode, + TrackStatusCode = trackStatusCode, EnStatus = eto.EnStatus, Content = eto.Content, TrackCode = eto.TrackCode, @@ -61,7 +61,7 @@ public class BroadcastingService : ITransientDependency else data.Option = 3; - _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{content.SubSystemCode}", + _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{subSystemCode}", Encoding.UTF8.GetBytes(data.ToJson())); } @@ -70,17 +70,17 @@ public class BroadcastingService : ITransientDependency /// /// /// - public void TrackPushCompletedPublicTopicAsync(TrackPushRecordIndex log) + public void TrackPushCompletedPublicTopicAsync(TrackPushRecordDto log) { var data = new TrackPushCompletedEvent { RequestId = log.RequestId, IsSuccess = log.IsSuccess, Message = log.Message, - OperationMan = log.CreateUser, - PushTime = DateTime.Now, + OperationMan = log.OperationMan, + PushTime = log.PushTime, OptionType = log.OptionType, - IsManualPush = !string.Equals(log.CreateUser, GlobalConst.SystemUser), //操作人不为系统用户,则认为是仍推送 + IsManualPush = log.IsManualPush, //操作人不为系统用户,则认为是仍推送 PushContent = log.PushContent, OrderNo = log.OrderNo, TrackStatus = log.TrackStatus, diff --git a/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs b/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs index 07982ec1..374787e5 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs @@ -2,6 +2,11 @@ namespace SJZY.Track.Domain.Dtos.TrackContents; public class TrackContentVO { + /// + /// 子系统Id + /// + public int SubSystemId { get; set; } + /// /// 子系统代码 /// diff --git a/src/SJZY.Track.Domain/Queries/IProvideQueries.cs b/src/SJZY.Track.Domain/Queries/IProvideQueries.cs index 351224c5..d955ffda 100644 --- a/src/SJZY.Track.Domain/Queries/IProvideQueries.cs +++ b/src/SJZY.Track.Domain/Queries/IProvideQueries.cs @@ -52,6 +52,14 @@ public interface IProvideQueries /// Task GetTrackContentAsync(int subSystemId, string trackCode); + /// + /// 获取轨迹内容 + /// + /// 子系统ids + /// 轨迹代码集合 + /// + Task> GetTrackContentsAsync(int[] subSystemIds, string[] trackCodes); + /// /// 获取所有拉取配置 /// diff --git a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs index b59a308d..d60f5cf0 100644 --- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs +++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs @@ -117,6 +117,30 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen .FirstAsync(); } + public async Task> GetTrackContentsAsync(int[] subSystemIds, string[] trackCodes) + { + return await Context.Queryable() + .LeftJoin((x, y) => x.TrackStatusId == y.Id) + .LeftJoin((x, y, z) => x.SubSystemId == z.Id) + .Where(x => subSystemIds.Contains(x.SubSystemId) && trackCodes.Contains(x.Code)) + .Select((x, y, z) => new TrackContentVO + { + SubSystemId = x.SubSystemId, + SubSystemCode = z.Key, + TrackStatusId = x.TrackStatusId, + TrackStatus = y.Status, + TrackStatusCode = y.Code, + TrackContent = x.Content, + TrackEnContent = x.EnContent, + IsCompleted = y.IsCompleted, + IsRepeatable = x.IsRepeatable, + IsAllowManuallyUpdate = x.IsAllowManuallyUpdate, + IsAllowManuallyCreate = x.IsAllowManuallyCreate, + IsToMq = y.IsToMq, + }) + .ToListAsync(); + } + public async Task> GetAllPullConfigsAsync() { return await Context.Queryable() From c92351a601a6e480676e9765d8033766ba875c1e Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Mon, 30 Dec 2024 15:45:44 +0800 Subject: [PATCH 35/80] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9code+=E8=BD=A8=E8=BF=B9=E5=8F=91=E7=94=9F=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E5=85=81=E8=AE=B8=E9=87=8D=E5=A4=8D=E7=9A=84bug?= 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 85266ae1..87dbc962 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -271,9 +271,9 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe //覆盖场景:B,C if (trackContent.IsRepeatable && existTracks.Length >= 1) { - if (existTracks.Any(x => x.TrackPlace == @event.TrackPlace && x.TrackTime == @event.TrackTime)) + if (existTracks.Any(x => x.TrackTime == @event.TrackTime)) { - //允许重复,出现【轨迹发生地】,【轨迹发生时间】的都重复,则不允许新增 + //TrackCode TrackTime联合不能重复 continue; } From a7e303a77a382fa8b50a20e830c634e2fc33c991 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Tue, 31 Dec 2024 11:58:47 +0800 Subject: [PATCH 36/80] =?UTF-8?q?add-interface:=E5=A2=9E=E5=8A=A0=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=9F=A5=E8=AF=A2=E6=8F=90=E4=BE=9B=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=88=E8=BF=94=E5=9B=9E=E5=8E=9F=E5=A7=8B=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=EF=BC=89QueryV2Async?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update:更新轨迹删除广播方式,减少不必要的查库 update:添加轨迹查询的创建时间的二级排序(原只按轨迹发生时间) --- .../Dtos/ProvideServices/GetTrackInput.cs | 39 ++- .../Services/IBroadcastingService.cs | 14 +- .../Services/ProvideServices/ITrackService.cs | 9 + .../EventHandlers/TrackDeleteEventHandler.cs | 79 +++--- .../Broadcasting/BroadcastingService.cs | 16 ++ .../ProvideServices/TrackService.Query.cs | 230 +++++++++++++++++- .../Services/ProvideServices/TrackService.cs | 4 +- .../ITrackDetailsEsRepository.cs | 2 + .../Queries/ProvideQueries.cs | 13 +- .../Repositories/TrackDetailsEsRepository.cs | 10 +- 10 files changed, 346 insertions(+), 70 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackInput.cs index b36217c3..e2249ae1 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackInput.cs @@ -1,5 +1,8 @@ namespace SJZY.Track.Application.Contract.Dtos.ProvideServices; +/// +/// 支持模板,传入时区补正,按轨迹发生时间升序降序 +/// public class GetTrackInput : OrderNosInfo { private float? _timeZone; @@ -8,16 +11,28 @@ public class GetTrackInput : OrderNosInfo /// 时区 +8 +8.25 -8.5 -9 /// 不传默认+8 /// - public float? TimeZone - { - get => _timeZone ?? 8; - set => _timeZone = value; - } + public float? TimeZone { get => _timeZone ?? 8; set => _timeZone = value; } /// /// 排序方式,默认按轨迹发生时间降序 /// public SortMethod? SortMethod { get; set; } + + /// + /// 轨迹模板代码 + /// + public string? TrackTemplateCode { get; set; } +} + +/// +/// 不支持模板,无时区补正,按轨迹发生时间升序降序 +/// +public class GetTrackInputV2 : OrderNosInfo +{ + /// + /// 排序方式,默认按轨迹发生时间降序 + /// + public SortMethod? SortMethod { get; set; } } public enum SortMethod @@ -25,10 +40,20 @@ public enum SortMethod /// /// 按轨迹发生时间排序 /// - ByTrackTime, + ByTrackTime = 0, /// /// 按轨迹发生时间降序 /// - ByTrackTimeDesc, + ByTrackTimeDesc = 1, + + /// + /// 模板排序+轨迹发生时间 + /// + ByTemplateAndTrackTime = 2, + + /// + /// 模板排序+轨迹发生时间 + /// + ByTemplateAndTrackTimeDesc = 3 } diff --git a/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs index 1b2fdbd9..0f79f83d 100644 --- a/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs +++ b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs @@ -4,10 +4,10 @@ using Volo.Abp.DependencyInjection; namespace SJZY.Track.Application.Contract.Services; -public interface IBroadcastingService :ITransientDependency +public interface IBroadcastingService : ITransientDependency { /// - /// 轨迹变更广播 + /// 轨迹变更广播(新增/修改) /// /// /// @@ -15,7 +15,15 @@ public interface IBroadcastingService :ITransientDependency void TrackChangePublicTopicAsync(TrackUpsertEvent eto, string subSystemCode, string trackStatusCode); /// - /// 轨迹推送完成广播 + /// 轨迹变更广播(删除) + /// + /// + /// + /// + void TrackChangePublicTopicAsync(TrackDeleteEvent eto, OrderIdentifier[] orderIdentifiers, string trackCode, string trackStatusCode, string subSystemCode); + + /// + /// 轨迹推送完成广播(推送完成回调) /// /// void TrackPushCompletedPublicTopicAsync(TrackPushRecordDto log); diff --git a/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackService.cs b/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackService.cs index c5fd0430..0921c05d 100644 --- a/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackService.cs +++ b/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackService.cs @@ -35,8 +35,17 @@ public interface ITrackService : IRemoteService /// /// 根据订单号获取轨迹 + /// 支持模板,传入时区补正,按轨迹发生时间升序降序 /// /// /// Task>> QueryAsync(GetTrackInput input); + + /// + /// 根据订单号获取轨迹 + /// 不支持模板,无时区补正,可按轨迹发生时间升序降序 + /// + /// + /// + Task>> QueryV2Async(GetTrackInputV2 input); } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index 7d3c37bc..7568071b 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -1,14 +1,11 @@ -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.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Events; +using SJZY.Track.Application.Contract.Services; 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; @@ -21,27 +18,21 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe private readonly IOrderOperationRecordEsRepository _orderOperationRecordEsRepository; private readonly IOrderRepository _orderRepository; private readonly IProvideQueries _provideQueries; - private readonly RabbitClientBus _rabbitClientBus; - private readonly ITrackContentRepository _trackContentRepository; private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; - private readonly ITrackStatusRepository _trackStatusRepository; + private readonly IBroadcastingService _broadcastingService; public TrackDeleteEventHandler(IProvideQueries provideQueries, IOrderRepository orderRepository, ICapPublisher capPublisher, ITrackDetailsEsRepository trackDetailsEsRepository, - RabbitClientBus rabbitClientBus, - ITrackStatusRepository trackStatusRepository, - ITrackContentRepository trackContentRepository, - IOrderOperationRecordEsRepository orderOperationRecordEsRepository) + IOrderOperationRecordEsRepository orderOperationRecordEsRepository, + IBroadcastingService broadcastingService) { _provideQueries = provideQueries; _orderRepository = orderRepository; _capPublisher = capPublisher; _trackDetailsEsRepository = trackDetailsEsRepository; - _rabbitClientBus = rabbitClientBus; - _trackStatusRepository = trackStatusRepository; - _trackContentRepository = trackContentRepository; _orderOperationRecordEsRepository = orderOperationRecordEsRepository; + _broadcastingService = broadcastingService; } [CapSubscribe(GlobalConst.TrackDeleteSubscribe, Group = GlobalConst.TrackDeleteSubscribe)] @@ -51,8 +42,9 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe var trackList = await DeleteTrackAsync(@event); - //发布事件 - await PublicTrackTopicAsync(@event, trackList); + //当轨迹删除,根据轨迹标记/状态上IsToMq选择进行广播 + if (trackList.Count != 0) + await PublicTrackTopicAsync(@event, trackList); // 根据订单关联关系异步向下刷(异步) await DownByOrderLink(@event); @@ -128,48 +120,41 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe private async Task PublicTrackTopicAsync(TrackDeleteEvent eto, List trackList) { - // // todo: review 这里查库太多了 - if (trackList == null) - return; + var systemIds = trackList.Select(x => x.SubSystemId).Distinct().ToArray(); + var trackCodes = trackList.Select(x => x.TrackCode).Distinct().ToArray(); - var statusList = await _trackStatusRepository.GetListAsync(m => m.SubSystemId == eto.SubSystemId); - if (statusList == null) - return; + //从轨迹内容中查询出标记是否需要mq广播 + var contentList = await _provideQueries.GetTrackContentsAsync(systemIds, trackCodes); + var toMqDict = contentList + .ToDictionary(x => x.SubSystemId + x.TrackContentCode, y => y.IsToMq); - var contentList = await _trackContentRepository.GetTrackContentBySyetemIdAsync(eto.SubSystemId); - if (contentList == null) - return; + //选出需要广播的轨迹,并按code和订单号分组 + var trackGroup = trackList + .Where(x => toMqDict[x.SubSystemId + x.TrackCode]) + .GroupBy(m => new + { + m.TrackCode, + m.OrderNo + }) + .ToList(); + if (trackGroup.Count == 0) return; - foreach (var dataItem in trackList.GroupBy(m => new - { - m.TrackCode, - m.OrderNo - })) + foreach (var dataItem in trackGroup) { var item = dataItem.First(); - var status = statusList.FirstOrDefault(m => m.Code == item.TrackStatusCode); - if (status == null || !status.IsToMq) - continue; + var content = contentList.First(m => m.TrackContentCode == item.TrackCode); - var content = contentList.FirstOrDefault(m => m.TrackContentCode == item.TrackCode); - - var data = new TrackChangeEto() - { - OrderIdentifiers = dataItem.Select(m => new OrderIdentifier + _broadcastingService.TrackChangePublicTopicAsync(eto, + 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())); + item.TrackCode, + item.TrackStatusCode, + content.SubSystemCode + ); } } diff --git a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs index 1fc0f24a..9dfb2eb6 100644 --- a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs +++ b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs @@ -65,6 +65,22 @@ public class BroadcastingService : IBroadcastingService Encoding.UTF8.GetBytes(data.ToJson())); } + public void TrackChangePublicTopicAsync(TrackDeleteEvent eto, OrderIdentifier[] orderIdentifiers, string trackCode, string trackStatusCode, string subSystemCode) + { + var data = new TrackChangeEto + { + OrderIdentifiers = orderIdentifiers, + TrackStatusCode = trackStatusCode, + TrackCode = trackCode, + OperationMan = eto.OperationMan, + SubSystemId = eto.SubSystemId, + Option = 2 + }; + + _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{subSystemCode}", + Encoding.UTF8.GetBytes(data.ToJson())); + } + /// /// 轨迹推送完成广播 /// diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs index 6e36fae2..7e4376cf 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs @@ -1,5 +1,7 @@ using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; +using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; +using SJZY.Track.Domain.Dtos.TrackTemplate; namespace SJZY.Track.Application.Services.ProvideServices; @@ -9,6 +11,7 @@ namespace SJZY.Track.Application.Services.ProvideServices; public partial class TrackService { private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; + private readonly ITrackTemplateRepository _trackTemplateRepository; /// /// 查询轨迹 @@ -63,13 +66,13 @@ public partial class TrackService ? null : input.TimeZone ?? 8, IsDisplay = trackContentDic.TryGetValue(x.TrackCode, out var isExternal) && isExternal, - IsVisibility = x.IsVisibility, + IsVisibility = x.IsVisibility, Source = x.Source, Remarks = x.Remarks, Files = x.Files?.Select(y => new FileItemDto { - FileName = y.FileName, - OssKey = y.OssKey + FileName = y.FileName, + OssKey = y.OssKey }).ToList(), TrackPlaceCity = x.TrackPlaceCity, TrackPlaceCityId = x.TrackPlaceCityId, @@ -87,25 +90,240 @@ public partial class TrackService } // 排序 - TracksOrdered(res, input); + var sortedList = await TracksOrdered(res, input); - return new UnifyResultDto>(true, res, "操作成功"); + return new UnifyResultDto>(true, sortedList, "操作成功"); } - private void TracksOrdered(List list, GetTrackInput input) + + [HttpPost("Track/QueryV2")] + public async Task>> QueryV2Async(GetTrackInputV2 input) + { + var res = new List(); + input.OrderNos = input.OrderNos.Where(x => !x.IsNullOrWhiteSpace()).Distinct().ToList(); // 单号去重、去空 + + var details = await _trackDetailsEsRepository.GetListAsync(input.SubSystemId, input.OrderType, input.OrderNos); + + // 是否对外 + var trackCodes = details.Select(x => x.TrackCode) + .Where(x => x != GlobalConst.EmptyString) + .Distinct() + .ToList(); + + var trackContentDic = new Dictionary(); + if (!trackCodes.IsNullOrEmpty()) + { + var trackContents = await _trackContentRepository.GetListAsync(x => + x.SubSystemId == input.SubSystemId && trackCodes.Contains(x.Code), + x => new + { + x.Code, + x.IsExternal + }); + trackContents.ForEach(x => trackContentDic.Add(x.Code, x.IsExternal)); + } + + foreach (var group in details.GroupBy(x => x.OrderId)) + { + var item = new GetTrackOutput(); + var trackDetails = group.ToList(); + item.OrderNo = trackDetails.First().OrderNo; + + item.TrackDetails = trackDetails.Select(x => new TrackDetail + { + Code = x.TrackCode, + Status = x.TrackStatus, + Content = x.TrackContent, + OriginContent = x.OriginTrackContent, + Location = x.TrackPlace, + Time = x.TrackTime, + TimeZone = x.TrackTimeZone, + 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, + Extra = x.Extra + }).ToList(); + + res.Add(item); + } + + // 排序 + var sortedList = await TracksOrdered(res, input); + + return new UnifyResultDto>(true, sortedList, "操作成功"); + } + + + private async Task> TracksOrdered(List list, GetTrackInput input) { switch (input.SortMethod) { case SortMethod.ByTrackTime: + case SortMethod.ByTemplateAndTrackTime: // tips:quick-sort 直接修改原list list.ForEach(item => item.TrackDetails.Sort((a, b) => a.Time.CompareTo(b.Time))); break; case null: case SortMethod.ByTrackTimeDesc: + case SortMethod.ByTemplateAndTrackTimeDesc: list.ForEach(item => item.TrackDetails.Sort((a, b) => b.Time.CompareTo(a.Time))); break; default: throw new ArgumentOutOfRangeException(nameof(input.SortMethod), input.SortMethod, "不支持的排序方式"); } + + if (input.SortMethod != SortMethod.ByTemplateAndTrackTime + && input.SortMethod != SortMethod.ByTemplateAndTrackTimeDesc) + { + return list; + } + + //查出订单模板 + var templates = await _trackTemplateRepository.GetTrackTemplateListAsync(new GetTrackTemplateListInputVo + { + SubSystemId = input.SubSystemId, + TemplateCode = input.TrackTemplateCode + }); + + if (templates.Count == 0) + { + throw new BusinessException("轨迹模板不存在"); + } + + foreach (var getTrackOutput in list) + { + getTrackOutput.TrackDetails = SortByTemplate(getTrackOutput.TrackDetails, templates, input.SortMethod.Value); + } + + return list; + } + + + private async Task> TracksOrdered(List list, GetTrackInputV2 input) + { + switch (input.SortMethod) + { + case SortMethod.ByTrackTime: + case SortMethod.ByTemplateAndTrackTime: + // tips:quick-sort 直接修改原list + list.ForEach(item => item.TrackDetails.Sort((a, b) => a.Time.CompareTo(b.Time))); + break; + case null: + case SortMethod.ByTrackTimeDesc: + case SortMethod.ByTemplateAndTrackTimeDesc: + list.ForEach(item => item.TrackDetails.Sort((a, b) => b.Time.CompareTo(a.Time))); + break; + default: + throw new ArgumentOutOfRangeException(nameof(input.SortMethod), input.SortMethod, "不支持的排序方式"); + } + + return list; + } + + //按模板排序 + private static List SortByTemplate(List tracks, List templates, SortMethod sortMethod) + { + if (templates.Count == 0 || + tracks.Count == 0) + { + return new List(); + } + + var isAsc = sortMethod == SortMethod.ByTemplateAndTrackTime; + + var allTemplateCodes = new HashSet(); + + foreach (var template in templates) + { + tracks = Sort(tracks, template, isAsc, allTemplateCodes); + } + // tracks = templates.Aggregate(tracks, + // (current, template) => Sort(current, template, isAsc, allTemplateCodes)); + + return tracks; + } + + private static List Sort(List seq, TrackTemplateOutputVo template, bool isAsc = true, HashSet? allTemplateCodes = null) + { + if (template.TemplateContents.Count == 0) + { + return seq; + } + + // 创建一个字典,用于存储排序序列中元素的索引 + var sortDict = new Dictionary(); + template.TemplateContents.Sort((x, y) => x.Sort.CompareTo(y.Sort)); + var sortSeq = template.TemplateContents + .Select(x => seq.FirstOrDefault(y => y.Code == x.Code)) + .Where(x => x != null) + .ToList(); + for (var i = 0; i < sortSeq.Count; i++) + { + sortDict[sortSeq[i]!] = isAsc ? i : sortSeq.Count - i; + } + + // 将模板code添加到上下文集合中 + if (allTemplateCodes != null) + { + allTemplateCodes.UnionWith(template.TemplateContents.Select(x => x.Code)); + } + + // 根据排序序列和字典中的索引对序列进行排序 + // 使用稳定排序算法,如OrderBy,它保持相等元素的相对顺序 + var sorted = seq.OrderBy(item => sortDict.GetValueOrDefault(item, int.MaxValue)).ToList(); + + // 存在 + if (allTemplateCodes != null) + { + //查询到没有命中到模板的轨迹 + var noTipTemplateTracks = sorted.Where(x => !allTemplateCodes.Contains(x.Code)).ToList(); + + //查询未命中轨迹的索引字典 + var trackIdxDict = new Dictionary(); + var trackSortDict = new SortedDictionary(); + foreach (var track in noTipTemplateTracks) + { + trackIdxDict[track] = sorted.IndexOf(track); + trackSortDict[trackIdxDict[track]] = track; + } + + //没有命中的轨迹排序 + var noTipTemplateTrackSorted = (isAsc + ? noTipTemplateTracks.OrderBy(x => x.Time) + : noTipTemplateTracks.OrderByDescending(x => x.Time)) + .ToList(); + + for (var i = 0; i < trackSortDict.Count; i++) + { + //在序列中的实际位置 + var (idx, st) = trackSortDict.ElementAt(0); + //在这个位置它应该是哪个轨迹 + var track = noTipTemplateTrackSorted[0]; + //交换位置 + if (track != st) + { + var idx2 = trackIdxDict[track]; + sorted[idx2] = st; + sorted[idx] = track; + } + } + } + + return sorted; } } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 83b36226..f20c415e 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.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Enums; using SJZY.UserCenter.HttpApi.Services; using SJZY.UserCenter.HttpApi.Services.User; @@ -26,12 +27,13 @@ public partial class TrackService : ApplicationService, ITrackService public TrackService(IOrderRepository orderRepository, ICapPublisher capPublisher, ITrackDetailsEsRepository trackDetailsEsRepository, ITrackContentRepository trackContentRepository, - IHttpClientProxy requestCurrentUserService) + IHttpClientProxy requestCurrentUserService, ITrackTemplateRepository trackTemplateRepository) { _orderRepository = orderRepository; _capPublisher = capPublisher; _trackContentRepository = trackContentRepository; _requestCurrentUserService = requestCurrentUserService; + _trackTemplateRepository = trackTemplateRepository; _trackDetailsEsRepository = trackDetailsEsRepository; } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs index ebb18d38..b434e8b6 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs @@ -31,6 +31,8 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService> DeleteTrackAsync(int[] orderIds, List trackCodes); Task DeleteTrackByIdAsync(string id, string indexName); + Task> GetDataByIds(string[] ids); + Task GetDetailAsync(string orderNo, string trackCode, int orderType, int subSystemId, DateTime trackTime); } diff --git a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs index d60f5cf0..3dc93cee 100644 --- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs +++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs @@ -1,5 +1,6 @@ using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackContentAggregate; +using SJZY.Track.Domain.Aggregates.TrackFlagAggregate; using SJZY.Track.Domain.Aggregates.TrackPullAggregate; using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; using SJZY.Track.Domain.Dtos.Order; @@ -99,20 +100,22 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen return await Context.Queryable() .LeftJoin((x, y) => x.TrackStatusId == y.Id) .LeftJoin((x, y, z) => x.SubSystemId == z.Id) + .LeftJoin((x, y, z, k) => x.SubSystemId == k.SubSystemId && k.Code == x.Code) .Where(x => x.SubSystemId == subSystemId && x.Code == trackCode) - .Select((x, y, z) => new TrackContentVO + .Select((x, y, z, k) => new TrackContentVO { SubSystemCode = z.Key, TrackStatusId = x.TrackStatusId, TrackStatus = y.Status, TrackStatusCode = y.Code, + TrackContentCode = x.Code, TrackContent = x.Content, TrackEnContent = x.EnContent, IsCompleted = y.IsCompleted, IsRepeatable = x.IsRepeatable, IsAllowManuallyUpdate = x.IsAllowManuallyUpdate, IsAllowManuallyCreate = x.IsAllowManuallyCreate, - IsToMq = y.IsToMq, + IsToMq = y.IsToMq || k.IsToMq, }) .FirstAsync(); } @@ -122,21 +125,23 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen return await Context.Queryable() .LeftJoin((x, y) => x.TrackStatusId == y.Id) .LeftJoin((x, y, z) => x.SubSystemId == z.Id) + .LeftJoin((x, y, z, k) => x.SubSystemId == k.SubSystemId && k.Code == x.Code) .Where(x => subSystemIds.Contains(x.SubSystemId) && trackCodes.Contains(x.Code)) - .Select((x, y, z) => new TrackContentVO + .Select((x, y, z, k) => new TrackContentVO { SubSystemId = x.SubSystemId, SubSystemCode = z.Key, TrackStatusId = x.TrackStatusId, TrackStatus = y.Status, TrackStatusCode = y.Code, + TrackContentCode = x.Code, TrackContent = x.Content, TrackEnContent = x.EnContent, IsCompleted = y.IsCompleted, IsRepeatable = x.IsRepeatable, IsAllowManuallyUpdate = x.IsAllowManuallyUpdate, IsAllowManuallyCreate = x.IsAllowManuallyCreate, - IsToMq = y.IsToMq, + IsToMq = y.IsToMq || k.IsToMq, }) .ToListAsync(); } diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index 80398584..d7e28fbe 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -430,7 +430,10 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract t.OrderId, orderId) ) .Size(SafelyLimit) - .Sort(s => s.Field(f => f.ZeroTrackTime, SortOrder.Descending))); + .Sort(s => s + .Field(f => f.ZeroTrackTime, SortOrder.Descending) + .Field(f => f.CreateTime, SortOrder.Descending) + )); if (!r.IsValid) { @@ -463,7 +466,10 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract query) .Size(SafelyLimit) - .Sort(s => s.Field(f => f.ZeroTrackTime, SortOrder.Descending))); + .Sort(s => s + .Field(f => f.ZeroTrackTime, SortOrder.Descending) + .Field(f => f.CreateTime, SortOrder.Descending)) + ); if (!r.IsValid) { From cc91079011eae294e66754f9aa66e509c9ae7f64 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Tue, 31 Dec 2024 14:04:19 +0800 Subject: [PATCH 37/80] =?UTF-8?q?update-package:=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=A7=84=E7=BA=A6=E5=8C=85=E7=89=88=E6=9C=AC7.0.10=20->=207.0.?= =?UTF-8?q?11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SJZY.Track.Application.Contract.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj index a1a6ebf2..e9cb325e 100644 --- a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj +++ b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj @@ -5,7 +5,7 @@ net7.0 True - 7.0.10 + 7.0.11 True From 923d7a2e917f2dce077e7d6d7fb36739e1612176 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 2 Jan 2025 09:19:27 +0800 Subject: [PATCH 38/80] =?UTF-8?q?refactor:=E4=BC=98=E5=8C=96=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=9B=B4=E6=96=B0=E5=90=8E=E6=9B=B4=E6=96=B0=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E4=B8=BB=E8=A1=A8=E4=BA=8B=E4=BB=B6=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=99=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...TrackChangeAfterUpdateOrderEventHandler.cs | 42 +++++++------------ 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs index 1f32a4e3..e3a98037 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs @@ -26,8 +26,6 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa return; } - //指示是否需要更新【预计签收时间】【签收地时区】 - var isNeedUpdate = false; var updateOrders = new List(); foreach (var order in orders) { @@ -62,37 +60,23 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa { order.EstimatedDeliveryDate = @event.EstimatedDeliveryDate.Value; order.DestinationTimeZone = @event.DestinationTimeZone.Value; - isNeedUpdate = true; } updateOrders.Add(order); } - await _orderRepository.UpdateRangeAsync(updateOrders, - 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, - } + await _orderRepository.UpdateRangeAsync(updateOrders, x => new + { + x.IsCompleted, + x.LatestTrackContent, + x.LatestTrackEnContent, + x.LatestTrackPlace, + x.LatestTrackTime, + x.LatestTrackTimeZone, + x.DeficiencyTag, + x.EstimatedDeliveryDate, + x.DestinationTimeZone + } ); } @@ -109,6 +93,8 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa LatestTrackPlace = order.LatestTrackPlace, LatestTrackTime = order.LatestTrackTime, LatestTrackTimeZone = order.LatestTrackTimeZone, + DestinationTimeZone = order.DestinationTimeZone, + EstimatedDeliveryDate = order.EstimatedDeliveryDate, }); } } From db200c2212c801148df6107fc53da9608ccb3d13 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 2 Jan 2025 10:10:47 +0800 Subject: [PATCH 39/80] =?UTF-8?q?refactor:=E9=87=8D=E6=9E=84=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=8E=A8=E9=80=81=E4=BA=8B=E4=BB=B6=E5=A4=84=E7=90=86?= =?UTF-8?q?=EF=BC=8C=E7=94=B1=E4=BA=8E=E9=80=BB=E8=BE=91=E7=A8=B3=E5=AE=9A?= =?UTF-8?q?=E5=8E=BB=E9=99=A4goto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackPushEventHandler.cs | 94 +++---------------- 1 file changed, 15 insertions(+), 79 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 8ac75e98..32987bb0 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -101,7 +101,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe foreach (var order in _orders) { if (order.QuestionType == (int) TrackProblemType.Error) continue; // 系统不推异常单,只能人工操作 - // 强制推送只需直接查出配置 + // 强制推送只需直接查出配置 if (@event.ForcedPush) config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行,为了约束顺序 @@ -134,27 +134,14 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe items.Add(item); } } - else //手工推送 + // 手工或强制推送,不会校验已推和顺序问题,因为可能是更新 + else { config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); if (config == null) return; - //使用事件参数传递要推送的轨迹 - await ManualPushV2Async(@event, items, config); - goto Push; - var tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds, @event.TrackCode); - - // tips:人工推送只要能推就推了,不会校验已推和顺序问题,因为可能是更新 foreach (var order in _orders) { - //取订单的下某个code的最新创建时间的轨迹 防止重复推送 - var track = tracks - .Where(x => x.OrderId == order.Id && x.TrackCode == @event.TrackCode) - .OrderByDescending(x => x.CreateTime) - .FirstOrDefault(); - - if (track == null) return; // 一个能推的轨迹都不存在 - if (config is { IsAllPush: true }) { // 强制推送只需直接查出配置 @@ -173,26 +160,25 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var log = new TrackPushRecordIndex { OptionType = @event.OptionType.ToString(), - OrderId = track.OrderId, + OrderId = order.Id, OrderNo = order.OrderNo, - TrackStatus = track.TrackStatus, + TrackStatus = @event.SystemPushInfo.TrackStatus, TrackCode = @event.TrackCode, - TrackContent = track.TrackContent, - TrackPlace = track.TrackPlace, - TrackTime = track.TrackTime, - TrackTimeZone = track.TrackTimeZone, + TrackContent = @event.SystemPushInfo.TrackContent, + TrackPlace = @event.SystemPushInfo.TrackPlace, + TrackTime = @event.SystemPushInfo.TrackTime, + TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, CreateUser = @event.OperationMan, SubSystemCode = @event.SubSystemCode, IsToMq = @event.IsToMq, - Extra = track.Extra + Extra = @event.SystemPushInfo.Extra }; - var item = await BuiltPushItem(config, log, track.Extra); + var item = await BuiltPushItem(config, log, @event.SystemPushInfo.Extra); item.Log = JsonConvert.SerializeObject(log); items.Add(item); } } - Push: if (items.Count == 0) return; using (Track2InterfaceRelaySubSystemContext.Use( @@ -211,48 +197,6 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } } - private async Task ManualPushV2Async(TrackPushEvent @event, List items, TrackPushContentConfigDto? config) - { - // tips:人工推送只要能推就推了,不会校验已推和顺序问题,因为可能是更新 - foreach (var order in _orders) - { - if (config is { IsAllPush: true }) - { - // 强制推送只需直接查出配置 - if (@event.ForcedPush) - config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); - // 推断 本次推送 是否可行 - else - config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); - } - - if (config == null) continue; - - //配置的类型如何和订单类型不一致则不允许推送 - if (config.OrderType != order.OrderType) continue; - - var log = new TrackPushRecordIndex - { - OptionType = @event.OptionType.ToString(), - OrderId = order.Id, - OrderNo = order.OrderNo, - TrackStatus = @event.SystemPushInfo.TrackStatus, - TrackCode = @event.TrackCode, - TrackContent = @event.SystemPushInfo.TrackContent, - TrackPlace = @event.SystemPushInfo.TrackPlace, - TrackTime = @event.SystemPushInfo.TrackTime, - TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, - CreateUser = @event.OperationMan, - SubSystemCode = @event.SubSystemCode, - IsToMq = @event.IsToMq, - Extra = @event.SystemPushInfo.Extra - }; - var item = await BuiltPushItem(config, log, @event.SystemPushInfo.Extra); - item.Log = JsonConvert.SerializeObject(log); - items.Add(item); - } - } - private async Task DoUpdateAsync(TrackPushEvent @event) { var config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); @@ -372,11 +316,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe /// 根据轨迹代码推断下一个(升序)要推送的内容,如果找不到或者已经是最后一个了 /// 则查询有没有可交换的推送,没有就返回null /// - /// - /// - /// - /// - TrackPushContentConfigDto? GetValidPushConfigAsync(List cache, + private static TrackPushContentConfigDto? GetValidPushConfigAsync(List cache, string? latestPushTrackCode, string? trackCode) { var idx = cache.FindIndex(x => x.TrackCode == latestPushTrackCode); @@ -396,11 +336,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe /// /// 转换推送时间格式 /// - /// - /// - /// - /// - private string DateTimeFormat(DateTime dateTime, double timezone, TrackPushContentConfigDto config) + private static string DateTimeFormat(DateTime dateTime, double timezone, TrackPushContentConfigDto config) { if (config.DateTimeFormatType == (int) DateTimeFormatEnum.Timestamp) return DateTimeHelper.ConvertToUnixTimestamp(dateTime).ToString(); @@ -417,12 +353,12 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe return dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffK"); } - private string SerializeForTextJson(object? obj) + private static string SerializeForTextJson(object? obj) { return obj == null ? string.Empty : System.Text.Json.JsonSerializer.Serialize(obj); } - private T? DeserializeForTextJson(string? json) + private static T? DeserializeForTextJson(string? json) { return string.IsNullOrWhiteSpace(json) ? default : System.Text.Json.JsonSerializer.Deserialize(json); } From 5a43e54139c231ff9988ca2a300aebb21493b572 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 3 Jan 2025 16:38:56 +0800 Subject: [PATCH 40/80] =?UTF-8?q?refactor:=E4=BD=BF=E7=94=A8=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E4=BC=98=E5=8C=96=E8=BD=A8=E8=BF=B9=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repositories/OrderRepository.cs | 252 ++++++++++++++---- 1 file changed, 202 insertions(+), 50 deletions(-) diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index 90e6c5bf..ac00889a 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -1,3 +1,4 @@ +using Microsoft.Extensions.Caching.Memory; using SJZY.Expand.ABP.Core.Logger; using SJZY.Track.Domain; using SJZY.Track.Domain.Aggregates.OrderAggregate; @@ -10,56 +11,64 @@ namespace SJZY.Track.Repository.Repositories; public class OrderRepository : BasicRepository, IOrderRepository, ITransientDependency { - public async Task> GetTrackOrderPagedList(GetPageTrackOrderInputVO input) + //MemoryCache本身线程安全简单使用,短暂数据不一致可以容忍,每过固定时间强制清除缓存 + private static readonly MemoryCache _memoryCache = new(new MemoryCacheOptions()); + private static readonly Dictionary _empty = new(); + private static readonly Dictionary> _empty2 = new(); + private const int ThirdPartyOrderNumberCacheTimeSpan = 3 * 60; + private const int MainDataEnumCacheTimeSpan = 5 * 60; + + private async Task> GetThirdPartyOrderNumberForCacheAsync(int[] orderIds) { - //查询完去重 - var pageList = await Context.Queryable() + const string key = "ThirdPartyOrderNumber"; + if (orderIds.Length == 0) return _empty; + + var dict = _memoryCache.Get>(key); + + orderIds = orderIds.Distinct().ToArray(); + if (dict != null && dict.Count != 0 && !orderIds.Except(dict.Keys).Any()) return dict; + + var orders = 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, 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), - (a, b, c) => a.CreateTime >= input.CreateTimeStart) - .WhereIF((!input.CreateTimeStart.HasValue) && input.CreateTimeEnd.HasValue, - (a, b, c) => a.CreateTime <= input.CreateTimeEnd) - .WhereIF(input.CustomerId > 0, (a, b, c) => a.CustomId == input.CustomerId) - .WhereIF(input.TrackOrderType > 0, (a, b, c) => a.OrderType == input.TrackOrderType) - .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 + .LeftJoin((a, b) => a.Id == b.OrderId && b.IsDeleted == false) + .Where((a, b) => orderIds.Contains(a.Id)) + .Select(a => new OrderEntity() { Id = a.Id, - OrderNumber = a.OrderNo, - OrderType = a.OrderType, - QuestionType = a.QuestionType, - CustomerShortName = b.Abbreviation, - CustomerCode = b.Code, - CustomerId = a.CustomId, - NewestTrackContent = a.LatestTrackContent, - NewestTrackEnContent = a.LatestTrackEnContent, - NewestTrackPlace = a.LatestTrackPlace, - NewestTrackTime = a.LatestTrackTime, - IsFinish = a.IsCompleted, - CreateTime = a.CreateTime, - SubSystem = c.CnName, - SubSystemId = c.Id, - DestinationTimeZone = a.DestinationTimeZone, - EstimatedDeliveryDate = a.EstimatedDeliveryDate, - ThirdPartyOrderNumber = BuildThirdPartyOrderNumber(a.OrderPlatformNumbers) + OrderPlatformNumbers = a.OrderPlatformNumbers }) - .ToPagedListAsync(input.PageIndex, input.PageSize); + .ToListAsync(); + + if (orders.Count == 0) + return _empty; + + orders = orders.DistinctBy(x => x.Id).ToList(); + + dict = orders.ToDictionary(x => x.Id, x => BuildThirdPartyOrderNumber(x.OrderPlatformNumbers)); + + _memoryCache.Set(key, dict, new MemoryCacheEntryOptions + { + AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(ThirdPartyOrderNumberCacheTimeSpan), + Size = dict.Count + }); + return dict; + } + + private async Task>> GetMainDataEnumForCacheAsync(List orderTypes, List questTypes) + { + const string key = "EnumForMainData"; + if (orderTypes.Count == 0 && questTypes.Count == 0) return _empty2; + + var dict = _memoryCache.Get>>(key); + if (dict != null && dict.Count != 0 + && !orderTypes.Except(dict[GlobalConst.MainDataKey_OrderType].Keys).Any() + && !questTypes.Except(dict[GlobalConst.MainDataKey_TrackQuestionType].Keys).Any()) + { + return dict; + } - //查询订单类型描述 - var orderTypes = pageList.List.Select(x => x.OrderType).Distinct().ToList(); - var questTypes = pageList.List.Select(x => x.QuestionType).Distinct().ToList(); //从主数据中心查询类型描述 - var typeDispDict = (await Context.Queryable() + dict = (await Context.Queryable() .Where(x => (x.Property == GlobalConst.MainDataKey_OrderType && orderTypes.Contains(x.Enumkey)) || (x.Property == GlobalConst.MainDataKey_TrackQuestionType && questTypes.Contains(x.Enumkey)) @@ -78,20 +87,161 @@ public class OrderRepository : BasicRepository, IOrderRepository, I y => y.ToDictionary(x => x.Enumkey, x => x.Disp) ); + if (dict.Count == 0) + return _empty2; + + _memoryCache.Set(key, dict, new MemoryCacheEntryOptions + { + AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(MainDataEnumCacheTimeSpan), + Size = dict.Count + }); + return dict; + } + + public async Task> GetTrackOrderPagedList(GetPageTrackOrderInputVO input) + { + //查询完去重 + UnifyPageResultDto pageList; + //没传递单号时 + if (input.OrderNos.IsNullOrEmpty()) + { + pageList = await Context.Queryable() + .LeftJoin((a, b) => a.CustomId == b.Id && b.IsDeleted == false) + .LeftJoin((a, b, c) => a.SubSystemId == c.Id && c.IsDeleted == false) + .WhereIF(input.SubSystemId > 0, (a, b, c) => a.SubSystemId == input.SubSystemId) + .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), + (a, b, c) => a.CreateTime >= input.CreateTimeStart) + .WhereIF((!input.CreateTimeStart.HasValue) && input.CreateTimeEnd.HasValue, + (a, b, c) => a.CreateTime <= input.CreateTimeEnd) + .WhereIF(input.CustomerId > 0, (a, b, c) => a.CustomId == input.CustomerId) + .WhereIF(input.TrackOrderType > 0, (a, b, c) => a.OrderType == input.TrackOrderType) + .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) + .Select((a, b, c) => new TrackOrderVO + { + Id = a.Id, + OrderNumber = a.OrderNo, + OrderType = a.OrderType, + QuestionType = a.QuestionType, + CustomerShortName = b.Abbreviation, + CustomerCode = b.Code, + CustomerId = a.CustomId, + NewestTrackContent = a.LatestTrackContent, + NewestTrackEnContent = a.LatestTrackEnContent, + NewestTrackPlace = a.LatestTrackPlace, + NewestTrackTime = a.LatestTrackTime, + IsFinish = a.IsCompleted, + CreateTime = a.CreateTime, + SubSystem = c.CnName, + SubSystemId = c.Id, + DestinationTimeZone = a.DestinationTimeZone, + EstimatedDeliveryDate = a.EstimatedDeliveryDate + }) + .ToPagedListAsync(input.PageIndex, input.PageSize); + } + //传递单号时 + else + { + var orderNos = input.OrderNos!.Distinct().ToList(); + + //匹配主单 + var orderIds = await Context.Queryable() + .Where(x => orderNos.Contains(x.OrderNo)) + .Select(x => x.Id) + .ToListAsync(); + + //匹配外部单 + var orderIdsForThirdParty = await Context.Queryable() + .Where(x => !string.IsNullOrWhiteSpace(x.OrderNumber) && orderNos.Contains(x.OrderNumber)) + .Select(x => x.OrderId) + .ToListAsync(); + + var orderHashset = orderIds.ToHashSet(); + orderHashset.UnionWith(orderIdsForThirdParty); + orderIds = orderHashset.ToList(); + + //没有任何单 + if (orderIds.Count == 0) + { + return new UnifyPageResultDto + { + List = new List(), + Pagination = new PageInfoOutput() + { + PageIndex = input.PageIndex, + PageSize = input.PageSize, + Total = 0 + } + }; + } + + pageList = await Context.Queryable() + .Where(x => orderIds.Contains(x.Id)) + .LeftJoin((a, b) => a.CustomId == b.Id && b.IsDeleted == false) + .LeftJoin((a, b, c) => a.SubSystemId == c.Id && c.IsDeleted == false) + .WhereIF(input.SubSystemId > 0, (a, b, c) => a.SubSystemId == input.SubSystemId) + .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), + (a, b, c) => a.CreateTime >= input.CreateTimeStart) + .WhereIF((!input.CreateTimeStart.HasValue) && input.CreateTimeEnd.HasValue, + (a, b, c) => a.CreateTime <= input.CreateTimeEnd) + .WhereIF(input.CustomerId > 0, (a, b, c) => a.CustomId == input.CustomerId) + .WhereIF(input.TrackOrderType > 0, (a, b, c) => a.OrderType == input.TrackOrderType) + .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) + .Select((a, b, c) => new TrackOrderVO + { + Id = a.Id, + OrderNumber = a.OrderNo, + OrderType = a.OrderType, + QuestionType = a.QuestionType, + CustomerShortName = b.Abbreviation, + CustomerCode = b.Code, + CustomerId = a.CustomId, + NewestTrackContent = a.LatestTrackContent, + NewestTrackEnContent = a.LatestTrackEnContent, + NewestTrackPlace = a.LatestTrackPlace, + NewestTrackTime = a.LatestTrackTime, + IsFinish = a.IsCompleted, + CreateTime = a.CreateTime, + SubSystem = c.CnName, + SubSystemId = c.Id, + DestinationTimeZone = a.DestinationTimeZone, + EstimatedDeliveryDate = a.EstimatedDeliveryDate, + }) + .ToPagedListAsync(input.PageIndex, input.PageSize); + } + + + //补三方单号,从缓存中加速查 + var orderIdArr = pageList.List.Select(x => x.Id).ToArray(); + var thirdPartyOrderNumbers = await GetThirdPartyOrderNumberForCacheAsync(orderIdArr); + pageList.List.ForEach(x => x.ThirdPartyOrderNumber = thirdPartyOrderNumbers[x.Id]); + + //查询订单类型描述,从缓存中加速查 + var orderTypes = pageList.List.Select(x => x.OrderType).Distinct().ToList(); + var questTypes = pageList.List.Select(x => x.QuestionType).Distinct().ToList(); + var typeDisplayDict = await GetMainDataEnumForCacheAsync(orderTypes, questTypes); + //填充数描述信息 pageList.List.ForEach(x => { - x.OrderTypeName = typeDispDict.TryGetValue(GlobalConst.MainDataKey_OrderType, out var orderTypeDisplayDict) + x.OrderTypeName = typeDisplayDict.TryGetValue(GlobalConst.MainDataKey_OrderType, out var orderTypeDisplayDict) ? orderTypeDisplayDict.TryGetValue(x.OrderType, out var orderTypeDisplay) ? orderTypeDisplay - : $"未在主数据中心找到Property:[{GlobalConst.MainDataKey_OrderType}] Enumkey:[{x.OrderType}]" - : $"未在主数据中心找到Property:[{GlobalConst.MainDataKey_OrderType}]"; + : $"未在主数据中心找到Property:[{GlobalConst.MainDataKey_OrderType}] " + : $"未在主数据中心找到Property:[{GlobalConst.MainDataKey_OrderType}] EnumKey:[{x.OrderType}]"; - x.QuestionTypeName = typeDispDict.TryGetValue(GlobalConst.MainDataKey_TrackQuestionType, out var questDisplayDict) + x.QuestionTypeName = typeDisplayDict.TryGetValue(GlobalConst.MainDataKey_TrackQuestionType, out var questDisplayDict) ? questDisplayDict.TryGetValue(x.QuestionType, out var questDisplay) ? questDisplay - : $"未在主数据中心找到Property:[{GlobalConst.MainDataKey_OrderType}] Enumkey:[{x.OrderType}]" - : $"未在主数据中心找到Property:[{GlobalConst.MainDataKey_TrackQuestionType}]"; + : $"未在主数据中心找到Property:[{GlobalConst.MainDataKey_OrderType}]" + : $"未在主数据中心找到Property:[{GlobalConst.MainDataKey_TrackQuestionType}] EnumKey:[{x.OrderType}]"; }); return pageList; @@ -275,10 +425,12 @@ public class OrderRepository : BasicRepository, IOrderRepository, I /// private static string BuildThirdPartyOrderNumber(List orderPlatformNumberEntities) { + if (orderPlatformNumberEntities.Count == 0) return GlobalConst.EmptyString; const string separator = "、"; var thirdPartyOrderNumbers = orderPlatformNumberEntities .Where(x => !string.IsNullOrWhiteSpace(x.OrderNumber)) - .Select(x => $"{x.OrderNumber}({x.Platform})").ToList(); + .Select(x => $"{x.OrderNumber}({x.Platform})") + .ToList(); return string.Join(separator, thirdPartyOrderNumbers); } From bb96f96695e8791a4887897af0ce4cc7ec149572 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 3 Jan 2025 17:42:18 +0800 Subject: [PATCH 41/80] =?UTF-8?q?feat:=E6=9F=A5=E8=AF=A2=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E5=93=8D=E5=BA=94=E7=BB=93=E6=9E=9C=E7=9B=B8=E5=90=8C=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=8C=89=E6=A8=A1=E6=9D=BF=E6=8E=92=E5=BA=8F=EF=BC=88?= =?UTF-8?q?=E6=8C=89=E6=97=B6=E9=97=B4+=E6=97=B6=E5=8C=BA=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E4=B8=BA=E7=BB=9F=E4=B8=80=E6=97=B6=E9=97=B4=E5=90=8E?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProvideServices/TrackService.Query.cs | 281 ++++++++++-------- .../Services/ProvideServices/TrackService.cs | 1 + .../OrderAggregate/IOrderRepository.cs | 23 +- .../ITrackTemplateRepository.cs | 2 + .../Dtos/Order/OrderTemplateVO.cs | 13 + .../Repositories/OrderRepository.cs | 26 ++ 6 files changed, 229 insertions(+), 117 deletions(-) create mode 100644 src/SJZY.Track.Domain/Dtos/Order/OrderTemplateVO.cs diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs index 7e4376cf..1a56a04e 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs @@ -14,7 +14,7 @@ public partial class TrackService private readonly ITrackTemplateRepository _trackTemplateRepository; /// - /// 查询轨迹 + /// 查询轨迹(时区补正) /// /// /// @@ -90,12 +90,17 @@ public partial class TrackService } // 排序 - var sortedList = await TracksOrdered(res, input); + var sortedList = await TracksOrdered(res, input, input.SortMethod, input.TrackTemplateCode); return new UnifyResultDto>(true, sortedList, "操作成功"); } + /// + /// 查询轨迹(原样返回) + /// + /// + /// [HttpPost("Track/QueryV2")] public async Task>> QueryV2Async(GetTrackInputV2 input) { @@ -163,15 +168,15 @@ public partial class TrackService } // 排序 - var sortedList = await TracksOrdered(res, input); + var sortedList = await TracksOrdered(res, input, input.SortMethod); return new UnifyResultDto>(true, sortedList, "操作成功"); } - private async Task> TracksOrdered(List list, GetTrackInput input) + private async Task> TracksOrdered(List list, OrderNosInfo orderNosInfo, SortMethod? sortMethod, string? trackTemplateCode = null) { - switch (input.SortMethod) + switch (sortMethod) { case SortMethod.ByTrackTime: case SortMethod.ByTemplateAndTrackTime: @@ -184,11 +189,11 @@ public partial class TrackService list.ForEach(item => item.TrackDetails.Sort((a, b) => b.Time.CompareTo(a.Time))); break; default: - throw new ArgumentOutOfRangeException(nameof(input.SortMethod), input.SortMethod, "不支持的排序方式"); + throw new ArgumentOutOfRangeException(nameof(sortMethod), sortMethod, "不支持的排序方式"); } - if (input.SortMethod != SortMethod.ByTemplateAndTrackTime - && input.SortMethod != SortMethod.ByTemplateAndTrackTimeDesc) + if (sortMethod != SortMethod.ByTemplateAndTrackTime + && sortMethod != SortMethod.ByTemplateAndTrackTimeDesc) { return list; } @@ -196,134 +201,178 @@ public partial class TrackService //查出订单模板 var templates = await _trackTemplateRepository.GetTrackTemplateListAsync(new GetTrackTemplateListInputVo { - SubSystemId = input.SubSystemId, - TemplateCode = input.TrackTemplateCode + SubSystemId = orderNosInfo.SubSystemId, + TemplateCode = trackTemplateCode }); if (templates.Count == 0) { - throw new BusinessException("轨迹模板不存在"); + return list; } + //查出订单和模板的关系,构建订单号和模板code的关系 + var orderNoTemplateDict = (await _orderRepository + .GetOrderTemplateAsync(orderNosInfo.SubSystemId, orderNosInfo.OrderType, orderNosInfo.OrderNos)) + .ToDictionary(x => x.OrderNo, x => x.TemplateCodes?.Split(",").ToHashSet()); + + //查询出订单和模板的关联关系,保证该订单使用自己的模板排序 foreach (var getTrackOutput in list) { - getTrackOutput.TrackDetails = SortByTemplate(getTrackOutput.TrackDetails, templates, input.SortMethod.Value); + //查看该订单具有的模板 + var curOrderNoTemplateCodes = orderNoTemplateDict[getTrackOutput.OrderNo]; + if (curOrderNoTemplateCodes == null || curOrderNoTemplateCodes.Count == 0) continue; + + //选出这个订单号所具有的模板 + var tipTemplates = templates.Where(x => curOrderNoTemplateCodes.Contains(x.TemplateCode)).ToList(); + if (tipTemplates.Count == 0) continue; + + getTrackOutput.TrackDetails = SortByTemplatesAsync(getTrackOutput.TrackDetails, tipTemplates, sortMethod == SortMethod.ByTemplateAndTrackTime); } return list; } - private async Task> TracksOrdered(List list, GetTrackInputV2 input) + /// + /// 轨迹发生时间(统一utc)排序,相同时间按模板排序,考虑多个模板的情况 + /// + /// + private static List SortByTemplatesAsync(List seq, List templates, bool isAsc = true) { - switch (input.SortMethod) + //转化为统一时间 + var trackWraps = seq.Select(x => new TrackWrap(x)); + var sortedTracks = (isAsc + ? trackWraps.OrderBy(x => x.Time) + : trackWraps.OrderByDescending(x => x.Time)).ToList(); + + + //用于统计时间相同的轨迹 + var timeEqTrackDict = new Dictionary>(); + for (var i = 0; i < sortedTracks.Count; i++) { - case SortMethod.ByTrackTime: - case SortMethod.ByTemplateAndTrackTime: - // tips:quick-sort 直接修改原list - list.ForEach(item => item.TrackDetails.Sort((a, b) => a.Time.CompareTo(b.Time))); - break; - case null: - case SortMethod.ByTrackTimeDesc: - case SortMethod.ByTemplateAndTrackTimeDesc: - list.ForEach(item => item.TrackDetails.Sort((a, b) => b.Time.CompareTo(a.Time))); - break; - default: - throw new ArgumentOutOfRangeException(nameof(input.SortMethod), input.SortMethod, "不支持的排序方式"); - } - - return list; - } - - //按模板排序 - private static List SortByTemplate(List tracks, List templates, SortMethod sortMethod) - { - if (templates.Count == 0 || - tracks.Count == 0) - { - return new List(); - } - - var isAsc = sortMethod == SortMethod.ByTemplateAndTrackTime; - - var allTemplateCodes = new HashSet(); - - foreach (var template in templates) - { - tracks = Sort(tracks, template, isAsc, allTemplateCodes); - } - // tracks = templates.Aggregate(tracks, - // (current, template) => Sort(current, template, isAsc, allTemplateCodes)); - - return tracks; - } - - private static List Sort(List seq, TrackTemplateOutputVo template, bool isAsc = true, HashSet? allTemplateCodes = null) - { - if (template.TemplateContents.Count == 0) - { - return seq; - } - - // 创建一个字典,用于存储排序序列中元素的索引 - var sortDict = new Dictionary(); - template.TemplateContents.Sort((x, y) => x.Sort.CompareTo(y.Sort)); - var sortSeq = template.TemplateContents - .Select(x => seq.FirstOrDefault(y => y.Code == x.Code)) - .Where(x => x != null) - .ToList(); - for (var i = 0; i < sortSeq.Count; i++) - { - sortDict[sortSeq[i]!] = isAsc ? i : sortSeq.Count - i; - } - - // 将模板code添加到上下文集合中 - if (allTemplateCodes != null) - { - allTemplateCodes.UnionWith(template.TemplateContents.Select(x => x.Code)); - } - - // 根据排序序列和字典中的索引对序列进行排序 - // 使用稳定排序算法,如OrderBy,它保持相等元素的相对顺序 - var sorted = seq.OrderBy(item => sortDict.GetValueOrDefault(item, int.MaxValue)).ToList(); - - // 存在 - if (allTemplateCodes != null) - { - //查询到没有命中到模板的轨迹 - var noTipTemplateTracks = sorted.Where(x => !allTemplateCodes.Contains(x.Code)).ToList(); - - //查询未命中轨迹的索引字典 - var trackIdxDict = new Dictionary(); - var trackSortDict = new SortedDictionary(); - foreach (var track in noTipTemplateTracks) - { - trackIdxDict[track] = sorted.IndexOf(track); - trackSortDict[trackIdxDict[track]] = track; - } - - //没有命中的轨迹排序 - var noTipTemplateTrackSorted = (isAsc - ? noTipTemplateTracks.OrderBy(x => x.Time) - : noTipTemplateTracks.OrderByDescending(x => x.Time)) - .ToList(); - - for (var i = 0; i < trackSortDict.Count; i++) - { - //在序列中的实际位置 - var (idx, st) = trackSortDict.ElementAt(0); - //在这个位置它应该是哪个轨迹 - var track = noTipTemplateTrackSorted[0]; - //交换位置 - if (track != st) + var trackWrap = sortedTracks[i]; + if (timeEqTrackDict.TryGetValue(trackWrap.Time, out var list)) + list.Add(new TrackIdxWarp(trackWrap.Track, i)); + else + timeEqTrackDict.Add(trackWrap.Time, new List { - var idx2 = trackIdxDict[track]; - sorted[idx2] = st; - sorted[idx] = track; + new TrackIdxWarp(trackWrap.Track, i) + }); + } + + + //选出需要按模板重排序的轨迹 + var timeEqTracks = timeEqTrackDict + .Where(kv => kv.Value.Count > 1) + .ToDictionary(kv => kv.Key, kv => kv.Value); + + //初始化为最后一个模板排序 + var preSortDict = templates[templates.Count - 1] + .TemplateContents + .OrderBy(x => x.Sort) + .ToDictionary(x => x.Code, x => x.Sort); + + for (var i = templates.Count - 2; i >= 0; i--) + { + var curCodeSortDict = templates[i] + .TemplateContents + .ToDictionary(x => x.Code, y => y.Sort); + + //没在之前模板出现的code + var noTipPreCodeSortDict = curCodeSortDict + .Where(x => !preSortDict.ContainsKey(x.Key)) + .ToDictionary(x => x.Key, y => y.Value); + + //插入未命中的模板code + foreach (var (noTipCode, curNoTipCodeSort) in noTipPreCodeSortDict) + { + //初始化插入位置 + var insertPos = -1; + foreach (var (preCode, _) in preSortDict) + { + if (curCodeSortDict.TryGetValue(preCode, out var preCodeSort)) + { + //未命中的相对于之前模板的偏后,设置插入位置在 + if (preCodeSort < curNoTipCodeSort) + { + insertPos = preSortDict[preCode] + 1; + } + } + } + + //结束了还没选好位置,未命中的code相对于之前的模板code在当前模板最前面 + if (insertPos == -1) + { + foreach (var (c, s) in preSortDict) + preSortDict[c] = s + 1; + preSortDict[noTipCode] = 0; + } + else + { + foreach (var (c, s) in preSortDict.Where(x => x.Value >= insertPos)) + preSortDict[c] = s + 1; + preSortDict[noTipCode] = insertPos; } } } - return sorted; + + foreach (var trackIdxWarps in timeEqTracks.Values) + { + var curIndex = trackIdxWarps.Min(x => x.Index); + //按模板从小到大排序 + var sortByTemplate = (isAsc + ? trackIdxWarps + .OrderBy(x => preSortDict.GetValueOrDefault(x.Track.Code, int.MaxValue)) + : trackIdxWarps + .OrderByDescending(x => preSortDict.GetValueOrDefault(x.Track.Code, int.MaxValue)) + ).ToList(); + for (var j = 0; j < sortByTemplate.Count; j++) + { + var track = sortByTemplate[j]; + //当前索引不对应 + if (track.Index != curIndex + j) + { + var temp1 = sortedTracks[track.Index].Track; + var temp2 = sortedTracks[curIndex + j].Track; + sortedTracks[track.Index].Track = temp2; + sortedTracks[curIndex + j].Track = temp1; + trackIdxWarps.First(x => x.Index == curIndex + j).Index = track.Index; + track.Index = curIndex + j; + } + } + } + + return sortedTracks.Select(x => x.Track).ToList(); + } + + + private class TrackIdxWarp + { + public TrackDetail Track { get; set; } + public int Index { get; set; } + + public TrackIdxWarp(TrackDetail track, int index) + { + Track = track; + Index = index; + } + } + + + private class TrackWrap + { + public TrackDetail Track { get; set; } + + public DateTime Time { get; set; } + + public TrackWrap(TrackDetail track) + { + Track = track; + var timeZone = track.TimeZone ?? GlobalConst.NoneTrackTimeZone; + Time = Math.Abs(timeZone - GlobalConst.NoneTrackTimeZone) < 1 + ? track.Time + : track.Time.Subtract(TimeSpan.FromHours(timeZone)); + } } } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index f20c415e..eca70b47 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -30,6 +30,7 @@ public partial class TrackService : ApplicationService, ITrackService IHttpClientProxy requestCurrentUserService, ITrackTemplateRepository trackTemplateRepository) { _orderRepository = orderRepository; + this._orderRepository = orderRepository; _capPublisher = capPublisher; _trackContentRepository = trackContentRepository; _requestCurrentUserService = requestCurrentUserService; diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs index 96be07a4..467ab9c0 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs @@ -12,7 +12,7 @@ public interface IOrderRepository : IBasicRepository /// Task> GetTrackOrderPagedList(GetPageTrackOrderInputVO input); - /// + /// /// 通过三方平台和三方单号查询订单 /// /// 三方平台 @@ -62,6 +62,27 @@ public interface IOrderRepository : IBasicRepository /// Task> GetSubSystemListByCodesAsync(List codes); + #region 订单模板 + + /// + /// 根据订单id,获取订单所属的模板 + /// + /// + /// + Task> GetOrderTemplateAsync(int[] orderId); + + /// + /// 根据子系统+订单号+类型,获取订单所属的模板 + /// + /// + /// + /// + /// + Task> GetOrderTemplateAsync(int subSystemId,int orderType,List orderNos); + + #endregion + + #region 订单关联 /// diff --git a/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs index efae67b2..e8a50f2d 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs @@ -45,6 +45,8 @@ public interface ITrackTemplateRepository : IBasicRepository> whereExpression); Task> GetTrackTemplateListAsync(GetTrackTemplateListInputVo input); + Task> GetPageTrackTemplateListAsync(GetPageTrackTemplateListInputVo input); + Task> GetContentByTemplateCodes(string[] codes, int systemId); } diff --git a/src/SJZY.Track.Domain/Dtos/Order/OrderTemplateVO.cs b/src/SJZY.Track.Domain/Dtos/Order/OrderTemplateVO.cs new file mode 100644 index 00000000..26c110a0 --- /dev/null +++ b/src/SJZY.Track.Domain/Dtos/Order/OrderTemplateVO.cs @@ -0,0 +1,13 @@ +namespace SJZY.Track.Domain.Dtos.Order; + +/// +/// 订单关联的模板模型 +/// +public class OrderTemplateVO +{ + public int OrderId { get; set; } + + public string OrderNo { get; set; } + + public string? TemplateCodes { get; set; } +} diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index ac00889a..a071f693 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -396,6 +396,32 @@ public class OrderRepository : BasicRepository, IOrderRepository, I return res.Select(x => (x.Key, x.Id)).ToList(); } + public Task> GetOrderTemplateAsync(int[] orderId) + { + return Context.Queryable() + .Where(x => orderId.Contains(x.Id)) + .Select(a => new OrderTemplateVO + { + OrderId = a.Id, + OrderNo = a.OrderNo, + TemplateCodes = a.TemplateCodes + }) + .ToListAsync(); + } + + public Task> GetOrderTemplateAsync(int subSystemId, int orderType, List orderNos) + { + return Context.Queryable() + .Where(x => orderNos.Contains(x.OrderNo) && x.SubSystemId == subSystemId && x.OrderType == orderType) + .Select(a => new OrderTemplateVO + { + OrderId = a.Id, + OrderNo = a.OrderNo, + TemplateCodes = a.TemplateCodes + }) + .ToListAsync(); + } + public Task GetSystemInfoById(int id) { return Context.Queryable().FirstAsync(m => m.IsDeleted == false && m.Id == id); From 3b37d73df8217b11c7e6dd4e5808c3c5bd356aac Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Mon, 6 Jan 2025 09:45:44 +0800 Subject: [PATCH 42/80] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E5=BD=93=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E9=9C=80=E8=A6=81=E5=B1=95=E7=A4=BA=E7=9A=84=E4=B8=89?= =?UTF-8?q?=E6=96=B9=E5=8D=95=E5=8F=B7=E9=9C=80=E8=A6=81=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E2=80=9D--=E2=80=9D=EF=BC=8C=E4=B8=89=E6=96=B9=E5=8D=95?= =?UTF-8?q?=E5=8F=B7=E4=B8=BAnull=E6=97=B6=E8=A2=AB=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SJZY.Track.Repository/Repositories/OrderRepository.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index a071f693..b07a00ec 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -449,7 +449,7 @@ public class OrderRepository : BasicRepository, IOrderRepository, I /// /// /// - private static string BuildThirdPartyOrderNumber(List orderPlatformNumberEntities) + public string BuildThirdPartyOrderNumber(List orderPlatformNumberEntities) { if (orderPlatformNumberEntities.Count == 0) return GlobalConst.EmptyString; const string separator = "、"; @@ -457,6 +457,7 @@ public class OrderRepository : BasicRepository, IOrderRepository, I .Where(x => !string.IsNullOrWhiteSpace(x.OrderNumber)) .Select(x => $"{x.OrderNumber}({x.Platform})") .ToList(); + if (thirdPartyOrderNumbers.Count == 0) return GlobalConst.EmptyString; return string.Join(separator, thirdPartyOrderNumbers); } From f2c9356668676e8d7bfa99e7ab291d827939c1e0 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Tue, 7 Jan 2025 09:11:48 +0800 Subject: [PATCH 43/80] =?UTF-8?q?feat:=E8=BD=A8=E8=BF=B9=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?(QueryAsync,QueryAsyncV2)=EF=BC=8C=E5=A2=9E=E5=8A=A0=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E8=AF=B7=E6=B1=82header=E4=B8=AD=E7=9A=84=E5=AD=90?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=A0=87=E8=AF=86(SubsystemId)=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E8=BD=A8=E8=BF=B9=E7=9A=84=E5=8F=AF=E8=A7=81=E5=BA=A6?= =?UTF-8?q?=EF=BC=8C=E5=86=85=E9=83=A8=E7=B3=BB=E7=BB=9F=E6=89=80=E6=9C=89?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E5=85=A8=E9=83=A8=E5=8F=AF=E8=A7=81=EF=BC=8C?= =?UTF-8?q?=E5=A4=96=E9=83=A8=E7=B3=BB=E7=BB=9F=E5=88=99=E8=A6=81=E6=B1=82?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E5=A4=96=E9=83=A8=E8=BD=A8=E8=BF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProvideServices/TrackService.Query.cs | 30 +++++++++++++++++-- .../Services/ProvideServices/TrackService.cs | 6 +++- src/SJZY.Track.Domain/Consts/GlobalConst.cs | 1 + .../Queries/IVSystemQueries.cs | 7 +++++ .../VEntities/VSystemEntity.cs | 2 +- .../Queries/VSystemQueries.cs | 8 +++++ 6 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 src/SJZY.Track.Domain/Queries/IVSystemQueries.cs create mode 100644 src/SJZY.Track.Repository/Queries/VSystemQueries.cs diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs index 1a56a04e..833a6e03 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs @@ -1,7 +1,9 @@ +using Microsoft.AspNetCore.Http; using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Dtos.TrackTemplate; +using SJZY.Track.Domain.Queries; namespace SJZY.Track.Application.Services.ProvideServices; @@ -12,6 +14,8 @@ public partial class TrackService { private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; private readonly ITrackTemplateRepository _trackTemplateRepository; + private readonly IHttpContextAccessor _contextAccessor; + private readonly IVSystemQueries _vSystemQueries; /// /// 查询轨迹(时区补正) @@ -27,9 +31,12 @@ public partial class TrackService var details = await _trackDetailsEsRepository.GetListAsync(input.SubSystemId, input.OrderType, input.OrderNos); + //内部子系统不过滤外部轨迹 + var isFilterExternal = await HasFilterExternalTrack(); + // 是否对外 var trackCodes = details.Select(x => x.TrackCode) - .Where(x => x != GlobalConst.EmptyString) + .WhereIf(isFilterExternal, x => x != GlobalConst.EmptyString) .Distinct() .ToList(); @@ -109,9 +116,12 @@ public partial class TrackService var details = await _trackDetailsEsRepository.GetListAsync(input.SubSystemId, input.OrderType, input.OrderNos); + //内部子系统不过滤外部轨迹 + var isFilterExternal = await HasFilterExternalTrack(); + // 是否对外 var trackCodes = details.Select(x => x.TrackCode) - .Where(x => x != GlobalConst.EmptyString) + .WhereIf(isFilterExternal, x => x != GlobalConst.EmptyString) .Distinct() .ToList(); @@ -173,6 +183,22 @@ public partial class TrackService return new UnifyResultDto>(true, sortedList, "操作成功"); } + //内部系统展示所有轨迹,外部系统则要求过滤外部轨迹 + private async Task HasFilterExternalTrack() + { + var isFilter = true; + if (_contextAccessor.HttpContext!.Request.Headers.TryGetValue(GlobalConst.HTTP_HEADER_SUBSYSTEMID, out var subsystemIdStr)) + { + if (int.TryParse(subsystemIdStr, out var subsystemId)) + { + var systemEntity = await _vSystemQueries.GetFirstAsync(x => x.Id == subsystemId); + isFilter = systemEntity?.SystemProperty != 1; + } + } + + return isFilter; + } + private async Task> TracksOrdered(List list, OrderNosInfo orderNosInfo, SortMethod? sortMethod, string? trackTemplateCode = null) { diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index eca70b47..45656799 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -1,4 +1,5 @@ using DotNetCore.CAP; +using Microsoft.AspNetCore.Http; using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Events; using SJZY.Track.Application.Contract.Services.ProvideServices; @@ -7,6 +8,7 @@ using SJZY.Track.Domain.Aggregates.TrackContentAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Enums; +using SJZY.Track.Domain.Queries; using SJZY.UserCenter.HttpApi.Services; using SJZY.UserCenter.HttpApi.Services.User; using Volo.Abp.Http.Client.DynamicProxying; @@ -27,13 +29,15 @@ public partial class TrackService : ApplicationService, ITrackService public TrackService(IOrderRepository orderRepository, ICapPublisher capPublisher, ITrackDetailsEsRepository trackDetailsEsRepository, ITrackContentRepository trackContentRepository, - IHttpClientProxy requestCurrentUserService, ITrackTemplateRepository trackTemplateRepository) + IHttpClientProxy requestCurrentUserService, ITrackTemplateRepository trackTemplateRepository, IHttpContextAccessor contextAccessor, IVSystemQueries vSystemQueries) { _orderRepository = orderRepository; this._orderRepository = orderRepository; _capPublisher = capPublisher; _trackContentRepository = trackContentRepository; _requestCurrentUserService = requestCurrentUserService; + _vSystemQueries = vSystemQueries; + _contextAccessor = contextAccessor; _trackTemplateRepository = trackTemplateRepository; _trackDetailsEsRepository = trackDetailsEsRepository; } diff --git a/src/SJZY.Track.Domain/Consts/GlobalConst.cs b/src/SJZY.Track.Domain/Consts/GlobalConst.cs index c6416b1d..f081cacc 100644 --- a/src/SJZY.Track.Domain/Consts/GlobalConst.cs +++ b/src/SJZY.Track.Domain/Consts/GlobalConst.cs @@ -4,6 +4,7 @@ public partial class GlobalConst { public const string MainDataKey_OrderType = "TrackOrderType"; public const string MainDataKey_TrackQuestionType = "TrackQuestionType"; + public const string HTTP_HEADER_SUBSYSTEMID = "Subsystemid"; public const string SystemUser = "系统"; public const string EmptyString = "--"; public const int ChunkSize = 100; diff --git a/src/SJZY.Track.Domain/Queries/IVSystemQueries.cs b/src/SJZY.Track.Domain/Queries/IVSystemQueries.cs new file mode 100644 index 00000000..0f1b201a --- /dev/null +++ b/src/SJZY.Track.Domain/Queries/IVSystemQueries.cs @@ -0,0 +1,7 @@ +using SJZY.Track.Domain.VEntities; + +namespace SJZY.Track.Domain.Queries; + +public interface IVSystemQueries : IBasicQuery +{ +} diff --git a/src/SJZY.Track.Domain/VEntities/VSystemEntity.cs b/src/SJZY.Track.Domain/VEntities/VSystemEntity.cs index 4639ca98..b5a84874 100644 --- a/src/SJZY.Track.Domain/VEntities/VSystemEntity.cs +++ b/src/SJZY.Track.Domain/VEntities/VSystemEntity.cs @@ -4,7 +4,7 @@ namespace SJZY.Track.Domain.VEntities; /// /// [SugarTable("v_system")] -public class VSystemEntity : IFullAuditedBasicEntitys +public class VSystemEntity : IFullAuditedBasicEntitys, IEntity { /// /// 子系统id diff --git a/src/SJZY.Track.Repository/Queries/VSystemQueries.cs b/src/SJZY.Track.Repository/Queries/VSystemQueries.cs new file mode 100644 index 00000000..872f9ea2 --- /dev/null +++ b/src/SJZY.Track.Repository/Queries/VSystemQueries.cs @@ -0,0 +1,8 @@ +using SJZY.Track.Domain.Queries; +using SJZY.Track.Domain.VEntities; + +namespace SJZY.Track.Repository.Queries; + +public class VSystemQueries : BasicQuery, IVSystemQueries, ITransientDependency +{ +} From 55f9fba62e36b1c9a47fd4042f4e40356c37ae4e Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Tue, 7 Jan 2025 10:49:27 +0800 Subject: [PATCH 44/80] =?UTF-8?q?refactor:=E6=9F=A5=E8=AF=A2=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=8F=90=E4=BE=9B=E6=8E=A5=E5=8F=A3=EF=BC=8C=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E8=BD=A8=E8=BF=B9=E6=A8=A1=E6=9D=BF=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/ProvideServices/GetTrackInput.cs | 5 ----- .../Services/ProvideServices/TrackService.Query.cs | 7 +++---- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackInput.cs index e2249ae1..44df6107 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackInput.cs @@ -17,11 +17,6 @@ public class GetTrackInput : OrderNosInfo /// 排序方式,默认按轨迹发生时间降序 /// public SortMethod? SortMethod { get; set; } - - /// - /// 轨迹模板代码 - /// - public string? TrackTemplateCode { get; set; } } /// diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs index 833a6e03..7e377a94 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs @@ -97,7 +97,7 @@ public partial class TrackService } // 排序 - var sortedList = await TracksOrdered(res, input, input.SortMethod, input.TrackTemplateCode); + var sortedList = await TracksOrdered(res, input, input.SortMethod); return new UnifyResultDto>(true, sortedList, "操作成功"); } @@ -200,7 +200,7 @@ public partial class TrackService } - private async Task> TracksOrdered(List list, OrderNosInfo orderNosInfo, SortMethod? sortMethod, string? trackTemplateCode = null) + private async Task> TracksOrdered(List list, OrderNosInfo orderNosInfo, SortMethod? sortMethod) { switch (sortMethod) { @@ -227,8 +227,7 @@ public partial class TrackService //查出订单模板 var templates = await _trackTemplateRepository.GetTrackTemplateListAsync(new GetTrackTemplateListInputVo { - SubSystemId = orderNosInfo.SubSystemId, - TemplateCode = trackTemplateCode + SubSystemId = orderNosInfo.SubSystemId }); if (templates.Count == 0) From 47ebc8b09b8044dcb70bad7f47b5ce5a14c5dea1 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Tue, 7 Jan 2025 16:09:35 +0800 Subject: [PATCH 45/80] =?UTF-8?q?update:=E8=A1=A5=E5=85=85=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=8E=A8=E9=80=81=E8=B0=83=E7=94=A8=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E9=80=9A=E5=87=BA=E9=94=99=E5=BC=82=E5=B8=B8=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=EF=BC=88=E5=A2=9E=E5=8A=A0=E6=9C=8D=E5=8A=A1=E5=95=86code?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CAP/EventHandlers/TrackPushEventHandler.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 32987bb0..14d063bc 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -185,14 +185,15 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe new Track2InterfaceRelaySubSystemContext(@event.SubSystemCode))) { var asciiString = Base64Helper.SerializeObject(OptionType.新增.ToString()); + var serviceProviderCode = _pushConfigs.First().ServiceProviderCode; var r = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( _options.CurrentValue.PushTrackInterfaceCode, - _pushConfigs.First().ServiceProviderCode, items.Cast().ToList(), GlobalConst.TrackPushCompletedSubscribe, + serviceProviderCode, items.Cast().ToList(), GlobalConst.TrackPushCompletedSubscribe, attach: asciiString); if (r.Code != GlobalConst.SuccessCode) { - throw new BusinessException(message: $"requestId: {r.RequestId}; {r.Msg}"); + throw new BusinessException(message: $"requestId: {r.RequestId}; serviceProviderCode:{serviceProviderCode} Msg: {r.Msg}"); } } } @@ -235,14 +236,15 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe new Track2InterfaceRelaySubSystemContext(@event.SubSystemCode))) { var asciiString = Base64Helper.SerializeObject(OptionType.修改.ToString()); + var serviceProviderCode = _pushConfigs.First().ServiceProviderCode; var r = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( _options.CurrentValue.TrackUpdateInterfaceCode, - _pushConfigs.First().ServiceProviderCode, items.Cast().ToList(), GlobalConst.TrackPushCompletedSubscribe, + serviceProviderCode, items.Cast().ToList(), GlobalConst.TrackPushCompletedSubscribe, attach: asciiString); if (r.Code != GlobalConst.SuccessCode) { - throw new BusinessException(message: $"requestId: {r.RequestId}; {r.Msg}"); + throw new BusinessException(message: $"requestId: {r.RequestId}; serviceProviderCode:{serviceProviderCode} Msg: {r.Msg}"); } } } From 84792dc50285630f033a49b0b3a897edbfc9f667 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 9 Jan 2025 10:25:19 +0800 Subject: [PATCH 46/80] =?UTF-8?q?perf:=20=E5=88=A0=E9=99=A4=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=8F=90=E4=BE=9B=E6=8E=A5=E5=8F=A3=EF=BC=88=E5=8D=95?= =?UTF-8?q?=E4=B8=AA=E8=AE=A2=E5=8D=95=EF=BC=89=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E4=BD=BF=E7=94=A8EsId=E6=9D=A5=E5=88=A0=E9=99=A4=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=EF=BC=88=E5=BD=93=E5=92=8C=E6=A0=87=E8=AF=86=E7=AC=A6?= =?UTF-8?q?=E9=83=BD=E4=B8=8D=E4=B8=BA=E7=A9=BA=E5=88=99=E4=BC=98=E5=85=88?= =?UTF-8?q?=E4=BB=A5esId=E4=BC=98=E5=85=88=EF=BC=89=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E8=A7=A3=E9=99=A4=E6=A0=87=E8=AF=86=E7=AC=A6=E5=8F=B7=E7=9A=84?= =?UTF-8?q?=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 perf: 轨迹查询提供接口,增加es反参 perf: 支持轨迹更新的esId更新(要求确保是单个订单的单个轨迹) --- .../Dtos/ProvideServices/DeleteOrderInput.cs | 10 +++- .../Dtos/ProvideServices/GetTrackOutput.cs | 1 + .../Dtos/ProvideServices/UpsertTrackInput.cs | 5 ++ .../Events/TrackUpsertEvent.cs | 5 ++ .../EventHandlers/TrackUpsertEventHandler.cs | 8 +++ .../ProvideServices/TrackService.Query.cs | 2 + .../Services/ProvideServices/TrackService.cs | 57 ++++++++++++++----- .../Repositories/TrackDetailsEsRepository.cs | 2 +- 8 files changed, 72 insertions(+), 18 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs index de305c57..662e50e5 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs @@ -9,8 +9,12 @@ public class DeleteOrderInput : OrderNoInfo public class DeleteTrackInput : OrderNoInfo { /// - /// 轨迹标识符集合,必填 + /// 轨迹标识符集合,为支持esid删除,所以非必填 /// - [Required] - public List TrackIdentifiers { get; set; } = new(); + public List? TrackIdentifiers { get; set; } = new(); + + /// + /// 轨迹ESId集合,非必填,如果有优先级最高 + /// + public List? EsIds { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs index fca510a7..f5313b3b 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs @@ -15,6 +15,7 @@ public class GetTrackOutput public class TrackDetail { + public string EsId { get; set; } = null!; public string Code { get; set; } = null!; public string Status { get; set; } = null!; public string? Content { 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 8f743c7f..2b15e904 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs @@ -9,6 +9,11 @@ public class UpsertTrackInput : OrderNoInfo /// public bool IsAdd { get; set; } + /// + /// 轨迹唯一标识(可选) + /// + public string? EsId { get; set; } + /// /// 轨迹内容代码 /// diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index 877fa365..dbf754d7 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -19,6 +19,11 @@ public class TrackUpsertEvent /// public OrderIdentifier[] OrderIdentifiers { get; set; } = null!; + /// + /// 轨迹唯一标识(用于单个订单更新单条轨迹,如果有的话优先级最高) + /// + public string? EsId { get; set; } + /// /// 操作人(null则默认系统) /// diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 87dbc962..8ba97084 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -242,6 +242,12 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackDetailsIndex? track; if (!@event.IsAdd) { + //如果命中了esId + track = string.IsNullOrWhiteSpace(@event.EsId) + ? null + : tracks.FirstOrDefault(x => x.Id == @event.EsId); + if (track != null) goto TipEsIdTrack; + //同一订单同轨迹code同一轨迹时间如果有多条轨迹明细则不允许修改 var existTracks = tracks.Where(x => x.OrderId == order.OrderId && x.TrackTime == @event.TrackTime).ToArray(); @@ -291,6 +297,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe //其余情况:A,D都为新增操作,无需检查数量,track为null执行新增操作 } + //通过esId命中了轨迹 + TipEsIdTrack: if (track == default) { track = new TrackDetailsIndex diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs index 7e377a94..f6768eee 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs @@ -61,6 +61,7 @@ public partial class TrackService item.TrackDetails = trackDetails.Select(x => new TrackDetail { + EsId = x.Id, Code = x.TrackCode, Status = x.TrackStatus, Content = x.TrackContent, @@ -146,6 +147,7 @@ public partial class TrackService item.TrackDetails = trackDetails.Select(x => new TrackDetail { + EsId = x.Id, Code = x.TrackCode, Status = x.TrackStatus, Content = x.TrackContent, diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 45656799..9625a5f9 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -27,12 +27,16 @@ public partial class TrackService : ApplicationService, ITrackService private readonly IHttpClientProxy _requestCurrentUserService; private readonly ITrackContentRepository _trackContentRepository; - public TrackService(IOrderRepository orderRepository, ICapPublisher capPublisher, - ITrackDetailsEsRepository trackDetailsEsRepository, ITrackContentRepository trackContentRepository, - IHttpClientProxy requestCurrentUserService, ITrackTemplateRepository trackTemplateRepository, IHttpContextAccessor contextAccessor, IVSystemQueries vSystemQueries) + public TrackService(IOrderRepository orderRepository, + ICapPublisher capPublisher, + ITrackDetailsEsRepository trackDetailsEsRepository, + ITrackContentRepository trackContentRepository, + IHttpClientProxy requestCurrentUserService, + ITrackTemplateRepository trackTemplateRepository, + IHttpContextAccessor contextAccessor, + IVSystemQueries vSystemQueries) { _orderRepository = orderRepository; - this._orderRepository = orderRepository; _capPublisher = capPublisher; _trackContentRepository = trackContentRepository; _requestCurrentUserService = requestCurrentUserService; @@ -108,7 +112,10 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: $"轨迹代码:{input.TrackCode}不允许手动更新"); } - var tracks = (await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true)) + //如果传递了esId并且是修改操作则使用esid + var tracks = (!string.IsNullOrWhiteSpace(input.EsId) && !input.IsAdd) + ? await _trackDetailsEsRepository.GetDataByIds(new[] { input.EsId }) + : (await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true)) .Where(x => x.TrackTime == input.TrackTime) .ToList(); @@ -204,23 +211,45 @@ public partial class TrackService : ApplicationService, ITrackService var name = userInfo.Data.UserName; - //删除轨迹约束,只要其中有一条来源是外部的就立即返回错误 - var tracks = await _trackDetailsEsRepository - .GetListAsync(new[] { orderId }, - input.TrackIdentifiers.Select(x => x.TrackCode).ToList(), - TrackSourceEnum.ExternalServiceProvide); + var tracks = new List(); + var existsExternal = false; + var esIds = input.EsIds?.Distinct().ToArray(); + //优先使用esId + if (esIds != null && esIds.Length > 0) + { + tracks = await _trackDetailsEsRepository.GetDataByIds(esIds); + existsExternal = tracks.Any(x => x.Source == (int) TrackSourceEnum.ExternalServiceProvide); + } + else + { + var trackCodes = input.TrackIdentifiers?.Select(x => x.TrackCode).ToList(); + var trackIds = input.TrackIdentifiers?.Select(y => $"{y.TrackCode}{y.TrackTime}").ToHashSet(); + //没有任何需要操作的轨迹 + if (trackIds == null || trackIds.Count == 0) goto NO_DELETE_TRACK; + //删除轨迹约束,只要其中有一条来源是外部的就立即返回错误 + tracks = await _trackDetailsEsRepository.GetListAsync(new[] { orderId }, trackCodes); + //检查删除的轨迹中是否包含外部轨迹 + existsExternal = tracks + .Where(x => x.Source == (int) TrackSourceEnum.ExternalServiceProvide) + .Select(x => $"{x.TrackCode}{x.TrackTime}") + .Any(x => trackIds.Contains(x)); + } - //当要删除的轨迹标识出现交叉则不允许删除 - var intersect = tracks.Select(x => $"{x.TrackCode}{x.TrackTime}") - .Intersect(input.TrackIdentifiers.Select(y => $"{y.TrackCode}{y.TrackTime}")).ToList(); - if (intersect.Count > 0) + if (existsExternal) { throw new BusinessException(message: "存在来源于外部服务商的轨迹,不允许删除"); } + NO_DELETE_TRACK: + if (tracks.Count == 0) + { + throw new BusinessException(message: "没有任何轨迹要删除,请检查输入参数"); + } + // 删除轨迹 var @event = new TrackDeleteEvent { + EsIds = input.EsIds?.ToArray(), OrderIds = new[] { orderId }, TrackIdentifiers = input.TrackIdentifiers, SubSystemId = input.SubSystemId, diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index d7e28fbe..6d03a1b1 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -419,7 +419,7 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract> GetListAsync(int orderId) From 586690ed55b2ecd343b142dadd87feccdea579e1 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 9 Jan 2025 10:27:34 +0800 Subject: [PATCH 47/80] =?UTF-8?q?update-package:=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=A5=91=E7=BA=A6=E5=8C=85=E7=89=88=E6=9C=AC=E4=B8=BA7.0.12=20?= =?UTF-8?q?-=20=E6=9F=A5=E8=AF=A2=E8=BD=A8=E8=BF=B9=E5=A2=9E=E5=8A=A0esid?= =?UTF-8?q?=E5=8F=8D=E5=8F=82=20-=20=E5=88=A0=E9=99=A4=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E6=94=AF=E6=8C=81esid=E5=88=A0=E9=99=A4=20-=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=8D=95=E4=B8=AA=E8=AE=A2=E5=8D=95=E7=9A=84=E5=8D=95?= =?UTF-8?q?=E4=B8=AA=E8=BD=A8=E8=BF=B9=E6=94=AF=E6=8C=81es=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SJZY.Track.Application.Contract.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj index e9cb325e..48722a57 100644 --- a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj +++ b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj @@ -5,7 +5,7 @@ net7.0 True - 7.0.11 + 7.0.12 True From 313751fcb8b9945c147cac585799b18b19628866 Mon Sep 17 00:00:00 2001 From: xiaolipro <2357729423@qq.com> Date: Thu, 9 Jan 2025 11:36:23 +0800 Subject: [PATCH 48/80] =?UTF-8?q?S06=EF=BC=9Afeat=E3=80=906.=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=8E=A8=E9=80=81=E6=98=A0=E5=B0=84=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=A1=B9=E3=80=90=E5=8F=AA=E6=8E=A8=E9=80=81=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=B0=E5=BD=95=E3=80=91=E3=80=91=20https:?= =?UTF-8?q?//www.tapd.cn/60863849/prong/stories/view/1160863849001041817?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackPush/EditTrackPushConfigInput.cs | 5 +++++ .../TrackPush/TrackPushContentConfigDto.cs | 5 +++++ .../CAP/EventHandlers/TrackPushEventHandler.cs | 18 ++++++++++++------ .../TrackPush/TrackPushCacheService.cs | 3 +++ .../TrackPushConfigEntity.cs | 6 ++++++ .../GetTrackPushConfigDetailOutputVO.cs | 5 +++++ 6 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/EditTrackPushConfigInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/EditTrackPushConfigInput.cs index 745cdf56..e0331cb9 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/EditTrackPushConfigInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/EditTrackPushConfigInput.cs @@ -44,6 +44,11 @@ public class EditTrackPushConfigInput /// public bool? IsAllPush { get; set; } + /// + /// 是否全量推送 + /// + public bool? IsAllPushWithLatest { get; set; } + /// /// 时间格式枚举 /// diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushContentConfigDto.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushContentConfigDto.cs index 345bec99..7c1c1568 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushContentConfigDto.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushContentConfigDto.cs @@ -17,6 +17,11 @@ public class TrackPushContentConfigDto /// public bool IsAllPush { get; set; } + /// + /// 是否全量推送(最新轨迹) + /// + public bool IsAllPushWithLatest { get; set; } + /// /// 是否支持删除 /// diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 14d063bc..59a4a215 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -23,7 +23,6 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe private readonly IHttpClientProxy _httpClientProxy; private readonly IOptionsMonitor _options; private readonly IOrderRepository _orderRepository; - private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; private readonly ITrackPushCacheService _trackPushCacheService; private readonly ITrackPushRecordEsRepository _trackPushRecordEsRepository; private List _orders = null!; @@ -31,13 +30,12 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe public TrackPushEventHandler(IHttpClientProxy httpClientProxy, IOrderRepository orderRepository, ITrackPushCacheService trackPushCacheService, - ITrackDetailsEsRepository trackDetailsEsRepository, ITrackPushRecordEsRepository trackPushRecordEsRepository, + ITrackPushRecordEsRepository trackPushRecordEsRepository, IOptionsMonitor options) { _httpClientProxy = httpClientProxy; _orderRepository = orderRepository; _trackPushCacheService = trackPushCacheService; - _trackDetailsEsRepository = trackDetailsEsRepository; _trackPushRecordEsRepository = trackPushRecordEsRepository; _options = options; } @@ -285,7 +283,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { OrderNo = log.OrderNo, }; - var dict = new Dictionary() + var cur = new Dictionary() { // 推真实的发生地和发生时间(时间是计算后的) { "location", log.TrackPlace }, @@ -297,7 +295,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { "status", config.TrackStatusValue }, { "extra", DeserializeForTextJson(extraJson) } }; - body.Data.Add(dict); + body.Data.Add(cur); if (config.IsAllPush) { @@ -305,7 +303,15 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (history != default) { body = DeserializeForTextJson(history.PushContent); - body!.Data.Add(dict); + if (config.IsAllPushWithLatest) + { + var last = body!.Data.Last(); + if (cur["code"] == last["code"]) + { + body.Data.Remove(last); + } + } + body!.Data.Add(cur); } } diff --git a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs index eb4c6388..5b64b496 100644 --- a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs +++ b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs @@ -51,6 +51,7 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc x.Id, x.IsAutoPush, x.IsAllPush, + x.IsAllPushWithLatest, x.IsCanDelete, x.IsCanUpdate, x.SubSystemId, @@ -76,6 +77,7 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc IsAutoPush = trackPushConfig.IsAutoPush, IsCanUpdate = trackPushConfig.IsCanUpdate, IsAllPush = trackPushConfig.IsAllPush, + IsAllPushWithLatest = trackPushConfig.IsAllPushWithLatest, IsCanDelete = trackPushConfig.IsCanDelete, DateTimeFormatType = (int) trackPushConfig.DateTimeFormatType, DateTimeFormat = trackPushConfig.DateTimeFormat, @@ -89,6 +91,7 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc TrackContentValue = item.TrackContentValue, TrackEnContentValue = item.TrackEnContentValue, TrackTimeZone = item.TrackTimeZone, + // todo:废弃字段如果没有外部子系统依赖,可以逐步删除 ExpandFieldsValue = item.ExpandFieldsValue, }).ToList(); diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushConfigEntity.cs b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushConfigEntity.cs index e029921e..8dc04097 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushConfigEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushConfigEntity.cs @@ -56,6 +56,12 @@ public class TrackPushConfigEntity : IFullAuditedBasicEntitys, IAggregateRoot [SugarColumn(ColumnName = "IsAllPush")] public bool IsAllPush { get; set; } + /// + /// 是否全量推送(最新轨迹) + /// + [SugarColumn(ColumnName = "IsAllPushWithLatest")] + public bool IsAllPushWithLatest { get; set; } + /// /// 日期时间格式类型 /// diff --git a/src/SJZY.Track.Domain/Dtos/TrackPush/GetTrackPushConfigDetailOutputVO.cs b/src/SJZY.Track.Domain/Dtos/TrackPush/GetTrackPushConfigDetailOutputVO.cs index 42de155e..f8cff929 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackPush/GetTrackPushConfigDetailOutputVO.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackPush/GetTrackPushConfigDetailOutputVO.cs @@ -51,6 +51,11 @@ public class GetTrackPushConfigDetailOutputVO /// public bool IsAllPush { get; set; } + /// + /// 是否全量推送(最新轨迹) + /// + public bool IsAllPushWithLatest { get; set; } + /// /// 时间格式枚举 /// From 503e333c4f238fd1ade0cf38f18533fa460098a3 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 9 Jan 2025 16:20:45 +0800 Subject: [PATCH 49/80] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E9=85=8D=E7=BD=AE=E6=97=B6=E9=97=B4=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E6=9E=9A=E4=B8=BE=E4=B8=BA=E5=8F=AF=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackPush/EditTrackPushConfigInput.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/EditTrackPushConfigInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/EditTrackPushConfigInput.cs index e0331cb9..9d7c58d9 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/EditTrackPushConfigInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/EditTrackPushConfigInput.cs @@ -52,7 +52,7 @@ public class EditTrackPushConfigInput /// /// 时间格式枚举 /// - public int DateTimeFormatType { get; set; } + public int? DateTimeFormatType { get; set; } = 0; /// /// 日期时间格式模板 From 76aec6c78f96a0d50fe9774f51ffdf62360ae013 Mon Sep 17 00:00:00 2001 From: xiaolipro <2357729423@qq.com> Date: Thu, 9 Jan 2025 16:42:25 +0800 Subject: [PATCH 50/80] =?UTF-8?q?important=EF=BC=9A=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProvideServices/BatchUpsertTrackInput.cs | 2 +- .../Dtos/ProvideServices/GetTrackOutput.cs | 2 +- .../Dtos/ProvideServices/UpsertTrackInput.cs | 2 +- .../Dtos/TrackPush/TrackPushInput.cs | 12 - .../Dtos/TrackPush/TrackPushRecordDto.cs | 2 +- .../Events/TrackChangeEto.cs | 2 +- .../Events/TrackPushCompletedEvent.cs | 2 +- .../Events/TrackPushEvent.cs | 7 +- .../Events/TrackUpsertEvent.cs | 7 +- .../Services/IBroadcastingService.cs | 2 +- .../EventHandlers/TrackDeleteEventHandler.cs | 1 + .../EventHandlers/TrackPushEventHandler.cs | 34 +- .../EventHandlers/TrackUpsertEventHandler.cs | 322 +++++++++--------- .../Rabbit/TrackPushCompletedEventHandler.cs | 3 +- .../Broadcasting/BroadcastingService.cs | 2 +- .../ProvideServices/TrackPushService.cs | 1 + .../Services/ProvideServices/TrackService.cs | 6 + .../TrackDetailsIndex.cs | 2 +- .../TrackPushRecordIndex.cs | 2 +- 19 files changed, 222 insertions(+), 191 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs index 90e159cc..c1e5bcfc 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs @@ -123,7 +123,7 @@ public class BatchUpsertTrackInput : OrderNosInfo /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public string? Extra { get; set; } + public Dictionary? Extra { get; set; } /// /// 是否强制推送 diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs index f5313b3b..28d0a76d 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs @@ -105,5 +105,5 @@ public class TrackDetail /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public string? Extra { get; set; } + public Dictionary? Extra { 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 2b15e904..0fa3b448 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs @@ -132,7 +132,7 @@ public class UpsertTrackInput : OrderNoInfo /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public string? Extra { get; set; } + public Dictionary? Extra { get; set; } /// /// 是否强制推送 diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs index 1111637f..eae08b81 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs @@ -19,15 +19,3 @@ public class TrackUpdateInput public string Log { get; set; } } - -public class TrackItem -{ - public string Location { get; set; } = null!; - public string Date { get; set; } - public double TimeZone { get; set; } - public string? Description { get; set; } - public string? DescriptionCn { get; set; } - public string? Code { get; set; } - public string? Status { get; set; } - public string? Extra { get; set; } -} diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs index 7bb84c1c..9ce8fe2e 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs @@ -85,5 +85,5 @@ public class TrackPushRecordDto /// /// 轨迹的额外新 /// - public string? Extra { get; set; } + public Dictionary? Extra { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs b/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs index 6319446e..5f49e9ff 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs @@ -132,5 +132,5 @@ public class TrackChangeEto /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public string? Extra { get; set; } + public Dictionary? Extra { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs index 6e3d3987..1befad13 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs @@ -83,5 +83,5 @@ public class TrackPushCompletedEvent /// /// 轨迹的额外新 /// - public string? Extra { get; set; } + public Dictionary? Extra { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs index ab033510..760ba4b6 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs @@ -80,8 +80,13 @@ public struct SystemPushStruct /// public float TrackTimeZone { get; set; } + /// + /// 重复的情况下,用什么比较 + /// + public string? CompareFields { get; set; } + /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public string? Extra { get; set; } + public Dictionary? Extra { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index dbf754d7..1f6a9f1c 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -146,10 +146,15 @@ public class TrackUpsertEvent /// public float? DestinationTimeZone { get; set; } + /// + /// 重复的情况下,用什么比较 + /// + public string? CompareFields { get; set; } + /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public string? Extra { get; set; } + public Dictionary? Extra { get; set; } /// /// 是否强制推送 diff --git a/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs index 0f79f83d..caca1139 100644 --- a/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs +++ b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs @@ -26,5 +26,5 @@ public interface IBroadcastingService : ITransientDependency /// 轨迹推送完成广播(推送完成回调) /// /// - void TrackPushCompletedPublicTopicAsync(TrackPushRecordDto log); + void TrackPushCompletedPublicTopic(TrackPushRecordDto log); } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index 7568071b..7e798eba 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -158,6 +158,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe } } + // todo:多个相同code的轨迹删除,也需要考虑?? private async Task> DeleteTrackAsync(TrackDeleteEvent @event) { List orderIds; diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 59a4a215..808fd759 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -10,7 +10,6 @@ using SJZY.Track.Application.Helpers; using SJZY.Track.Application.Options; using SJZY.Track.Application.Track2InterfaceRelay; using SJZY.Track.Domain.Aggregates.OrderAggregate; -using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Enums; using Volo.Abp.DependencyInjection; @@ -127,7 +126,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe IsToMq = @event.IsToMq, Extra = @event.SystemPushInfo.Extra }; - var item = await BuiltPushItem(config, log, @event.SystemPushInfo.Extra); + var item = await BuiltPushItem(config, log, @event.SystemPushInfo.CompareFields); item.Log = JsonConvert.SerializeObject(log); items.Add(item); } @@ -171,7 +170,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe IsToMq = @event.IsToMq, Extra = @event.SystemPushInfo.Extra }; - var item = await BuiltPushItem(config, log, @event.SystemPushInfo.Extra); + var item = await BuiltPushItem(config, log, @event.SystemPushInfo.CompareFields); item.Log = JsonConvert.SerializeObject(log); items.Add(item); } @@ -223,7 +222,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe IsToMq = @event.IsToMq, Extra = @event.SystemPushInfo.Extra }; - var item = BuiltUpdateItem(config, log, @event.SystemPushInfo.Extra); + var item = BuiltUpdateItem(config, log); item.Log = JsonConvert.SerializeObject(log); items.Add(item); } @@ -247,7 +246,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } } - private TrackUpdateInput BuiltUpdateItem(TrackPushContentConfigDto config, TrackPushRecordIndex log, string? extraJson) + private TrackUpdateInput BuiltUpdateItem(TrackPushContentConfigDto config, TrackPushRecordIndex log) { var trackDatetime = log.TrackTime.AddHours(config.TrackTimeZone ?? log.TrackTimeZone - log.TrackTimeZone); var trackDateStr = DateTimeFormat(trackDatetime, config.TrackTimeZone ?? log.TrackTimeZone, config); @@ -266,7 +265,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { "descriptionCn", config.TrackContentValue }, { "code", config.TrackContentCodeValue }, { "status", config.TrackStatusValue }, - { "extra", DeserializeForTextJson(extraJson) } + { "extra", log.Extra } }; body.Data.Add(dict); log.PushContent = body.ToJson(); @@ -274,7 +273,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe return body; } - private async Task BuiltPushItem(TrackPushContentConfigDto config, TrackPushRecordIndex log, string? extraJson) + private async Task BuiltPushItem(TrackPushContentConfigDto config, TrackPushRecordIndex log, + string? compareFields) { var trackDatetime = log.TrackTime.AddHours(config.TrackTimeZone ?? log.TrackTimeZone - log.TrackTimeZone); var trackDateStr = DateTimeFormat(trackDatetime, config.TrackTimeZone ?? log.TrackTimeZone, config); @@ -283,7 +283,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { OrderNo = log.OrderNo, }; - var cur = new Dictionary() + var cur = new Dictionary { // 推真实的发生地和发生时间(时间是计算后的) { "location", log.TrackPlace }, @@ -293,7 +293,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { "descriptionCn", config.TrackContentValue }, { "code", config.TrackContentCodeValue }, { "status", config.TrackStatusValue }, - { "extra", DeserializeForTextJson(extraJson) } + { "extra", log.Extra } }; body.Data.Add(cur); @@ -305,10 +305,20 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe body = DeserializeForTextJson(history.PushContent); if (config.IsAllPushWithLatest) { - var last = body!.Data.Last(); - if (cur["code"] == last["code"]) + var old = body!.Data + .WhereIf(!compareFields.IsNullOrWhiteSpace(), x => + { + if (x["extra"] is Dictionary extra && extra.TryGetValue(compareFields!, out var value)) + { + return value ==log.Extra![compareFields!]; + } + + return false; + }) + .FirstOrDefault(x => x["code"] == cur["code"]); + if (old != null) { - body.Data.Remove(last); + body.Data.Remove(old); } } body!.Data.Add(cur); diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 8ba97084..b59e3f96 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -216,6 +216,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackPlace = @event.TrackPlace, TrackTime = @event.NewTrackTime ?? @event.TrackTime, TrackTimeZone = @event.TrackTimeZone, + CompareFields = @event.CompareFields, Extra = @event.Extra }, ForcedPush = @event.ForcedPush, @@ -231,6 +232,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe { var orderIds = @event.OrderIdentifiers.Select(x => x.OrderId).ToArray(); + // todo:条件命名写反了 // important:轨迹code相同,时间、发生地不同的,可能存在多条!! var tracks = await _trackDetailsEsRepository.GetListAsync(orderIds, @event.TrackCode, false); @@ -239,27 +241,56 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe foreach (var order in @event.OrderIdentifiers) { - TrackDetailsIndex? track; + // fast path: by update with es id case + if (!@event.IsAdd && !string.IsNullOrWhiteSpace(@event.EsId)) + { + var trackById = tracks.FirstOrDefault(x => x.Id == @event.EsId); + if (trackById != null) + { + updateTracks.Add(BuiltUpdateTrack(@event, trackById, order, trackContent)); + } + continue; + } + + var existTracks = tracks.Where(x => x.OrderId == order.OrderId).ToList(); + + if (@event.CompareFields.IsNullOrEmpty()) + { + existTracks = existTracks.Where(x => x.TrackTime == @event.TrackTime).ToList(); + } + else + { + if (@event.Extra == null || + @event.Extra.TryGetValue(@event.CompareFields, out var compareValue) == false) + { + throw new BusinessException(message: "轨迹比较字段不存在,请检查拓展字段"); + } + + existTracks = existTracks.Where(x => + { + // tips:注意兼容性,历史轨迹的字段可能为空 + if (x.Extra == null || !x.Extra.TryGetValue(@event.CompareFields, out var oldValue)) + { + return false; + } + + return oldValue == compareValue; + }).ToList(); + } + + var track = existTracks.FirstOrDefault(); + if (!@event.IsAdd) { - //如果命中了esId - track = string.IsNullOrWhiteSpace(@event.EsId) - ? null - : tracks.FirstOrDefault(x => x.Id == @event.EsId); - if (track != null) goto TipEsIdTrack; - - //同一订单同轨迹code同一轨迹时间如果有多条轨迹明细则不允许修改 - var existTracks = tracks.Where(x => x.OrderId == order.OrderId - && x.TrackTime == @event.TrackTime).ToArray(); - if (existTracks.Length > 1) + if (existTracks.Count > 1) { // 修改轨迹时,订单存在多条轨迹不允许修改 continue; } - track = existTracks.FirstOrDefault(); - if (track == null) continue; // 不存在不让改 + + updateTracks.Add(BuiltUpdateTrack(@event, track, order, trackContent)); } else { @@ -271,149 +302,11 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe // 场景D:不允许重复,零条 => 新增 // 场景E:不允许重复,一条 => 跳过 // 场景F:不允许重复,(理想不会出现多条) => 跳过 - var existTracks = tracks.Where(x => x.OrderId == order.OrderId).ToArray(); - track = existTracks.FirstOrDefault(); - //覆盖场景:B,C - if (trackContent.IsRepeatable && existTracks.Length >= 1) - { - if (existTracks.Any(x => x.TrackTime == @event.TrackTime)) - { - //TrackCode TrackTime联合不能重复 - continue; - } + // 不允许重复轨迹 + if (!trackContent.IsRepeatable && existTracks.Count > 0) continue; - // 设置null后面执行新增逻辑 - track = null; - } - - //不允许重复,并且记录大于等于一条,跳过 - //覆盖场景:E,F - if (!trackContent.IsRepeatable && existTracks.Length >= 1) - { - continue; - } - - //其余情况:A,D都为新增操作,无需检查数量,track为null执行新增操作 - } - - //通过esId命中了轨迹 - TipEsIdTrack: - if (track == default) - { - track = new TrackDetailsIndex - { - SubSystemId = @event.SubSystemId, - OrderId = order.OrderId, - OrderNo = order.OrderNo, - OrderType = order.OrderType, - TrackCode = @event.TrackCode, - TrackPlace = @event.TrackPlace, - TrackTime = @event.NewTrackTime ?? @event.TrackTime, - TrackTimeZone = @event.TrackTimeZone, - ServiceProviderCode = @event.TrackRefreshData.ServiceProviderCode ?? GlobalConst.EmptyString, - OriginTrackContent = @event.TrackRefreshData.OriginTrackContent ?? GlobalConst.EmptyString, - OriginTrackDataHash = @event.TrackRefreshData.OriginTrackDataHash ?? GlobalConst.EmptyString, - CreateUser = @event.OperationMan ?? GlobalConst.SystemUser, - CreateTime = DateTime.Now, - //来源轨迹内容,第一次新增的时候使用轨迹内容表提供的 - TrackStatusId = trackContent.TrackStatusId, - TrackStatus = trackContent.TrackStatus, - TrackStatusCode = trackContent.TrackStatusCode, - //跨子系统? - TrackContentId = trackContent.TrackContentId, - TrackContent = @event.Content ?? trackContent.TrackContent, - TrackEnContent = @event.EnStatus ?? trackContent.TrackEnContent, - //S06新增轨迹明细字段 - 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, - 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, - Extra = @event.Extra - }; - - track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 - ? 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 - { - //外部轨迹,轨迹发生地,轨迹发生时间,轨迹发生时区,不允许更改 - 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)); - track.UpdateUser = @event.OperationMan ?? GlobalConst.SystemUser; - track.UpdateTime = DateTime.Now; - - //允许二次修改,在修改了轨迹内容后进行修改轨迹操作,如果输入的轨迹内容则以输入为准 - //跨子系统? - track.TrackContent = @event.Content ?? trackContent.TrackContent; - track.TrackEnContent = @event.EnStatus ?? trackContent.TrackEnContent; - //S06新增 - track.IsVisibility = @event.IsVisibility; - 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.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; - track.Extra = @event.Extra; - - 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 - }); + insertTracks.Add(BuiltNewTrack(@event, order, trackContent)); } canNextOrderIds.Add(order.OrderId); @@ -427,4 +320,125 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe return insertTracks; } + + + private TrackDetailsIndex BuiltUpdateTrack(TrackUpsertEvent @event, TrackDetailsIndex track, OrderIdentifier order, + TrackContentVO trackContent) + { + //外部轨迹,轨迹发生地,轨迹发生时间,轨迹发生时区,不允许更改 + 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)); + track.UpdateUser = @event.OperationMan ?? GlobalConst.SystemUser; + track.UpdateTime = DateTime.Now; + + //允许二次修改,在修改了轨迹内容后进行修改轨迹操作,如果输入的轨迹内容则以输入为准 + //跨子系统? + track.TrackContent = @event.Content ?? trackContent.TrackContent; + track.TrackEnContent = @event.EnStatus ?? trackContent.TrackEnContent; + //S06新增 + track.IsVisibility = @event.IsVisibility; + 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.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; + track.Extra = @event.Extra; + + // 写入操作日志 + _ = _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 + }); + + return track; + } + + private TrackDetailsIndex BuiltNewTrack(TrackUpsertEvent @event, OrderIdentifier order, TrackContentVO trackContent) + { + var track = new TrackDetailsIndex + { + SubSystemId = @event.SubSystemId, + OrderId = order.OrderId, + OrderNo = order.OrderNo, + OrderType = order.OrderType, + TrackCode = @event.TrackCode, + TrackPlace = @event.TrackPlace, + TrackTime = @event.NewTrackTime ?? @event.TrackTime, + TrackTimeZone = @event.TrackTimeZone, + ServiceProviderCode = @event.TrackRefreshData.ServiceProviderCode ?? GlobalConst.EmptyString, + OriginTrackContent = @event.TrackRefreshData.OriginTrackContent ?? GlobalConst.EmptyString, + OriginTrackDataHash = @event.TrackRefreshData.OriginTrackDataHash ?? GlobalConst.EmptyString, + CreateUser = @event.OperationMan ?? GlobalConst.SystemUser, + CreateTime = DateTime.Now, + //来源轨迹内容,第一次新增的时候使用轨迹内容表提供的 + TrackStatusId = trackContent.TrackStatusId, + TrackStatus = trackContent.TrackStatus, + TrackStatusCode = trackContent.TrackStatusCode, + //跨子系统? + TrackContentId = trackContent.TrackContentId, + TrackContent = @event.Content ?? trackContent.TrackContent, + TrackEnContent = @event.EnStatus ?? trackContent.TrackEnContent, + //S06新增轨迹明细字段 + 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, + 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, + Extra = @event.Extra + }; + + track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 + ? track.TrackTime + : track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); + + // 写入操作日志 + _ = _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 + }); + + return track; + } } diff --git a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs index 8144eb1c..3895fb7a 100644 --- a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs +++ b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs @@ -4,6 +4,7 @@ using BSI.Stack.Rabbit.Handler; using Newtonsoft.Json; using RabbitMQ.Client.Events; using SJZY.Expand.ABP.Core.Logger; +using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.InterfaceRelay.Application.Contracts; using SJZY.Track.Application.Contract.Dtos.TrackPush; using SJZY.Track.Application.Contract.Services; @@ -70,7 +71,7 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl // 推送广播 if (log.IsToMq) - _broadcastingService.TrackPushCompletedPublicTopicAsync(BuildDto(log)); + _broadcastingService.TrackPushCompletedPublicTopic(BuildDto(log)); // 往es 写推送日志 await _trackPushRecordEsRepository.AddAsync(log); diff --git a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs index 9dfb2eb6..14c6c578 100644 --- a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs +++ b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs @@ -86,7 +86,7 @@ public class BroadcastingService : IBroadcastingService /// /// /// - public void TrackPushCompletedPublicTopicAsync(TrackPushRecordDto log) + public void TrackPushCompletedPublicTopic(TrackPushRecordDto log) { var data = new TrackPushCompletedEvent { diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs index a7efbb5e..95f496ed 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs @@ -117,6 +117,7 @@ public class TrackPushService : ApplicationService, ITrackPushService TrackPlace = track.TrackPlace, TrackTime = track.TrackTime, TrackTimeZone = track.TrackTimeZone, + // todo: 这里也要改,重复code问题,到底推哪个 Extra = track.Extra } }; diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 9625a5f9..e13a1a30 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -240,6 +240,8 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: "存在来源于外部服务商的轨迹,不允许删除"); } + + // todo:非必须不用goto,除非是在写算法,业务逻辑理论上都能通过if和方法规避 NO_DELETE_TRACK: if (tracks.Count == 0) { @@ -357,6 +359,9 @@ public partial class TrackService : ApplicationService, ITrackService return new UnifyResultDto(true, true); } + + + // todo:代码封装性太差了,拆小一点 /// /// 批量新增、更新轨迹 /// @@ -436,6 +441,7 @@ public partial class TrackService : ApplicationService, ITrackService .Where(x => x.TrackTime == input.TrackTime) .ToList(); + // todo:这块代码抽出去 //当为更新操作时发现更新的数目为0进行重试操作 if (!input.IsAdd && tracks.Count == 0) { diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index 02cb6b51..60eed6a3 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -190,5 +190,5 @@ public class TrackDetailsIndex : IdBaseIndex /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public string? Extra { get; set; } + public Dictionary? Extra { get; set; } } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs index d127b5c4..8b2132bd 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs @@ -96,5 +96,5 @@ public class TrackPushRecordIndex : IdBaseIndex /// /// 轨迹额外信息 /// - public string? Extra { get; set; } + public Dictionary? Extra { get; set; } } From 4fb127ed474b6e831518ea1856ba02a8968590e4 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 9 Jan 2025 17:41:39 +0800 Subject: [PATCH 51/80] =?UTF-8?q?=E8=BD=AC=E9=B9=8F=E5=86=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProvideServices/BatchUpsertTrackInput.cs | 2 +- .../Dtos/ProvideServices/GetTrackOutput.cs | 2 +- .../Dtos/ProvideServices/UpsertTrackInput.cs | 2 +- .../Dtos/TrackPush/TrackPushRecordDto.cs | 2 +- .../Events/TrackChangeEto.cs | 2 +- .../Events/TrackPushCompletedEvent.cs | 2 +- .../Events/TrackPushEvent.cs | 2 +- .../Events/TrackUpsertEvent.cs | 2 +- .../CAP/EventHandlers/TrackPushEventHandler.cs | 11 +++++++++-- .../EventHandlers/TrackUpsertEventHandler.cs | 17 ++++++++++++++--- .../Rabbit/TrackPushCompletedEventHandler.cs | 1 - .../TrackDetailsAggregate/TrackDetailsIndex.cs | 2 +- .../TrackPushAggregate/TrackPushRecordIndex.cs | 2 +- .../Repositories/TrackDetailsEsRepository.cs | 2 +- 14 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs index c1e5bcfc..90e159cc 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs @@ -123,7 +123,7 @@ public class BatchUpsertTrackInput : OrderNosInfo /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public Dictionary? Extra { get; set; } + public string? Extra { get; set; } /// /// 是否强制推送 diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs index 28d0a76d..f5313b3b 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs @@ -105,5 +105,5 @@ public class TrackDetail /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public Dictionary? Extra { get; set; } + public string? Extra { 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 0fa3b448..2b15e904 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs @@ -132,7 +132,7 @@ public class UpsertTrackInput : OrderNoInfo /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public Dictionary? Extra { get; set; } + public string? Extra { get; set; } /// /// 是否强制推送 diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs index 9ce8fe2e..7bb84c1c 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs @@ -85,5 +85,5 @@ public class TrackPushRecordDto /// /// 轨迹的额外新 /// - public Dictionary? Extra { get; set; } + public string? Extra { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs b/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs index 5f49e9ff..6319446e 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs @@ -132,5 +132,5 @@ public class TrackChangeEto /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public Dictionary? Extra { get; set; } + public string? Extra { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs index 1befad13..6e3d3987 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs @@ -83,5 +83,5 @@ public class TrackPushCompletedEvent /// /// 轨迹的额外新 /// - public Dictionary? Extra { get; set; } + public string? Extra { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs index 760ba4b6..9be77fbc 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs @@ -88,5 +88,5 @@ public struct SystemPushStruct /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public Dictionary? Extra { get; set; } + public string? Extra { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index 1f6a9f1c..fef7ab3f 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -154,7 +154,7 @@ public class TrackUpsertEvent /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public Dictionary? Extra { get; set; } + public string? Extra { get; set; } /// /// 是否强制推送 diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 808fd759..a8ff5339 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -265,7 +265,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { "descriptionCn", config.TrackContentValue }, { "code", config.TrackContentCodeValue }, { "status", config.TrackStatusValue }, - { "extra", log.Extra } + { "extra", DeserializeForTextJson(log.Extra) } }; body.Data.Add(dict); log.PushContent = body.ToJson(); @@ -293,7 +293,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { "descriptionCn", config.TrackContentValue }, { "code", config.TrackContentCodeValue }, { "status", config.TrackStatusValue }, - { "extra", log.Extra } + { "extra", DeserializeForTextJson(log.Extra) } }; body.Data.Add(cur); @@ -380,4 +380,11 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { return string.IsNullOrWhiteSpace(json) ? default : System.Text.Json.JsonSerializer.Deserialize(json); } + + private Dictionary? GetExtraDictForTextJson(string? extraStr) + { + return string.IsNullOrWhiteSpace(extraStr) + ? null + : System.Text.Json.JsonSerializer.Deserialize>(extraStr); + } } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index b59e3f96..0f68fcda 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -1,4 +1,5 @@ using DotNetCore.CAP; +using NetTaste; using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Track.Application.Contract.Events; @@ -234,7 +235,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe // todo:条件命名写反了 // important:轨迹code相同,时间、发生地不同的,可能存在多条!! - var tracks = await _trackDetailsEsRepository.GetListAsync(orderIds, @event.TrackCode, false); + var tracks = await _trackDetailsEsRepository.GetListAsync(orderIds, @event.TrackCode, true); var insertTracks = new List(); var updateTracks = new List(); @@ -249,6 +250,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe { updateTracks.Add(BuiltUpdateTrack(@event, trackById, order, trackContent)); } + continue; } @@ -260,8 +262,10 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe } else { + var extraDict = GetExtraDictForTextJson(@event.Extra); if (@event.Extra == null || - @event.Extra.TryGetValue(@event.CompareFields, out var compareValue) == false) + extraDict == null + || extraDict.TryGetValue(@event.CompareFields, out var compareValue) == false) { throw new BusinessException(message: "轨迹比较字段不存在,请检查拓展字段"); } @@ -269,7 +273,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe existTracks = existTracks.Where(x => { // tips:注意兼容性,历史轨迹的字段可能为空 - if (x.Extra == null || !x.Extra.TryGetValue(@event.CompareFields, out var oldValue)) + if (x.Extra == null || !extraDict.TryGetValue(@event.CompareFields, out var oldValue)) { return false; } @@ -441,4 +445,11 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe return track; } + + private Dictionary? GetExtraDictForTextJson(string? extraStr) + { + return string.IsNullOrWhiteSpace(extraStr) + ? null + : System.Text.Json.JsonSerializer.Deserialize>(extraStr); + } } diff --git a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs index 3895fb7a..11be63aa 100644 --- a/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs +++ b/src/SJZY.Track.Application/Rabbit/TrackPushCompletedEventHandler.cs @@ -4,7 +4,6 @@ using BSI.Stack.Rabbit.Handler; using Newtonsoft.Json; using RabbitMQ.Client.Events; using SJZY.Expand.ABP.Core.Logger; -using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.InterfaceRelay.Application.Contracts; using SJZY.Track.Application.Contract.Dtos.TrackPush; using SJZY.Track.Application.Contract.Services; diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index 60eed6a3..02cb6b51 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -190,5 +190,5 @@ public class TrackDetailsIndex : IdBaseIndex /// /// 扩展信息字段,用与轨迹推送的附加字段 /// - public Dictionary? Extra { get; set; } + public string? Extra { get; set; } } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs index 8b2132bd..d127b5c4 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs @@ -96,5 +96,5 @@ public class TrackPushRecordIndex : IdBaseIndex /// /// 轨迹额外信息 /// - public Dictionary? Extra { get; set; } + public string? Extra { get; set; } } diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index 6d03a1b1..b9bf22af 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -19,7 +19,7 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract> GetListAsync(int[] orderIds, string trackCode, bool forUpsert = false) { - var r = !forUpsert + var r = forUpsert ? await Context.SearchAsync(s => s .Index(GlobalConst.TrackDetailsIndex) .Source() From f5f9227aeb7fc6cd80247436302f6cd12d3c5af7 Mon Sep 17 00:00:00 2001 From: xiaolipro <2357729423@qq.com> Date: Thu, 9 Jan 2025 18:07:16 +0800 Subject: [PATCH 52/80] try --- .../CAP/EventHandlers/TrackPushEventHandler.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index a8ff5339..d78beaca 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -1,6 +1,7 @@ using DotNetCore.CAP; using Microsoft.Extensions.Options; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.InterfaceRelay.Application.Contracts; using SJZY.Track.Application.Contract.Dtos.TrackPush; @@ -306,16 +307,19 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (config.IsAllPushWithLatest) { var old = body!.Data + .Where(x => x["code"] == cur["code"]) .WhereIf(!compareFields.IsNullOrWhiteSpace(), x => { - if (x["extra"] is Dictionary extra && extra.TryGetValue(compareFields!, out var value)) + if (x["extra"] == null || log.Extra == null) return false; + var extra = JObject.FromObject(x["extra"]!); + var curExtra = JObject.FromObject(log.Extra!); + if (extra.TryGetValue(compareFields!, out var value) && curExtra.TryGetValue(compareFields!, out var curValue) ) { - return value ==log.Extra![compareFields!]; + return value == curValue; } - return false; }) - .FirstOrDefault(x => x["code"] == cur["code"]); + .FirstOrDefault(); if (old != null) { body.Data.Remove(old); From b2c7a6aef103d991afbfc4d5fb248dacf44ed167 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 10 Jan 2025 09:18:23 +0800 Subject: [PATCH 53/80] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9A=84=E6=AF=94=E8=BE=83=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CAP/EventHandlers/TrackUpsertEventHandler.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 0f68fcda..79ece4b4 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -272,8 +272,11 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe existTracks = existTracks.Where(x => { + var oldExtraDict = GetExtraDictForTextJson(x.Extra); // tips:注意兼容性,历史轨迹的字段可能为空 - if (x.Extra == null || !extraDict.TryGetValue(@event.CompareFields, out var oldValue)) + if (x.Extra == null + || oldExtraDict == null + || !oldExtraDict.TryGetValue(@event.CompareFields, out var oldValue)) { return false; } From cc84be2d84fb62d4ec7ef86fa17153515477d08a Mon Sep 17 00:00:00 2001 From: xiaolipro <2357729423@qq.com> Date: Fri, 10 Jan 2025 09:33:35 +0800 Subject: [PATCH 54/80] review --- .../EventHandlers/TrackUpsertEventHandler.cs | 36 +++++++++---------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 79ece4b4..cfdba588 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -1,5 +1,6 @@ +using System.Diagnostics; using DotNetCore.CAP; -using NetTaste; +using Microsoft.Extensions.Logging; using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Track.Application.Contract.Events; @@ -21,6 +22,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe private readonly IProvideQueries _provideQueries; private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; private readonly IBroadcastingService _broadcastingService; + private readonly ILogger _logger; private readonly IOrderOperationRecordEsRepository _orderOperationRecordEsRepository; public TrackUpsertEventHandler( @@ -29,7 +31,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe IProvideQueries provideQueries, ITrackDetailsEsRepository trackDetailsEsRepository, IOrderOperationRecordEsRepository orderOperationRecordEsRepository, - IBroadcastingService broadcastingService) + IBroadcastingService broadcastingService, + ILogger logger) { _orderRepository = orderRepository; _capPublisher = capPublisher; @@ -37,6 +40,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe _trackDetailsEsRepository = trackDetailsEsRepository; _orderOperationRecordEsRepository = orderOperationRecordEsRepository; _broadcastingService = broadcastingService; + _logger = logger; } [CapSubscribe(GlobalConst.TrackUpsertSubscribe, Group = GlobalConst.TrackUpsertSubscribe)] @@ -262,21 +266,18 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe } else { + Debug.Assert(@event.CompareFields != null, "@event.CompareFields != null"); var extraDict = GetExtraDictForTextJson(@event.Extra); - if (@event.Extra == null || - extraDict == null - || extraDict.TryGetValue(@event.CompareFields, out var compareValue) == false) + if (extraDict == null || !extraDict.TryGetValue(@event.CompareFields, out var compareValue)) { - throw new BusinessException(message: "轨迹比较字段不存在,请检查拓展字段"); + throw new BusinessException(message: $"请检查拓展字段,为什么找不到比较字段:{@event.CompareFields}"); } existTracks = existTracks.Where(x => { var oldExtraDict = GetExtraDictForTextJson(x.Extra); // tips:注意兼容性,历史轨迹的字段可能为空 - if (x.Extra == null - || oldExtraDict == null - || !oldExtraDict.TryGetValue(@event.CompareFields, out var oldValue)) + if (oldExtraDict == null|| !oldExtraDict.TryGetValue(@event.CompareFields, out var oldValue)) { return false; } @@ -291,26 +292,19 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe { if (existTracks.Count > 1) { - // 修改轨迹时,订单存在多条轨迹不允许修改 + // todo: 所有的event handle 多写log,取缔注释,特别是continue,return,这种跳出的地方,方便排查问题 + _logger.LogInformation("订单存在多条轨迹不允许修改:{@event}", @event); continue; } + // todo:例如这里 if (track == null) continue; // 不存在不让改 updateTracks.Add(BuiltUpdateTrack(@event, track, order, trackContent)); } else { - // 【批量新增】所有可能遇到的场景 - // 标识:允许重复,不允许重复,零条,一条,多条; - // 场景A:允许重复,零条 => 新增 - // 场景B:允许重复,一条 => 新增(约束受限新增,否则跳过新增) - // 场景C:允许重复,多条 => 新增(约束受限新增,否则跳过新增) - // 场景D:不允许重复,零条 => 新增 - // 场景E:不允许重复,一条 => 跳过 - // 场景F:不允许重复,(理想不会出现多条) => 跳过 - - // 不允许重复轨迹 + // 不允许重复轨迹,跳过 if (!trackContent.IsRepeatable && existTracks.Count > 0) continue; insertTracks.Add(BuiltNewTrack(@event, order, trackContent)); @@ -369,6 +363,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe track.EstimatedDeliveryDate = @event.EstimatedDeliveryDate; track.Extra = @event.Extra; + // todo:如果后面写es异常了,这里日志不就不准了,这里应该和写轨迹一样,做成批量的,放到写完轨迹只会写日志 // 写入操作日志 _ = _orderOperationRecordEsRepository.AddAsync(new OrderOperationRecordIndex { @@ -434,6 +429,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe ? track.TrackTime : track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); + // todo:如果后面写es异常了,这里日志不就不准了,这里应该和写轨迹一样,做成批量的,放到写完轨迹只会写日志 // 写入操作日志 _ = _orderOperationRecordEsRepository.AddAsync(new OrderOperationRecordIndex { From 2d6b239b8f4e2d902c5ea45d399cbe1dd4a8ac48 Mon Sep 17 00:00:00 2001 From: xiaolipro <2357729423@qq.com> Date: Fri, 10 Jan 2025 10:15:00 +0800 Subject: [PATCH 55/80] review push event handler --- .../CAP/EventHandlers/TrackPushEventHandler.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index d78beaca..eff95d65 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -91,6 +91,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe private async Task DoPushAsync(TrackPushEvent @event) { + // todo: 轨迹中台推送逻辑致使的未推送,也需要广播到mq,告知业务系统缘故 var items = new List(); TrackPushContentConfigDto? config; var isSystemPush = @event.OperationMan == null; @@ -99,12 +100,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe foreach (var order in _orders) { if (order.QuestionType == (int) TrackProblemType.Error) continue; // 系统不推异常单,只能人工操作 - // 强制推送只需直接查出配置 - if (@event.ForcedPush) - config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行,为了约束顺序 - else - config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); + config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); if (config == null) continue; // 是否自动推送 if (!config.IsAutoPush) continue; @@ -311,6 +308,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe .WhereIf(!compareFields.IsNullOrWhiteSpace(), x => { if (x["extra"] == null || log.Extra == null) return false; + // todo:这里也改成统一使用system txt json,不用newtonsoft了 var extra = JObject.FromObject(x["extra"]!); var curExtra = JObject.FromObject(log.Extra!); if (extra.TryGetValue(compareFields!, out var value) && curExtra.TryGetValue(compareFields!, out var curValue) ) From 5913929dcca5ffa313b532829c1ce4a636cda281 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 10 Jan 2025 11:17:52 +0800 Subject: [PATCH 56/80] =?UTF-8?q?update:=E8=BD=A8=E8=BF=B9=E6=96=B0?= =?UTF-8?q?=E5=A2=9E/=E6=9B=B4=E6=96=B0=E6=94=AF=E6=8C=81=E6=8C=89?= =?UTF-8?q?=E6=89=A9=E5=B1=95=E5=86=85=E5=AE=B9=E6=9F=90=E4=B8=AA=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E6=AF=94=E8=BE=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProvideServices/BatchUpsertTrackInput.cs | 5 ++++ .../Dtos/ProvideServices/UpsertTrackInput.cs | 5 ++++ .../EventHandlers/TrackPushEventHandler.cs | 28 ++++++++++--------- .../EventHandlers/TrackUpsertEventHandler.cs | 18 +++++++++--- .../Services/ProvideServices/TrackService.cs | 1 + 5 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs index 90e159cc..276ad83b 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs @@ -120,6 +120,11 @@ public class BatchUpsertTrackInput : OrderNosInfo [Range(-12, 12)] public float? DestinationTimeZone { get; set; } + /// + /// 重复的情况下,用什么比较 + /// + public string? CompareFields { 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 2b15e904..d7679cda 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs @@ -129,6 +129,11 @@ public class UpsertTrackInput : OrderNoInfo /// public int OptionUserId { get; set; } + /// + /// 重复的情况下,用什么比较 + /// + public string? CompareFields { get; set; } + /// /// 扩展信息字段,用与轨迹推送的附加字段 /// diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index eff95d65..109f96a5 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -1,7 +1,7 @@ +using System.Text.Json; using DotNetCore.CAP; using Microsoft.Extensions.Options; using Newtonsoft.Json; -using Newtonsoft.Json.Linq; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.InterfaceRelay.Application.Contracts; using SJZY.Track.Application.Contract.Dtos.TrackPush; @@ -308,14 +308,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe .WhereIf(!compareFields.IsNullOrWhiteSpace(), x => { if (x["extra"] == null || log.Extra == null) return false; - // todo:这里也改成统一使用system txt json,不用newtonsoft了 - var extra = JObject.FromObject(x["extra"]!); - var curExtra = JObject.FromObject(log.Extra!); - if (extra.TryGetValue(compareFields!, out var value) && curExtra.TryGetValue(compareFields!, out var curValue) ) - { - return value == curValue; - } - return false; + return EqExtraByFieldForTextJson(x["extra"]!, DeserializeForTextJson(log.Extra)!, compareFields!); }) .FirstOrDefault(); if (old != null) @@ -323,6 +316,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe body.Data.Remove(old); } } + body!.Data.Add(cur); } } @@ -383,10 +377,18 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe return string.IsNullOrWhiteSpace(json) ? default : System.Text.Json.JsonSerializer.Deserialize(json); } - private Dictionary? GetExtraDictForTextJson(string? extraStr) + //比较扩展中的某个字段的相等性 + private bool EqExtraByFieldForTextJson(object a, object b, string fieldName) { - return string.IsNullOrWhiteSpace(extraStr) - ? null - : System.Text.Json.JsonSerializer.Deserialize>(extraStr); + if (a is not JsonElement aJsonElement || b is not JsonElement bJsonElement) + return false; + + if (aJsonElement.TryGetProperty(fieldName, out var aValue) + && bJsonElement.TryGetProperty(fieldName, out var bValue)) + { + return aValue.ToString() == bValue.ToString(); + } + + return false; } } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index cfdba588..3bf950a9 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using System.Text.Json; using DotNetCore.CAP; using Microsoft.Extensions.Logging; using SJZY.Expand.ABP.Core.Logger; @@ -237,7 +238,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe { var orderIds = @event.OrderIdentifiers.Select(x => x.OrderId).ToArray(); - // todo:条件命名写反了 // important:轨迹code相同,时间、发生地不同的,可能存在多条!! var tracks = await _trackDetailsEsRepository.GetListAsync(orderIds, @event.TrackCode, true); @@ -282,7 +282,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe return false; } - return oldValue == compareValue; + return EqJsonElementObject(oldValue, compareValue); }).ToList(); } @@ -445,10 +445,20 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe return track; } - private Dictionary? GetExtraDictForTextJson(string? extraStr) + private Dictionary? GetExtraDictForTextJson(string? extraStr) { return string.IsNullOrWhiteSpace(extraStr) ? null - : System.Text.Json.JsonSerializer.Deserialize>(extraStr); + : System.Text.Json.JsonSerializer.Deserialize>(extraStr); + } + + private bool EqJsonElementObject(object? a, object? b) + { + if (a is JsonElement aJsonElement && b is JsonElement bJsonElement) + { + return aJsonElement.ToString() == bJsonElement.ToString(); + } + + return false; } } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index e13a1a30..0af5624e 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -519,6 +519,7 @@ public partial class TrackService : ApplicationService, ITrackService TrackPlacePostcode = input.TrackPlacePostcode, EstimatedDeliveryDate = input.EstimatedDeliveryDate, DestinationTimeZone = input.DestinationTimeZone, + CompareFields = input.CompareFields, Extra = input.Extra, ForcedPush = input.ForcedPush, IsToMq = input.IsToMq, From 94702e4c563b707e3996b4b01c2485d73e2ecf61 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 10 Jan 2025 11:19:18 +0800 Subject: [PATCH 57/80] =?UTF-8?q?update-package:=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=A7=84=E7=BA=A6=E5=8C=85=E8=87=B37.0.13=20-=20=EF=BC=88?= =?UTF-8?q?=E5=8D=95=E4=B8=AA/=E6=89=B9=E9=87=8F=EF=BC=89=E6=96=B0?= =?UTF-8?q?=E5=A2=9E/=E6=9B=B4=E6=96=B0=E8=BD=A8=E8=BF=B9=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=A2=9E=E5=8A=A0=E6=AF=94=E8=BE=83=E5=AD=97=E6=AE=B5?= =?UTF-8?q?CompareFields?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SJZY.Track.Application.Contract.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj index 48722a57..1c988cbc 100644 --- a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj +++ b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj @@ -5,7 +5,7 @@ net7.0 True - 7.0.12 + 7.0.13 True From 8287e6a43725a5fe62e7246acd54604169e22b2a Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 10 Jan 2025 15:43:31 +0800 Subject: [PATCH 58/80] =?UTF-8?q?feat:=E8=BD=A8=E8=BF=B9=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E5=A4=84=E7=90=86=E4=B8=AD=EF=BC=8C=E5=B9=BF=E6=92=AD=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E5=A4=B1=E8=B4=A5=E5=8E=9F=E5=9B=A0=EF=BC=88=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=AD=98=E5=9C=A8=E4=B8=8E=E5=90=A6/=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E8=87=AA=E5=8A=A8=E6=8E=A8=E9=80=81/=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E7=B1=BB=E5=9E=8B=E6=98=AF=E5=90=A6=E4=B8=80=E8=87=B4?= =?UTF-8?q?/=E9=A1=BA=E5=BA=8F/=E5=BC=82=E5=B8=B8=E5=8D=95/=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E6=8E=A5=E5=8F=A3=E9=80=9A=E5=A4=B1=E8=B4=A5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackPush/TrackPushRecordDto.cs | 2 +- .../Events/TrackPushCompletedEvent.cs | 3 +- .../Services/IBroadcastingService.cs | 6 + .../EventHandlers/TrackPushEventHandler.cs | 159 +++++++++++++++--- .../Broadcasting/BroadcastingService.cs | 6 + 5 files changed, 153 insertions(+), 23 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs index 7bb84c1c..0e978af4 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs @@ -30,7 +30,7 @@ public class TrackPushRecordDto /// /// 接口通请求Id /// - public Guid RequestId { get; set; } + public Guid? RequestId { get; set; } /// /// 信息 diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs index 6e3d3987..c7f4801d 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs @@ -27,8 +27,9 @@ public class TrackPushCompletedEvent /// /// 接口通请求Id + /// 在请求接口通前被拦截,就不会有请求Id /// - public Guid RequestId { get; set; } + public Guid? RequestId { get; set; } /// /// 信息 diff --git a/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs index caca1139..4a1cb510 100644 --- a/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs +++ b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs @@ -27,4 +27,10 @@ public interface IBroadcastingService : ITransientDependency /// /// void TrackPushCompletedPublicTopic(TrackPushRecordDto log); + + /// + /// 轨迹推送失败广播(推送前置被拦截,或调用接口通失败) + /// + /// + void TrackPushFailedPubilcTopic(TrackPushRecordDto log); } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 109f96a5..1b5dab76 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -25,19 +25,23 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe private readonly IOrderRepository _orderRepository; private readonly ITrackPushCacheService _trackPushCacheService; private readonly ITrackPushRecordEsRepository _trackPushRecordEsRepository; + private readonly IBroadcastingService _broadcastingService; private List _orders = null!; private List _pushConfigs = null!; public TrackPushEventHandler(IHttpClientProxy httpClientProxy, - IOrderRepository orderRepository, ITrackPushCacheService trackPushCacheService, + IOrderRepository orderRepository, + ITrackPushCacheService trackPushCacheService, ITrackPushRecordEsRepository trackPushRecordEsRepository, - IOptionsMonitor options) + IOptionsMonitor options, + IBroadcastingService broadcastingService) { _httpClientProxy = httpClientProxy; _orderRepository = orderRepository; _trackPushCacheService = trackPushCacheService; _trackPushRecordEsRepository = trackPushRecordEsRepository; _options = options; + _broadcastingService = broadcastingService; } [CapSubscribe(GlobalConst.TrackPushSubscribe, Group = GlobalConst.TrackPushSubscribe)] @@ -97,16 +101,44 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var isSystemPush = @event.OperationMan == null; if (isSystemPush && !@event.ForcedPush) { + config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); foreach (var order in _orders) { - if (order.QuestionType == (int) TrackProblemType.Error) continue; // 系统不推异常单,只能人工操作 + if (config == null) + { + TrackPushFailedPublicTopic($"没有在推送映射配置中找到关于轨迹代码[{@event.TrackCode}]的配置", @event, order); + return; + } + + // 系统不推异常单,只能人工操作 + if (order.QuestionType == (int) TrackProblemType.Error) + { + TrackPushFailedPublicTopic("系统不推异常单,只能人工操作", @event, order); + continue; + } + // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行,为了约束顺序 - config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); - if (config == null) continue; + var (resultConfig, nextCode) = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); + if (resultConfig == null) + { + TrackPushFailedPublicTopic($"推送顺序异常,下一个要推送的应为[{nextCode}]", @event, order); + continue; + } + config = resultConfig; + // 是否自动推送 - if (!config.IsAutoPush) continue; + if (!config.IsAutoPush) + { + TrackPushFailedPublicTopic($"没有设置为自动推送,如果要推送请手动推送", @event, order); + continue; + } + // 配置的类型如何和订单类型不一致则不允许推送 - if (config.OrderType != order.OrderType) continue; + if (config.OrderType != order.OrderType) + { + TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event, order); + continue; + } var log = new TrackPushRecordIndex { @@ -131,26 +163,42 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } // 手工或强制推送,不会校验已推和顺序问题,因为可能是更新 else + { config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); - if (config == null) return; - foreach (var order in _orders) { - if (config is { IsAllPush: true }) + if (config == null) { - // 强制推送只需直接查出配置 - if (@event.ForcedPush) - config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); - // 推断 本次推送 是否可行 - else - config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); + TrackPushFailedPublicTopic($"没有在推送映射配置中找到关于轨迹代码[{@event.TrackCode}]的配置", @event, order); + return; + } + + if (config is { IsAllPush: true }) + { + // 非强制推送需要 推断 本次推送 是否可行 + if (!@event.ForcedPush) + { + var (resultConfig, nextCode) = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); + if (resultConfig == null) + { + TrackPushFailedPublicTopic($"推送顺序异常,下一个要推送的应为[{nextCode}]", @event, order); + continue; + } + + config = resultConfig; + } + + // tips:强制推送直接使用配置 } - if (config == null) continue; //配置的类型如何和订单类型不一致则不允许推送 - if (config.OrderType != order.OrderType) continue; + if (config.OrderType != order.OrderType) + { + TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event, order); + continue; + } var log = new TrackPushRecordIndex { @@ -188,6 +236,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (r.Code != GlobalConst.SuccessCode) { + TrackPushFailedPublicTopic($"轨迹中台调用接口通失败,RequestId: {r.RequestId}; Msg: {r.Msg}", @event, r.RequestId, items.Cast().ToList()); throw new BusinessException(message: $"requestId: {r.RequestId}; serviceProviderCode:{serviceProviderCode} Msg: {r.Msg}"); } } @@ -202,7 +251,11 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe foreach (var order in _orders) { //配置的类型如何和订单类型不一致则不允许推送 - if (config.OrderType != order.OrderType) continue; + if (config.OrderType != order.OrderType) + { + TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event, order); + continue; + } var log = new TrackPushRecordIndex { @@ -239,6 +292,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (r.Code != GlobalConst.SuccessCode) { + TrackPushFailedPublicTopic($"轨迹中台调用接口通失败,RequestId: {r.RequestId}; Msg: {r.Msg}", @event, r.RequestId, items.Cast().ToList()); throw new BusinessException(message: $"requestId: {r.RequestId}; serviceProviderCode:{serviceProviderCode} Msg: {r.Msg}"); } } @@ -330,7 +384,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe /// 根据轨迹代码推断下一个(升序)要推送的内容,如果找不到或者已经是最后一个了 /// 则查询有没有可交换的推送,没有就返回null /// - private static TrackPushContentConfigDto? GetValidPushConfigAsync(List cache, + private static (TrackPushContentConfigDto? config, string nextCode) GetValidPushConfigAsync(List cache, string? latestPushTrackCode, string? trackCode) { var idx = cache.FindIndex(x => x.TrackCode == latestPushTrackCode); @@ -344,7 +398,10 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe // find swap cache.FirstOrDefault(x => x.TrackCode == cache[idx + 1].SwapTrackCode); - return matched != null && matched.TrackCode == trackCode ? matched : default; + //没推完,可能不符合推送顺序 + return matched != null && matched.TrackCode == trackCode + ? (matched, matched.TrackCode) + : (default, matched?.TrackCode ?? cache[idx + 1].TrackCode); } /// @@ -391,4 +448,64 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe return false; } + + //轨迹推送失败(被拦截) + private void TrackPushFailedPublicTopic( + string failedMessage, + TrackPushEvent @event, + OrderEntity order) + { + _broadcastingService.TrackPushFailedPubilcTopic(new TrackPushRecordDto + { + //还没请求接口通 + RequestId = null, + IsSuccess = false, + Message = failedMessage, + OperationMan = @event.OperationMan, + PushTime = DateTime.Now, + OptionType = @event.OptionType.ToString(), + IsManualPush = @event.OperationMan != null, + //还没到构建推送内容那一步就被拦截 + PushContent = string.Empty, + OrderNo = order.OrderNo, + TrackStatus = @event.SystemPushInfo.TrackStatus, + TrackContent = @event.SystemPushInfo.TrackStatus, + TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, + TrackTime = @event.SystemPushInfo.TrackTime, + TrackPlace = @event.SystemPushInfo.TrackPlace, + TrackCode = @event.TrackCode, + Extra = @event.SystemPushInfo.Extra, + }); + } + + //轨迹推送失败(请求接口通) + private void TrackPushFailedPublicTopic( + string failedMessage, + TrackPushEvent @event, + Guid requestId, + List pushOrUpdateInputs) + { + foreach (var pushInput in pushOrUpdateInputs) + { + _broadcastingService.TrackPushFailedPubilcTopic(new TrackPushRecordDto + { + RequestId = requestId, + IsSuccess = false, + Message = failedMessage, + OperationMan = @event.OperationMan, + PushTime = DateTime.Now, + OptionType = @event.OptionType.ToString(), + IsManualPush = @event.OperationMan != null, + PushContent = SerializeForTextJson(pushInput), + OrderNo = pushInput.OrderNo, + TrackStatus = @event.SystemPushInfo.TrackStatus, + TrackContent = @event.SystemPushInfo.TrackStatus, + TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, + TrackTime = @event.SystemPushInfo.TrackTime, + TrackPlace = @event.SystemPushInfo.TrackPlace, + TrackCode = @event.TrackCode, + Extra = @event.SystemPushInfo.Extra, + }); + } + } } diff --git a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs index 14c6c578..b0415664 100644 --- a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs +++ b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs @@ -111,4 +111,10 @@ public class BroadcastingService : IBroadcastingService _rabbitClientBus.Publish(GlobalConst.TrackPushExchange, $"TrackPush.{log.SubSystemCode}", Encoding.UTF8.GetBytes(data.ToJson())); } + + public void TrackPushFailedPubilcTopic(TrackPushRecordDto log) + { + //暂时使用推送完成模型,后续可能会出现有区分度的模型 + TrackPushCompletedPublicTopic(log); + } } From ccc08166b9aa98e957556ac1e5481c3df09abde8 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 10 Jan 2025 15:54:09 +0800 Subject: [PATCH 59/80] =?UTF-8?q?update-package:=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=A7=84=E7=BA=A6=E5=8C=85=E7=89=88=E6=9C=AC=E4=B8=BA7.0.14=20?= =?UTF-8?q?-=20=E8=AF=B7=E6=B1=82id=E8=AE=BE=E7=BD=AE=E4=B8=BA=E5=8F=AF?= =?UTF-8?q?=E7=A9=BA=EF=BC=8C=E8=B0=83=E6=95=B4=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackPush/TrackPushRecordDto.cs | 1 + .../SJZY.Track.Application.Contract.csproj | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs index 0e978af4..a2d88e3b 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs @@ -29,6 +29,7 @@ public class TrackPushRecordDto /// /// 接口通请求Id + /// 在请求接口通前被拦截,就不会有请求Id /// public Guid? RequestId { get; set; } diff --git a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj index 1c988cbc..f0778d54 100644 --- a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj +++ b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj @@ -5,7 +5,7 @@ net7.0 True - 7.0.13 + 7.0.14 True From 8ca0adfbd39b9b0229a6f7f49038f118f7540dc9 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 10 Jan 2025 16:39:23 +0800 Subject: [PATCH 60/80] =?UTF-8?q?update:=20=E6=96=B0=E5=A2=9E=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E8=BD=A8=E8=BF=B9=E5=90=8E=E8=AE=B0=E5=BD=95=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E6=93=8D=E4=BD=9C=E6=97=A5=E5=BF=97=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E6=93=8D=E4=BD=9C=EF=BC=8C=E5=B9=B6=E4=B8=94?= =?UTF-8?q?=E4=BF=9D=E8=AF=81=E5=8F=AA=E6=9C=89=E8=BD=A8=E8=BF=B9=E5=AE=9E?= =?UTF-8?q?=E9=99=85=E6=93=8D=E4=BD=9C=E6=88=90=E5=8A=9F=E5=90=8E=E6=89=8D?= =?UTF-8?q?=E4=BC=9A=E5=86=99=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackPushEventHandler.cs | 1 - .../EventHandlers/TrackUpsertEventHandler.cs | 55 +++++++++---------- .../Services/ProvideServices/TrackService.cs | 2 +- .../IOrderOperationRecordEsRepository.cs | 7 +++ .../OrderOperationRecordEsRepository.cs | 18 ++++++ 5 files changed, 53 insertions(+), 30 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 1b5dab76..a90592fe 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -95,7 +95,6 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe private async Task DoPushAsync(TrackPushEvent @event) { - // todo: 轨迹中台推送逻辑致使的未推送,也需要广播到mq,告知业务系统缘故 var items = new List(); TrackPushContentConfigDto? config; var isSystemPush = @event.OperationMan == null; diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 3bf950a9..dc8a327f 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -176,6 +176,14 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe // 批量add to es await _trackDetailsEsRepository.AddManyAsync(insertTracks); + //批量写入订单操作日志 + _ = _orderOperationRecordEsRepository + .AddManyAsync(insertTracks.Select(t => BuildOrderOperationRecord(@event, t, new OrderIdentifier + { + OrderNo = t.OrderNo, + OrderId = t.OrderId + })).ToList()); + // 添加轨迹触发订单拉取状态更新 await _orderRepository.UpdatePullStatusToSilenceAsync(insertTracks.Select(x => x.OrderId).ToList(), @event.TrackCode); @@ -243,7 +251,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe var insertTracks = new List(); var updateTracks = new List(); - + var operationRecords = new List(); foreach (var order in @event.OrderIdentifiers) { // fast path: by update with es id case @@ -277,7 +285,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe { var oldExtraDict = GetExtraDictForTextJson(x.Extra); // tips:注意兼容性,历史轨迹的字段可能为空 - if (oldExtraDict == null|| !oldExtraDict.TryGetValue(@event.CompareFields, out var oldValue)) + if (oldExtraDict == null || !oldExtraDict.TryGetValue(@event.CompareFields, out var oldValue)) { return false; } @@ -301,6 +309,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe if (track == null) continue; // 不存在不让改 updateTracks.Add(BuiltUpdateTrack(@event, track, order, trackContent)); + operationRecords.Add(BuildOrderOperationRecord(@event, track, order)); } else { @@ -317,6 +326,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe { //批量差异化更新轨迹 await _trackDetailsEsRepository.BulkUpdateAsync(updateTracks); + //批量写入操作日志 + _ = _orderOperationRecordEsRepository.AddManyAsync(operationRecords); } return insertTracks; @@ -363,19 +374,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe track.EstimatedDeliveryDate = @event.EstimatedDeliveryDate; track.Extra = @event.Extra; - // todo:如果后面写es异常了,这里日志不就不准了,这里应该和写轨迹一样,做成批量的,放到写完轨迹只会写日志 - // 写入操作日志 - _ = _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 - }); - return track; } @@ -429,19 +427,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe ? track.TrackTime : track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); - // todo:如果后面写es异常了,这里日志不就不准了,这里应该和写轨迹一样,做成批量的,放到写完轨迹只会写日志 - // 写入操作日志 - _ = _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 - }); - return track; } @@ -461,4 +446,18 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe return false; } + + private OrderOperationRecordIndex BuildOrderOperationRecord(TrackUpsertEvent @event, TrackDetailsIndex track, OrderIdentifier order) + { + return new OrderOperationRecordIndex + { + OrderId = order.OrderId, + OrderNo = order.OrderNo, + OptionType = @event.IsAdd ? OrderOperationType.创建轨迹.ToString() : OrderOperationType.修改轨迹.ToString(), + Content = track.ToJson(), + CreateUserId = @event.OperationManId, + CreateUserName = @event.OperationMan ?? "", + CreateTime = DateTime.Now + }; + } } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 0af5624e..e58d3355 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -157,7 +157,7 @@ public partial class TrackService : ApplicationService, ITrackService var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(); if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) { - //todo:保留之前的方式 后续可去除 + //todo:保留之前的方式(FBA在用) 后续可能去除 userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(input.OptionUserId); if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderOperationRecordEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderOperationRecordEsRepository.cs index 9f3af683..eb97ddae 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderOperationRecordEsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderOperationRecordEsRepository.cs @@ -9,6 +9,13 @@ public interface IOrderOperationRecordEsRepository /// Task AddAsync(OrderOperationRecordIndex index); + /// + /// 添加订单操作记录(批量) + /// + /// + /// + Task AddManyAsync(List indexes); + /// /// 获取订单操作记录 /// diff --git a/src/SJZY.Track.Repository/Repositories/OrderOperationRecordEsRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderOperationRecordEsRepository.cs index 99d71604..0c30c860 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderOperationRecordEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderOperationRecordEsRepository.cs @@ -29,6 +29,24 @@ public class OrderOperationRecordEsRepository : ElasticSearchContextAbstract indexes) + { + // 按天写入es + var indexName = $"{GlobalConst.OrderOperationRecordIndex}-{DateTime.Now:yyyy.MM.dd}"; + indexes.ForEach(x => + { + x.IndexName = indexName; + x.CreateTime = DateTime.Now; + }); + + var r = await Context.IndexManyAsync(indexes, indexName); + + if (!r.IsValid) + { + throw new InvalidOperationException($"{indexes.Count}条订单变更记录写入失败,原因:{r.DebugInformation}。"); + } + } + public async Task> GetOrderOperationsByIdAsync(int orderId) { var data = await Context.SearchAsync(x => x From a517eae81f8b58c0116db68f3a533447684bb862 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Mon, 13 Jan 2025 16:11:08 +0800 Subject: [PATCH 61/80] =?UTF-8?q?fix=EF=BC=9A=E8=BD=A8=E8=BF=B9=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E4=BA=8B=E4=BB=B6=E5=A4=84=E7=90=86=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E8=BD=A8=E8=BF=B9=E5=85=A8=E9=87=8F=E6=8E=A8=E9=80=81?= =?UTF-8?q?=EF=BC=88=E6=9C=80=E6=96=B0=E8=BD=A8=E8=BF=B9=EF=BC=89=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E6=AF=94=E8=BE=83=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CAP/EventHandlers/TrackPushEventHandler.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index a90592fe..d695a433 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -356,14 +356,22 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe body = DeserializeForTextJson(history.PushContent); if (config.IsAllPushWithLatest) { + //同code同比较字段保证唯一 var old = body!.Data - .Where(x => x["code"] == cur["code"]) - .WhereIf(!compareFields.IsNullOrWhiteSpace(), x => + .Where(x => + { + //反序列化出的JsonElement和字典字符串类型做比较 + var a = ((JsonElement) x["code"]!).GetString(); + var b = cur["code"]!.ToString(); //tips: 需要要将object类型的字符串转为string类型,否则使用的是引用比较,反序列化出的string一定和本地string引用不同 + return a == b; + }).WhereIf(!compareFields.IsNullOrWhiteSpace(), x => { if (x["extra"] == null || log.Extra == null) return false; - return EqExtraByFieldForTextJson(x["extra"]!, DeserializeForTextJson(log.Extra)!, compareFields!); + return EqExtraByFieldForTextJson(x["extra"]!, DeserializeForTextJson(log.Extra), compareFields!); }) .FirstOrDefault(); + + if (old != null) { body.Data.Remove(old); From 60324b0e2663e1e39a740bb762ed1bb1884ee2ad Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Mon, 13 Jan 2025 16:20:49 +0800 Subject: [PATCH 62/80] =?UTF-8?q?update:=E5=8D=95=E4=B8=AA=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E5=88=A0=E9=99=A4=E5=8E=BB=E9=99=A4goto=EF=BC=8C?= =?UTF-8?q?=E9=99=84=E5=8A=A0=E6=AF=94=E8=BE=83=E5=AD=97=E6=AE=B5=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ProvideServices/TrackService.cs | 48 +++++++++++++------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index e58d3355..4923b7d2 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -225,12 +225,32 @@ public partial class TrackService : ApplicationService, ITrackService var trackCodes = input.TrackIdentifiers?.Select(x => x.TrackCode).ToList(); var trackIds = input.TrackIdentifiers?.Select(y => $"{y.TrackCode}{y.TrackTime}").ToHashSet(); //没有任何需要操作的轨迹 - if (trackIds == null || trackIds.Count == 0) goto NO_DELETE_TRACK; + if (trackIds == null || trackIds.Count == 0) + { + throw new BusinessException(message: "没有任何轨迹要删除,请检查输入参数"); + } + //删除轨迹约束,只要其中有一条来源是外部的就立即返回错误 tracks = await _trackDetailsEsRepository.GetListAsync(new[] { orderId }, trackCodes); //检查删除的轨迹中是否包含外部轨迹 existsExternal = tracks .Where(x => x.Source == (int) TrackSourceEnum.ExternalServiceProvide) + .WhereIf(!input.CompareFields.IsNullOrWhiteSpace(), y => + { + if (string.IsNullOrWhiteSpace(y.Extra)) + { + throw new BusinessException(message: "轨迹extra为空无法使用比较字段比较,请检查轨迹"); + } + + var extraDict = System.Text.Json.JsonSerializer.Deserialize>(y.Extra); + if (extraDict!.TryGetValue(input.CompareFields!, out var compareValue)) + { + //tips:可能会有问题 + return compareValue.Equals(input.CompareValue); + } + + return false; + }) .Select(x => $"{x.TrackCode}{x.TrackTime}") .Any(x => trackIds.Contains(x)); } @@ -240,24 +260,23 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: "存在来源于外部服务商的轨迹,不允许删除"); } - - // todo:非必须不用goto,除非是在写算法,业务逻辑理论上都能通过if和方法规避 - NO_DELETE_TRACK: if (tracks.Count == 0) { throw new BusinessException(message: "没有任何轨迹要删除,请检查输入参数"); } // 删除轨迹 - var @event = new TrackDeleteEvent - { - EsIds = input.EsIds?.ToArray(), - OrderIds = new[] { orderId }, - TrackIdentifiers = input.TrackIdentifiers, - SubSystemId = input.SubSystemId, - OperationMan = name - }; - await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, @event); + await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, + new TrackDeleteEvent + { + EsIds = input.EsIds?.ToArray(), + OrderIds = new[] { orderId }, + CompareFields = input.CompareFields, + CompareValue = input.CompareValue, + TrackIdentifiers = input.TrackIdentifiers, + SubSystemId = input.SubSystemId, + OperationMan = name + }); return new UnifyResultDto(true, true); } @@ -351,6 +370,8 @@ public partial class TrackService : ApplicationService, ITrackService { OrderIds = orderIds.ToArray(), TrackIdentifiers = input.TrackIdentifiers, + CompareFields = input.CompareFields, + CompareValue = input.CompareValue, SubSystemId = input.SubSystemId, OperationMan = userInfo.Data.UserName, }; @@ -360,7 +381,6 @@ public partial class TrackService : ApplicationService, ITrackService } - // todo:代码封装性太差了,拆小一点 /// /// 批量新增、更新轨迹 From 183ea314e33c4519c3314723e307e6c4d79b1159 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Mon, 13 Jan 2025 16:31:44 +0800 Subject: [PATCH 63/80] =?UTF-8?q?update:=20=E8=A1=A5=E5=85=85=E5=85=A5?= =?UTF-8?q?=E5=8F=82=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProvideServices/BatchDeleteTrackInput.cs | 10 +++++++++ .../Dtos/ProvideServices/DeleteOrderInput.cs | 10 +++++++++ .../Dtos/ProvideServices/PushTrackInput.cs | 10 +++++++++ .../Services/ProvideServices/TrackService.cs | 21 +++++++++++++++++-- 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackInput.cs index 45ccc51c..9d3db0a5 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackInput.cs @@ -10,4 +10,14 @@ public class BatchDeleteTrackInput : OrderNosInfo [Required] [MaxLength(500)] public List TrackIdentifiers { get; set; } = new(); + + /// + /// 重复的情况下,用什么字段比较 + /// + public string? CompareFields { get; set; } + + /// + /// 重复的情况下,比较值 + /// + public object? CompareValue { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs index 662e50e5..ef4139e4 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs @@ -17,4 +17,14 @@ public class DeleteTrackInput : OrderNoInfo /// 轨迹ESId集合,非必填,如果有优先级最高 /// public List? EsIds { get; set; } + + /// + /// 重复的情况下,用什么字段比较 + /// + public string? CompareFields { get; set; } + + /// + /// 重复的情况下,比较值 + /// + public object? CompareValue { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/PushTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/PushTrackInput.cs index d58bea41..bc5b6cae 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/PushTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/PushTrackInput.cs @@ -9,4 +9,14 @@ public class PushTrackInput : OrderNosInfo /// [Required] public string TrackCode { get; set; } = null!; + + /// + /// 重复的情况下,用什么字段比较 + /// + public string? CompareFields { get; set; } + + /// + /// 重复的情况下,比较值 + /// + public object? CompareValue { get; set; } } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 4923b7d2..db991a76 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -245,7 +245,7 @@ public partial class TrackService : ApplicationService, ITrackService var extraDict = System.Text.Json.JsonSerializer.Deserialize>(y.Extra); if (extraDict!.TryGetValue(input.CompareFields!, out var compareValue)) { - //tips:可能会有问题 + //todo:需要修改JsonElement和object的逻辑 return compareValue.Equals(input.CompareValue); } @@ -358,7 +358,24 @@ public partial class TrackService : ApplicationService, ITrackService TrackSourceEnum.ExternalServiceProvide); //当要删除的轨迹标识出现交叉则不允许删除 - var intersect = tracks.Select(x => $"{x.TrackCode}{x.TrackTime}") + var intersect = tracks + .WhereIf(!input.CompareFields.IsNullOrWhiteSpace(), y => + { + if (string.IsNullOrWhiteSpace(y.Extra)) + { + throw new BusinessException(message: "轨迹extra为空无法使用比较字段比较,请检查轨迹"); + } + + var extraDict = System.Text.Json.JsonSerializer.Deserialize>(y.Extra); + if (extraDict!.TryGetValue(input.CompareFields!, out var compareValue)) + { + //todo:需要修改JsonElement和object的逻辑 + return compareValue.Equals(input.CompareValue); + } + + return false; + }) + .Select(x => $"{x.TrackCode}{x.TrackTime}") .Intersect(input.TrackIdentifiers.Select(y => $"{y.TrackCode}{y.TrackTime}")).ToList(); if (intersect.Count > 0) { From 100d901e0d41a650bd7c36040aed3afe33f48d93 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Mon, 13 Jan 2025 16:33:41 +0800 Subject: [PATCH 64/80] =?UTF-8?q?add-model:=E8=A1=A5=E5=85=85=E5=85=A5?= =?UTF-8?q?=E5=8F=82=E6=A8=A1=E5=9E=8B=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Events/TrackDeleteEvent.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs index 0859de6b..6fa3c346 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs @@ -12,17 +12,27 @@ public class TrackDeleteEvent /// /// es中的id /// - public string[] EsIds { get; set; } + public string[]? EsIds { get; set; } /// /// 订单ids /// public int[] OrderIds { get; set; } = null!; + /// + /// 重复的情况下,用什么字段比较 + /// + public string? CompareFields { get; set; } + + /// + /// 重复的情况下,比较值 + /// + public object? CompareValue { get; set; } + /// /// 轨迹标识符 /// - public List TrackIdentifiers { get; set; } = null!; + public List? TrackIdentifiers { get; set; } /// /// 操作人 From 7d7bc45c67548c7c377ecaeaf9170068a68b0418 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Tue, 14 Jan 2025 10:51:01 +0800 Subject: [PATCH 65/80] =?UTF-8?q?pref:=E8=BD=A8=E8=BF=B9=E6=8E=A8=E9=80=81?= =?UTF-8?q?=EF=BC=88=E6=89=8B=E5=8A=A8=EF=BC=89=E6=94=AF=E6=8C=81=E6=8C=89?= =?UTF-8?q?=E6=AF=94=E8=BE=83=E5=AD=97=E6=AE=B5=E8=BF=87=E6=BB=A4=20pref:?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E5=88=A0=E9=99=A4=EF=BC=9A=20=20-=20?= =?UTF-8?q?=E5=B9=BF=E6=92=AD=E5=A2=9E=E5=8A=A0=E8=BD=A8=E8=BF=B9=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=98=8E=E7=BB=86=E5=A1=AB=E5=85=85=20=20-=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=AF=94=E8=BE=83=E5=AD=97=E6=AE=B5=E6=9D=A5?= =?UTF-8?q?=E7=B2=BE=E7=A1=AE=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/IBroadcastingService.cs | 8 + .../EventHandlers/TrackDeleteEventHandler.cs | 198 +++++++++++++++--- .../EventHandlers/TrackPushEventHandler.cs | 42 +--- .../EventHandlers/TrackUpsertEventHandler.cs | 14 +- .../Helpers/TextJsonHelper.cs | 125 +++++++++++ .../Broadcasting/BroadcastingService.cs | 6 + .../ProvideServices/TrackPushService.cs | 32 ++- 7 files changed, 351 insertions(+), 74 deletions(-) create mode 100644 src/SJZY.Track.Application/Helpers/TextJsonHelper.cs diff --git a/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs index 4a1cb510..a3d1091e 100644 --- a/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs +++ b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs @@ -22,6 +22,14 @@ public interface IBroadcastingService : ITransientDependency /// void TrackChangePublicTopicAsync(TrackDeleteEvent eto, OrderIdentifier[] orderIdentifiers, string trackCode, string trackStatusCode, string subSystemCode); + /// + /// 轨迹变更广播(删除) + /// + /// + /// + /// + void TrackChangePublicTopicAsync(TrackChangeEto eto, string subSystemCode); + /// /// 轨迹推送完成广播(推送完成回调) /// diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index 7e798eba..1265a4d9 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -1,9 +1,12 @@ +using System.Collections.Immutable; +using System.Text.Json; using DotNetCore.CAP; using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Events; using SJZY.Track.Application.Contract.Services; +using SJZY.Track.Application.Helpers; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Enums; @@ -118,7 +121,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe return true; } - private async Task PublicTrackTopicAsync(TrackDeleteEvent eto, List trackList) + private async Task PublicTrackTopicAsync(TrackDeleteEvent @event, List trackList) { var systemIds = trackList.Select(x => x.SubSystemId).Distinct().ToArray(); var trackCodes = trackList.Select(x => x.TrackCode).Distinct().ToArray(); @@ -144,21 +147,63 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe var item = dataItem.First(); var content = contentList.First(m => m.TrackContentCode == item.TrackCode); - _broadcastingService.TrackChangePublicTopicAsync(eto, - dataItem.Select(m => new OrderIdentifier + // _broadcastingService.TrackChangePublicTopicAsync(track, + // dataItem.Select(m => new OrderIdentifier + // { + // OrderId = m.OrderId, + // OrderNo = m.OrderNo, + // OrderType = m.OrderType + // }).ToArray(), + // item.TrackCode, + // item.TrackStatusCode, + // content.SubSystemCode + // ); + + //将每个订单的每个轨迹的删除变更发布 + foreach (var track in dataItem) + { + _broadcastingService.TrackChangePublicTopicAsync(new TrackChangeEto { - OrderId = m.OrderId, - OrderNo = m.OrderNo, - OrderType = m.OrderType - }).ToArray(), - item.TrackCode, - item.TrackStatusCode, - content.SubSystemCode - ); + EstimatedDeliveryDate = track.EstimatedDeliveryDate, + TrackPlacePostcode = track.TrackPlacePostcode, + TrackPlaceNation = track.TrackPlaceNation, + TrackPlaceNationId = track.TrackPlaceNationId, + TrackPlaceProvince = track.TrackPlaceProvince, + TrackPlaceProvinceId = track.TrackPlaceProvinceId, + TrackPlaceCity = track.TrackPlaceCity, + TrackPlaceCityId = track.TrackPlaceCityId, + Files = track.Files?.Select(x => new FileItemDto() + { + FileName = x.FileName, + OssKey = x.OssKey + }).ToList(), + Remarks = track.Remarks, + Source = track.Source, + IsVisibility = track.IsVisibility, + TrackTimeZone = track.TrackTimeZone, + TrackTime = track.TrackTime, + TrackPlace = track.TrackPlace, + TrackStatusCode = track.TrackStatusCode, + EnStatus = track.TrackEnContent, + Content = track.TrackContent, + TrackCode = track.TrackCode, + OperationMan = @event.OperationMan, + OrderIdentifiers = new[] + { + new OrderIdentifier() + { + OrderId = track.OrderId, + OrderNo = track.OrderNo, + OrderType = track.OrderType + } + }, + SubSystemId = @event.SubSystemId, + Extra = track.Extra + }, content.SubSystemCode); + } } } - // todo:多个相同code的轨迹删除,也需要考虑?? private async Task> DeleteTrackAsync(TrackDeleteEvent @event) { List orderIds; @@ -196,10 +241,40 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe //根据订单查询出所有的轨迹,查所有是因为主单上需要进行回退更新 tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds); - //构建标识符集合 - var ids = @event.TrackIdentifiers.Select(x => $"{x.TrackCode}{x.TrackTime:G}").ToList(); - //根据标识符选出要删除的轨迹明细 - deleteTracks = tracks.Where(x => ids.Contains($"{x.TrackCode}{x.TrackTime:G}")).ToList(); + //比较字段为空则使用时间来作为额外的标识key + if (string.IsNullOrWhiteSpace(@event.CompareFields)) + { + //构建标识符集合 + var ids = @event.TrackIdentifiers.Select(x => $"{x.TrackCode}{x.TrackTime:G}").ToHashSet(); + //根据标识符选出要删除的轨迹明细 + deleteTracks = tracks.Where(x => ids.Contains($"{x.TrackCode}{x.TrackTime:G}")).ToList(); + } + //否则则使用比较字段,使用扩展字段中的内容进行比较 + else + { + var codes = @event.TrackIdentifiers.Select(x => x.TrackCode).ToImmutableHashSet(); + deleteTracks = tracks + .Where(x => + { + if (!codes.Contains(x.TrackCode)) + return false; + + if (string.IsNullOrWhiteSpace(x.Extra)) + { + throw new BusinessException(message: $"当前轨迹不存在扩展信息,无法利用扩展字段:{@event.CompareFields}"); + } + + var extraDict = GetExtraDictForTextJson(x.Extra); + if (extraDict == null || !extraDict.TryGetValue(@event.CompareFields, out var compareValue)) + { + throw new BusinessException(message: $"请检查拓展字段,为什么找不到比较字段:{@event.CompareFields}"); + } + + return TextJsonHelper.EqJsonElement(compareValue, @event.CompareValue); + }) + .ToList(); + } + if (deleteTracks.Count == 0) return deleteTracks; @@ -256,21 +331,9 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe order.EstimatedDeliveryDate = track.EstimatedDeliveryDate; order.DestinationTimeZone = track.DestinationTimeZone; } - - - // 写入操作日志 - _ = _orderOperationRecordEsRepository.AddAsync(new OrderOperationRecordIndex - { - OrderId = order.Id, - OrderNo = order.OrderNo, - OptionType = OrderOperationType.删除轨迹.ToString(), - Content = deleteTracks.Where(m => m.OrderId == order.Id).ToList().ToJson(), - CreateUserId = @event.OperationManId, - CreateUserName = @event.OperationMan ?? "", - CreateTime = DateTime.Now - }); } + //更新订单上冗余轨迹明细的字段 await _orderRepository.UpdateRangeAsync(orders, x => new { @@ -283,6 +346,83 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe x.DestinationTimeZone }); + //批量写入订单操作日志 + _ = _orderOperationRecordEsRepository.AddManyAsync(orders.Select(order => new OrderOperationRecordIndex + { + OrderId = order.Id, + OrderNo = order.OrderNo, + OptionType = OrderOperationType.删除轨迹.ToString(), + Content = deleteTracks.Where(m => m.OrderId == order.Id).ToList().ToJson(), + CreateUserId = @event.OperationManId, + CreateUserName = @event.OperationMan ?? "", + CreateTime = DateTime.Now + }).ToList()); + return deleteTracks; } + + private Dictionary? GetExtraDictForTextJson(string? extraStr) + { + return string.IsNullOrWhiteSpace(extraStr) + ? null + : System.Text.Json.JsonSerializer.Deserialize>(extraStr); + } + + //json Element和object的比较 + private bool EqJsonElementObject2(object? a, object? b) + { + if (a == null && b == null) + { + return true; + } + + if (a is JsonElement aJsonElement) + { + switch (aJsonElement.ValueKind) + { + case JsonValueKind.Undefined: + return false; + case JsonValueKind.Object: + return false; + case JsonValueKind.Array: + return false; + case JsonValueKind.String: + return string.Equals(aJsonElement.GetString(), b as string); + case JsonValueKind.Number: + { + if (b == null) return false; + + if (b is int bInt) + { + var aInt = aJsonElement.GetInt32(); + return aInt == bInt; + } + + if (b is long bLong) + { + var aLong = aJsonElement.GetInt64(); + return aLong == bLong; + } + + return false; + } + case JsonValueKind.True: + case JsonValueKind.False: + { + if (b is bool bl) + { + return aJsonElement.GetBoolean() == bl; + } + + return false; + } + case JsonValueKind.Null: + { + return false; + } + } + } + + return false; + } } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index d695a433..5aa98422 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -123,6 +123,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe TrackPushFailedPublicTopic($"推送顺序异常,下一个要推送的应为[{nextCode}]", @event, order); continue; } + config = resultConfig; // 是否自动推送 @@ -316,7 +317,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { "descriptionCn", config.TrackContentValue }, { "code", config.TrackContentCodeValue }, { "status", config.TrackStatusValue }, - { "extra", DeserializeForTextJson(log.Extra) } + { "extra", TextJsonHelper.Deserialize(log.Extra) } }; body.Data.Add(dict); log.PushContent = body.ToJson(); @@ -344,7 +345,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { "descriptionCn", config.TrackContentValue }, { "code", config.TrackContentCodeValue }, { "status", config.TrackStatusValue }, - { "extra", DeserializeForTextJson(log.Extra) } + { "extra", TextJsonHelper.Deserialize(log.Extra) } }; body.Data.Add(cur); @@ -353,7 +354,9 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var history = await _trackPushRecordEsRepository.GetLatestTrackPushRecordAsync(log.OrderId); if (history != default) { - body = DeserializeForTextJson(history.PushContent); + body = TextJsonHelper.Deserialize(history.PushContent); + + //在历史选出推送成功的历史轨迹 if (config.IsAllPushWithLatest) { //同code同比较字段保证唯一 @@ -367,22 +370,22 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe }).WhereIf(!compareFields.IsNullOrWhiteSpace(), x => { if (x["extra"] == null || log.Extra == null) return false; - return EqExtraByFieldForTextJson(x["extra"]!, DeserializeForTextJson(log.Extra), compareFields!); + return TextJsonHelper.EqByJsonElementField(x["extra"]!, TextJsonHelper.Deserialize(log.Extra), compareFields!); }) .FirstOrDefault(); - if (old != null) { body.Data.Remove(old); } + //根据code和比较字段值分组,在每组里选出一个创建时间最新的 } body!.Data.Add(cur); } } - log.PushContent = SerializeForTextJson(body); + log.PushContent = TextJsonHelper.Serialize(body)!; return body; } @@ -431,31 +434,6 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe return dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffK"); } - private static string SerializeForTextJson(object? obj) - { - return obj == null ? string.Empty : System.Text.Json.JsonSerializer.Serialize(obj); - } - - private static T? DeserializeForTextJson(string? json) - { - return string.IsNullOrWhiteSpace(json) ? default : System.Text.Json.JsonSerializer.Deserialize(json); - } - - //比较扩展中的某个字段的相等性 - private bool EqExtraByFieldForTextJson(object a, object b, string fieldName) - { - if (a is not JsonElement aJsonElement || b is not JsonElement bJsonElement) - return false; - - if (aJsonElement.TryGetProperty(fieldName, out var aValue) - && bJsonElement.TryGetProperty(fieldName, out var bValue)) - { - return aValue.ToString() == bValue.ToString(); - } - - return false; - } - //轨迹推送失败(被拦截) private void TrackPushFailedPublicTopic( string failedMessage, @@ -503,7 +481,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe PushTime = DateTime.Now, OptionType = @event.OptionType.ToString(), IsManualPush = @event.OperationMan != null, - PushContent = SerializeForTextJson(pushInput), + PushContent = TextJsonHelper.Serialize(pushInput), OrderNo = pushInput.OrderNo, TrackStatus = @event.SystemPushInfo.TrackStatus, TrackContent = @event.SystemPushInfo.TrackStatus, diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index dc8a327f..79f29ff8 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -1,11 +1,11 @@ using System.Diagnostics; -using System.Text.Json; using DotNetCore.CAP; using Microsoft.Extensions.Logging; using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Track.Application.Contract.Events; using SJZY.Track.Application.Contract.Services; +using SJZY.Track.Application.Helpers; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Dtos.TrackContents; @@ -290,7 +290,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe return false; } - return EqJsonElementObject(oldValue, compareValue); + return TextJsonHelper.EqJsonElement(oldValue, compareValue); }).ToList(); } @@ -437,16 +437,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe : System.Text.Json.JsonSerializer.Deserialize>(extraStr); } - private bool EqJsonElementObject(object? a, object? b) - { - if (a is JsonElement aJsonElement && b is JsonElement bJsonElement) - { - return aJsonElement.ToString() == bJsonElement.ToString(); - } - - return false; - } - private OrderOperationRecordIndex BuildOrderOperationRecord(TrackUpsertEvent @event, TrackDetailsIndex track, OrderIdentifier order) { return new OrderOperationRecordIndex diff --git a/src/SJZY.Track.Application/Helpers/TextJsonHelper.cs b/src/SJZY.Track.Application/Helpers/TextJsonHelper.cs new file mode 100644 index 00000000..387a9032 --- /dev/null +++ b/src/SJZY.Track.Application/Helpers/TextJsonHelper.cs @@ -0,0 +1,125 @@ +using System.Text.Json; + +namespace SJZY.Track.Application.Helpers; + +/// +/// 针对 Text.Json 的一些辅助方法 +/// +public static class TextJsonHelper +{ + public static string? Serialize(object? obj) + { + return obj == null ? default : System.Text.Json.JsonSerializer.Serialize(obj); + } + + public static T? Deserialize(string? json) + { + return string.IsNullOrWhiteSpace(json) ? default : System.Text.Json.JsonSerializer.Deserialize(json); + } + + /// + /// 两个jsonElement进行比较 + /// + /// + /// + /// + public static bool EqJsonElement(object? a, object? b) + { + if (a == null && b == null) + { + return true; + } + + if (a is JsonElement aJsonElement && b is JsonElement bJsonElement) + { + return aJsonElement.ToString() == bJsonElement.ToString(); + } + + return false; + } + + /// + /// jsonElement和object之间的比较 + /// + /// + /// + /// + public static bool EqJsonElementAndObject(object? jsonElement, object? obj) + { + if (jsonElement == null && obj == null) + { + return true; + } + + if (jsonElement is JsonElement aJsonElement) + { + switch (aJsonElement.ValueKind) + { + case JsonValueKind.Undefined: + return false; + case JsonValueKind.Object: + return false; + case JsonValueKind.Array: + return false; + case JsonValueKind.String: + return string.Equals(aJsonElement.GetString(), obj as string); + case JsonValueKind.Number: + { + if (obj == null) return false; + + if (obj is int bInt) + { + var aInt = aJsonElement.GetInt32(); + return aInt == bInt; + } + + if (obj is long bLong) + { + var aLong = aJsonElement.GetInt64(); + return aLong == bLong; + } + + return false; + } + case JsonValueKind.True: + case JsonValueKind.False: + { + if (obj is bool bl) + { + return aJsonElement.GetBoolean() == bl; + } + + return false; + } + case JsonValueKind.Null: + { + return false; + } + } + } + + return false; + } + + + /// + /// 比较两个jsonElement中的的fieldName字段的值 + /// + /// + /// + /// + /// + public static bool EqByJsonElementField(object a, object b, string fieldName) + { + if (a is not JsonElement aJsonElement || b is not JsonElement bJsonElement) + return false; + + if (aJsonElement.TryGetProperty(fieldName, out var aValue) + && bJsonElement.TryGetProperty(fieldName, out var bValue)) + { + return aValue.ToString() == bValue.ToString(); + } + + return false; + } +} diff --git a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs index b0415664..4add29c6 100644 --- a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs +++ b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs @@ -81,6 +81,12 @@ public class BroadcastingService : IBroadcastingService Encoding.UTF8.GetBytes(data.ToJson())); } + public void TrackChangePublicTopicAsync(TrackChangeEto eto, string subSystemCode) + { + _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{subSystemCode}", + Encoding.UTF8.GetBytes(eto.ToJson())); + } + /// /// 轨迹推送完成广播 /// diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs index 95f496ed..ec3289a3 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs @@ -5,6 +5,7 @@ using SJZY.Track.Application.Contract.Dtos.TrackOrder; using SJZY.Track.Application.Contract.Dtos.TrackPush; using SJZY.Track.Application.Contract.Events; using SJZY.Track.Application.Contract.Services.ProvideServices; +using SJZY.Track.Application.Helpers; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackPushAggregate; @@ -92,6 +93,28 @@ public class TrackPushService : ApplicationService, ITrackPushService throw new BusinessException(message: "没有需要推送的轨迹"); } + //存在比较字段,需要做过滤处理 + if (!string.IsNullOrWhiteSpace(input.CompareFields)) + { + //根据输入值来进行过滤,比如选取code1,批次1的轨迹,可能会有多条,下面使用创建时间最新的一条 + tracks = tracks.Where(x => + { + if (string.IsNullOrWhiteSpace(x.Extra)) + { + throw new BusinessException(message: $"当前轨迹不存在扩展信息,无法利用扩展字段:{input.CompareFields}"); + } + + var extraDict = GetExtraDictForTextJson(x.Extra); + if (extraDict == null || !extraDict.TryGetValue(input.CompareFields, out var compareValue)) + { + throw new BusinessException(message: $"请检查拓展字段,为什么找不到比较字段:{input.CompareFields}"); + } + + //补充轨迹内容 + return TextJsonHelper.EqJsonElementAndObject(compareValue, input.CompareValue); + }).ToList(); + } + //不同单可能会有不同的轨迹内容,先推送只推送最新的一条 foreach (var order in orders) { @@ -117,7 +140,7 @@ public class TrackPushService : ApplicationService, ITrackPushService TrackPlace = track.TrackPlace, TrackTime = track.TrackTime, TrackTimeZone = track.TrackTimeZone, - // todo: 这里也要改,重复code问题,到底推哪个 + CompareFields = input.CompareFields, Extra = track.Extra } }; @@ -186,4 +209,11 @@ public class TrackPushService : ApplicationService, ITrackPushService var res = ObjectMapper.Map, List>(records); return new UnifyResultDto>(true, res, "操作成功"); } + + private Dictionary? GetExtraDictForTextJson(string? extraStr) + { + return string.IsNullOrWhiteSpace(extraStr) + ? null + : System.Text.Json.JsonSerializer.Deserialize>(extraStr); + } } From e1e387e0d326aff07bf3324161b6d078372f747e Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Tue, 14 Jan 2025 17:35:03 +0800 Subject: [PATCH 66/80] =?UTF-8?q?update:=20=E8=BD=A8=E8=BF=B9=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E5=A4=84=E7=90=86=EF=BC=8C=E6=A0=B9=E6=8D=AEcode+?= =?UTF-8?q?=E6=AF=94=E8=BE=83=E5=AD=97=E6=AE=B5=E4=BD=9C=E4=B8=BA=E6=A0=87?= =?UTF-8?q?=E8=AF=86=EF=BC=8C=E7=A1=AE=E4=BF=9D=E4=BC=A0=E9=80=92=E7=9A=84?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E5=94=AF=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackPushEventHandler.cs | 102 ++++++++++++++---- .../Helpers/TextJsonHelper.cs | 49 +++++++++ .../ITrackPushRecordEsRepository.cs | 8 ++ .../TrackPushRecordEsRepository.cs | 18 ++++ 4 files changed, 157 insertions(+), 20 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 5aa98422..78c97f41 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -352,37 +352,99 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (config.IsAllPush) { var history = await _trackPushRecordEsRepository.GetLatestTrackPushRecordAsync(log.OrderId); + //找到历史中推送成功的轨迹 + var trackPushRecords = await _trackPushRecordEsRepository.GetHistorySuccessTrackPushRecordAsync(log.OrderId); + //构建标识符,code+比较字段的值(如果提供的比较字段,否则使用轨迹时间) + var pushIdentitySuccess = trackPushRecords.Select(x => + { + //寻找映射配置 + var code = _pushConfigs.First(y => y.TrackCode == x.TrackCode).TrackContentCodeValue; + if (string.IsNullOrWhiteSpace(compareFields)) + return code; + + //尝试从扩展中提取目标值 + var extraValue = TextJsonHelper.ExtractValue(x.Extra, compareFields); + return code + extraValue; + }).ToHashSet(); + if (history != default) { body = TextJsonHelper.Deserialize(history.PushContent); + //todo-test:在历史选出推送成功的历史轨迹 + body!.Data = body.Data.Where(x => + { + var code = ((JsonElement) x["code"]!).GetString(); + if (string.IsNullOrWhiteSpace(compareFields)) + return pushIdentitySuccess.Contains(code); + + var isMatch = ((JsonElement) x["extra"]!).TryGetProperty(compareFields, out var jsonElement); + var extraValue = isMatch ? TextJsonHelper.GetString(jsonElement) : null; + return pushIdentitySuccess.Contains(code + extraValue); + }).ToList(); + + //添加当前要推送的轨迹 + body.Data.Add(cur); - //在历史选出推送成功的历史轨迹 if (config.IsAllPushWithLatest) { - //同code同比较字段保证唯一 - var old = body!.Data - .Where(x => - { - //反序列化出的JsonElement和字典字符串类型做比较 - var a = ((JsonElement) x["code"]!).GetString(); - var b = cur["code"]!.ToString(); //tips: 需要要将object类型的字符串转为string类型,否则使用的是引用比较,反序列化出的string一定和本地string引用不同 - return a == b; - }).WhereIf(!compareFields.IsNullOrWhiteSpace(), x => - { - if (x["extra"] == null || log.Extra == null) return false; - return TextJsonHelper.EqByJsonElementField(x["extra"]!, TextJsonHelper.Deserialize(log.Extra), compareFields!); - }) - .FirstOrDefault(); - - if (old != null) + //历史轨迹中同一个code+比较字段联合作为key最新的一个 + var dict = new Dictionary(); + //todo-test:根据code和比较字段值分组,在每组里选出一个创建时间最新的 + foreach (var x in body.Data) { - body.Data.Remove(old); + var code = ((JsonElement) x["code"]!).GetString()!; + var dateStr = ((JsonElement) x["date"]!).GetString()!; + var key = string.Empty; + if (string.IsNullOrWhiteSpace(compareFields)) + key = code; + else + { + var isMatch = ((JsonElement) x["extra"]!).TryGetProperty(compareFields, out var jsonElement); + var extraValue = isMatch ? TextJsonHelper.GetString(jsonElement) : null; + key = code + extraValue; + } + + //只保留最新的一条数据 + if (dict.TryGetValue(key, out var tuple)) + { + //如果当前值创建时间大于历史值,则替换历史值 + if (DateTime.Parse(dateStr) > DateTime.Parse(tuple.dateStr)) + dict[key] = (dateStr, x); + } + else + dict[key] = (dateStr, x); } - //根据code和比较字段值分组,在每组里选出一个创建时间最新的 + + // //同code同比较字段保证唯一 + // var old = body!.Data + // .Where(x => + // { + // //反序列化出的JsonElement和字典字符串类型做比较 + // var a = ((JsonElement) x["code"]!).GetString(); + // var b = cur["code"]!.ToString(); //tips: 需要要将object类型的字符串转为string类型,否则使用的是引用比较,反序列化出的string一定和本地string引用不同 + // return a == b; + // }).WhereIf(!compareFields.IsNullOrWhiteSpace(), x => + // { + // if (x["extra"] == null || log.Extra == null) return false; + // return TextJsonHelper.EqByJsonElementField(x["extra"]!, TextJsonHelper.Deserialize(log.Extra), compareFields!); + // }) + // .FirstOrDefault(); + // + // if (old != null) + // { + // body.Data.Remove(old); + // } + + //选出每个组最新的轨迹 + body.Data = dict.Values.Select(x => x.dict).Cast>().ToList(); } - body!.Data.Add(cur); + // //添加当前要推送的轨迹 + // body.Data.Add(cur); } + + //todo-test:按推送映射顺序排序 + } log.PushContent = TextJsonHelper.Serialize(body)!; diff --git a/src/SJZY.Track.Application/Helpers/TextJsonHelper.cs b/src/SJZY.Track.Application/Helpers/TextJsonHelper.cs index 387a9032..e63b0360 100644 --- a/src/SJZY.Track.Application/Helpers/TextJsonHelper.cs +++ b/src/SJZY.Track.Application/Helpers/TextJsonHelper.cs @@ -1,3 +1,4 @@ +using System.Globalization; using System.Text.Json; namespace SJZY.Track.Application.Helpers; @@ -17,6 +18,54 @@ public static class TextJsonHelper return string.IsNullOrWhiteSpace(json) ? default : System.Text.Json.JsonSerializer.Deserialize(json); } + public static Dictionary? DeserializeDictionary(string? dictString) + { + return string.IsNullOrWhiteSpace(dictString) + ? null + : System.Text.Json.JsonSerializer.Deserialize>(dictString); + } + + /// + /// 获取JsonElement字符串表达的值 + /// + /// + /// + public static string? GetString(object? el) + { + if (el is not JsonElement jsonElement) + return default; + return jsonElement.ValueKind switch + { + JsonValueKind.Undefined or JsonValueKind.Null => default, + JsonValueKind.True or JsonValueKind.False => jsonElement.GetBoolean().ToString(), + JsonValueKind.Object or JsonValueKind.Array or JsonValueKind.Number => jsonElement.GetRawText(), + JsonValueKind.String => jsonElement.GetString(), + _ => default + }; + } + + /// + /// 提取字典字符串中某个字段的值 + /// + /// 字典json字符串 + /// + /// + public static object? ExtractValue(string? dictString, string fieldName) + { + if (string.IsNullOrWhiteSpace(dictString)) + { + return null; + } + + var dict = System.Text.Json.JsonSerializer.Deserialize>(dictString); + if (dict == null || !dict.TryGetValue(fieldName, out var value)) + { + return null; + } + + return value; + } + /// /// 两个jsonElement进行比较 /// diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordEsRepository.cs index ee5840f5..261599f3 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordEsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordEsRepository.cs @@ -24,4 +24,12 @@ public interface ITrackPushRecordEsRepository /// /// Task GetLatestTrackPushRecordAsync(int orderId); + + + /// + /// 获取历史中推送成功的记录 + /// + /// + /// + Task> GetHistorySuccessTrackPushRecordAsync(int orderId); } diff --git a/src/SJZY.Track.Repository/Repositories/TrackPushRecordEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackPushRecordEsRepository.cs index 5e448eaa..b606bc29 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackPushRecordEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackPushRecordEsRepository.cs @@ -71,4 +71,22 @@ public class TrackPushRecordEsRepository : ElasticSearchContextAbstract> GetHistorySuccessTrackPushRecordAsync(int orderId) + { + var data = await Context.SearchAsync(x => x + .Index(GlobalConst.TrackPushRecordIndex) + .Source(s => + s.Excludes(fs => + fs.Field(f => f.PushContent))) + .Query(q => q.Bool(b => + b.Must( + mu => mu.Term(t => t.IsSuccess, true), + mu => mu.Term(t => t.OrderId, orderId) + )) + ) + .Size(1000) + .Sort(s => s.Field(f => f.CreateTime, SortOrder.Descending))); + return data.ToIdList(); + } } From 19548b3fc2010a01c083ec03bb4314ec02ae51b3 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Tue, 14 Jan 2025 18:05:36 +0800 Subject: [PATCH 67/80] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E5=A4=8DJsonElement?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CAP/EventHandlers/TrackPushEventHandler.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 78c97f41..07f0380d 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -392,9 +392,14 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe //todo-test:根据code和比较字段值分组,在每组里选出一个创建时间最新的 foreach (var x in body.Data) { - var code = ((JsonElement) x["code"]!).GetString()!; - var dateStr = ((JsonElement) x["date"]!).GetString()!; + var code = string.Empty; + var dateStr = string.Empty; var key = string.Empty; + if (x["code"] is JsonElement codeEl) code = codeEl.GetString()!; + else code = x["code"]!.ToString(); + if (x["date"] is JsonElement dateEl) dateStr = dateEl.GetString()!; + else dateStr = x["date"]!.ToString(); + if (string.IsNullOrWhiteSpace(compareFields)) key = code; else @@ -444,7 +449,6 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } //todo-test:按推送映射顺序排序 - } log.PushContent = TextJsonHelper.Serialize(body)!; From 4473936577355a983c7d96bd402195dbbcb73716 Mon Sep 17 00:00:00 2001 From: xiaolipro <2357729423@qq.com> Date: Wed, 15 Jan 2025 10:35:30 +0800 Subject: [PATCH 68/80] review --- .../CAP/EventHandlers/TrackUpsertEventHandler.cs | 2 ++ .../Services/ProvideServices/TrackService.cs | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 79f29ff8..135bb0bd 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -144,6 +144,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe return false; } + // todo: 在这里,判断存在性 + return true; } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index db991a76..92ce9710 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -55,6 +55,7 @@ public partial class TrackService : ApplicationService, ITrackService [HttpPost("Track/Upsert")] public async Task UpsertTrackAsync(UpsertTrackInput input) { + // todo: 代码太长了 var order = await _orderRepository.GetFirstAsync(x => x.SubSystemId == input.SubSystemId && x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, x => new @@ -119,6 +120,7 @@ public partial class TrackService : ApplicationService, ITrackService .Where(x => x.TrackTime == input.TrackTime) .ToList(); + // todo:es落盘延迟是不确定的 //当为更新操作时发现更新的数目为0进行重试操作 if (!input.IsAdd && tracks.Count == 0) { @@ -133,6 +135,7 @@ public partial class TrackService : ApplicationService, ITrackService .ToList(); if (tracks.Count > 0) success = true; + // todo: 最大重试次数应该是可配置的,当出现的时候应该有告警,而不是直接给调用方,指数退避 2^N await Task.Delay(300); } finally From 0b6e20da3f742d3727a3c81fd2a8cb5dc68ddeb8 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Wed, 15 Jan 2025 11:11:55 +0800 Subject: [PATCH 69/80] =?UTF-8?q?=E8=BF=98=E5=8E=9F=E9=B9=8F=E5=86=9B?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackPushEventHandler.cs | 104 +++--------------- 1 file changed, 18 insertions(+), 86 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 07f0380d..03acbc70 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -352,103 +352,35 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (config.IsAllPush) { var history = await _trackPushRecordEsRepository.GetLatestTrackPushRecordAsync(log.OrderId); - //找到历史中推送成功的轨迹 - var trackPushRecords = await _trackPushRecordEsRepository.GetHistorySuccessTrackPushRecordAsync(log.OrderId); - //构建标识符,code+比较字段的值(如果提供的比较字段,否则使用轨迹时间) - var pushIdentitySuccess = trackPushRecords.Select(x => - { - //寻找映射配置 - var code = _pushConfigs.First(y => y.TrackCode == x.TrackCode).TrackContentCodeValue; - if (string.IsNullOrWhiteSpace(compareFields)) - return code; - - //尝试从扩展中提取目标值 - var extraValue = TextJsonHelper.ExtractValue(x.Extra, compareFields); - return code + extraValue; - }).ToHashSet(); - if (history != default) { body = TextJsonHelper.Deserialize(history.PushContent); - //todo-test:在历史选出推送成功的历史轨迹 - body!.Data = body.Data.Where(x => - { - var code = ((JsonElement) x["code"]!).GetString(); - if (string.IsNullOrWhiteSpace(compareFields)) - return pushIdentitySuccess.Contains(code); - - var isMatch = ((JsonElement) x["extra"]!).TryGetProperty(compareFields, out var jsonElement); - var extraValue = isMatch ? TextJsonHelper.GetString(jsonElement) : null; - return pushIdentitySuccess.Contains(code + extraValue); - }).ToList(); - - //添加当前要推送的轨迹 - body.Data.Add(cur); - if (config.IsAllPushWithLatest) { - //历史轨迹中同一个code+比较字段联合作为key最新的一个 - var dict = new Dictionary(); - //todo-test:根据code和比较字段值分组,在每组里选出一个创建时间最新的 - foreach (var x in body.Data) + //同code同比较字段保证唯一 + var old = body!.Data + .Where(x => + { + //反序列化出的JsonElement和字典字符串类型做比较 + var a = ((JsonElement) x["code"]!).GetString(); + var b = cur["code"]!.ToString(); //tips: 需要要将object类型的字符串转为string类型,否则使用的是引用比较,反序列化出的string一定和本地string引用不同 + return a == b; + }).WhereIf(!compareFields.IsNullOrWhiteSpace(), x => + { + if (x["extra"] == null || log.Extra == null) return false; + return TextJsonHelper.EqByJsonElementField(x["extra"]!, TextJsonHelper.Deserialize(log.Extra), compareFields!); + }) + .FirstOrDefault(); + + if (old != null) { - var code = string.Empty; - var dateStr = string.Empty; - var key = string.Empty; - if (x["code"] is JsonElement codeEl) code = codeEl.GetString()!; - else code = x["code"]!.ToString(); - if (x["date"] is JsonElement dateEl) dateStr = dateEl.GetString()!; - else dateStr = x["date"]!.ToString(); - - if (string.IsNullOrWhiteSpace(compareFields)) - key = code; - else - { - var isMatch = ((JsonElement) x["extra"]!).TryGetProperty(compareFields, out var jsonElement); - var extraValue = isMatch ? TextJsonHelper.GetString(jsonElement) : null; - key = code + extraValue; - } - - //只保留最新的一条数据 - if (dict.TryGetValue(key, out var tuple)) - { - //如果当前值创建时间大于历史值,则替换历史值 - if (DateTime.Parse(dateStr) > DateTime.Parse(tuple.dateStr)) - dict[key] = (dateStr, x); - } - else - dict[key] = (dateStr, x); + body.Data.Remove(old); } - // //同code同比较字段保证唯一 - // var old = body!.Data - // .Where(x => - // { - // //反序列化出的JsonElement和字典字符串类型做比较 - // var a = ((JsonElement) x["code"]!).GetString(); - // var b = cur["code"]!.ToString(); //tips: 需要要将object类型的字符串转为string类型,否则使用的是引用比较,反序列化出的string一定和本地string引用不同 - // return a == b; - // }).WhereIf(!compareFields.IsNullOrWhiteSpace(), x => - // { - // if (x["extra"] == null || log.Extra == null) return false; - // return TextJsonHelper.EqByJsonElementField(x["extra"]!, TextJsonHelper.Deserialize(log.Extra), compareFields!); - // }) - // .FirstOrDefault(); - // - // if (old != null) - // { - // body.Data.Remove(old); - // } - - //选出每个组最新的轨迹 - body.Data = dict.Values.Select(x => x.dict).Cast>().ToList(); } - // //添加当前要推送的轨迹 - // body.Data.Add(cur); + body!.Data.Add(cur); } - - //todo-test:按推送映射顺序排序 } log.PushContent = TextJsonHelper.Serialize(body)!; From 08f0ebeeaebf907a16679122a0c4518224ac01ba Mon Sep 17 00:00:00 2001 From: xiaolipro <2357729423@qq.com> Date: Wed, 15 Jan 2025 15:02:03 +0800 Subject: [PATCH 70/80] =?UTF-8?q?optimize&fix=EF=BC=9Aforce=20push=20event?= =?UTF-8?q?=20case?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackPushEventHandler.cs | 291 +++++++++--------- 1 file changed, 153 insertions(+), 138 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 03acbc70..09d58a78 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -96,130 +96,21 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe private async Task DoPushAsync(TrackPushEvent @event) { var items = new List(); - TrackPushContentConfigDto? config; - var isSystemPush = @event.OperationMan == null; - if (isSystemPush && !@event.ForcedPush) + if (@event.OperationMan == null) { - config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); - foreach (var order in _orders) + if (@event.OptionType == OptionType.新增) { - if (config == null) - { - TrackPushFailedPublicTopic($"没有在推送映射配置中找到关于轨迹代码[{@event.TrackCode}]的配置", @event, order); - return; - } - - // 系统不推异常单,只能人工操作 - if (order.QuestionType == (int) TrackProblemType.Error) - { - TrackPushFailedPublicTopic("系统不推异常单,只能人工操作", @event, order); - continue; - } - - // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行,为了约束顺序 - var (resultConfig, nextCode) = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); - if (resultConfig == null) - { - TrackPushFailedPublicTopic($"推送顺序异常,下一个要推送的应为[{nextCode}]", @event, order); - continue; - } - - config = resultConfig; - - // 是否自动推送 - if (!config.IsAutoPush) - { - TrackPushFailedPublicTopic($"没有设置为自动推送,如果要推送请手动推送", @event, order); - continue; - } - - // 配置的类型如何和订单类型不一致则不允许推送 - if (config.OrderType != order.OrderType) - { - TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event, order); - continue; - } - - var log = new TrackPushRecordIndex - { - OptionType = @event.OptionType.ToString(), - OrderId = order.Id, - OrderNo = order.OrderNo, - TrackStatus = @event.SystemPushInfo.TrackStatus, - TrackCode = @event.TrackCode, - TrackContent = @event.SystemPushInfo.TrackContent, - TrackPlace = @event.SystemPushInfo.TrackPlace, - TrackTime = @event.SystemPushInfo.TrackTime, - TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, - CreateUser = GlobalConst.SystemUser, - SubSystemCode = @event.SubSystemCode, - IsToMq = @event.IsToMq, - Extra = @event.SystemPushInfo.Extra - }; - var item = await BuiltPushItem(config, log, @event.SystemPushInfo.CompareFields); - item.Log = JsonConvert.SerializeObject(log); - items.Add(item); + await BuiltSystemPushItemsAsync(@event, items); + } + else if (@event.OptionType == OptionType.修改) + { + await BuiltManualPushItemsAsync(@event, items); } } - // 手工或强制推送,不会校验已推和顺序问题,因为可能是更新 else - { - config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); - foreach (var order in _orders) - { - if (config == null) - { - TrackPushFailedPublicTopic($"没有在推送映射配置中找到关于轨迹代码[{@event.TrackCode}]的配置", @event, order); - return; - } - - if (config is { IsAllPush: true }) - { - // 非强制推送需要 推断 本次推送 是否可行 - if (!@event.ForcedPush) - { - var (resultConfig, nextCode) = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); - if (resultConfig == null) - { - TrackPushFailedPublicTopic($"推送顺序异常,下一个要推送的应为[{nextCode}]", @event, order); - continue; - } - - config = resultConfig; - } - - // tips:强制推送直接使用配置 - } - - - //配置的类型如何和订单类型不一致则不允许推送 - if (config.OrderType != order.OrderType) - { - TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event, order); - continue; - } - - var log = new TrackPushRecordIndex - { - OptionType = @event.OptionType.ToString(), - OrderId = order.Id, - OrderNo = order.OrderNo, - TrackStatus = @event.SystemPushInfo.TrackStatus, - TrackCode = @event.TrackCode, - TrackContent = @event.SystemPushInfo.TrackContent, - TrackPlace = @event.SystemPushInfo.TrackPlace, - TrackTime = @event.SystemPushInfo.TrackTime, - TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, - CreateUser = @event.OperationMan, - SubSystemCode = @event.SubSystemCode, - IsToMq = @event.IsToMq, - Extra = @event.SystemPushInfo.Extra - }; - var item = await BuiltPushItem(config, log, @event.SystemPushInfo.CompareFields); - item.Log = JsonConvert.SerializeObject(log); - items.Add(item); - } + // 手工推送,不会校验已推和顺序问题,因为可能是更新 + await BuiltManualPushItemsAsync(@event, items); } if (items.Count == 0) return; @@ -236,12 +127,129 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (r.Code != GlobalConst.SuccessCode) { - TrackPushFailedPublicTopic($"轨迹中台调用接口通失败,RequestId: {r.RequestId}; Msg: {r.Msg}", @event, r.RequestId, items.Cast().ToList()); - throw new BusinessException(message: $"requestId: {r.RequestId}; serviceProviderCode:{serviceProviderCode} Msg: {r.Msg}"); + TrackPushFailedPublicTopic($"轨迹中台调用接口通失败,RequestId: {r.RequestId}; Msg: {r.Msg}", @event, r.RequestId, + items.Cast().ToList()); + throw new BusinessException( + message: $"requestId: {r.RequestId}; serviceProviderCode:{serviceProviderCode} Msg: {r.Msg}"); } } } + private async Task BuiltManualPushItemsAsync(TrackPushEvent @event, List items) + { + // tips: 手工强制推送直接使用配置 + var config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); + foreach (var order in _orders) + { + if (config is { IsAllPush: true }) + { + // 非强制推送需要 推断 本次推送 是否可行 + if (!@event.ForcedPush) + { + config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event); + } + } + + if (config == null) + { + TrackPushFailedPublicTopic("推送顺序异常,找不到有效推送配置", @event, order); + return; + } + + + //配置的类型如何和订单类型不一致则不允许推送 + if (config.OrderType != order.OrderType) + { + TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event, + order); + continue; + } + + var log = new TrackPushRecordIndex + { + OptionType = @event.OptionType.ToString(), + OrderId = order.Id, + OrderNo = order.OrderNo, + TrackStatus = @event.SystemPushInfo.TrackStatus, + TrackCode = @event.TrackCode, + TrackContent = @event.SystemPushInfo.TrackContent, + TrackPlace = @event.SystemPushInfo.TrackPlace, + TrackTime = @event.SystemPushInfo.TrackTime, + TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, + CreateUser = @event.OperationMan, + SubSystemCode = @event.SubSystemCode, + IsToMq = @event.IsToMq, + Extra = @event.SystemPushInfo.Extra + }; + var item = await BuiltPushItem(config, log, @event.SystemPushInfo.CompareFields); + item.Log = JsonConvert.SerializeObject(log); + items.Add(item); + } + } + + private async Task BuiltSystemPushItemsAsync(TrackPushEvent @event, List items) + { + var config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); + foreach (var order in _orders) + { + if (config == null) + { + TrackPushFailedPublicTopic($"没有在推送映射配置中找到关于轨迹代码[{@event.TrackCode}]的配置", @event, order); + return; + } + + // 系统不推异常单,只能人工操作 + if (order.QuestionType == (int) TrackProblemType.Error) + { + TrackPushFailedPublicTopic("系统不推异常单,只能人工操作", @event, order); + continue; + } + + // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行,为了约束顺序 + config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event); + if (config == null) + { + TrackPushFailedPublicTopic("推送顺序异常,找不到有效推送配置", @event, order); + continue; + } + + // 是否自动推送 + if (!config.IsAutoPush) + { + TrackPushFailedPublicTopic("没有设置为自动推送,如果要推送请手动推送", @event, order); + continue; + } + + // 配置的类型如何和订单类型不一致则不允许推送 + if (config.OrderType != order.OrderType) + { + TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event, + order); + continue; + } + + var log = new TrackPushRecordIndex + { + OptionType = @event.OptionType.ToString(), + OrderId = order.Id, + OrderNo = order.OrderNo, + TrackStatus = @event.SystemPushInfo.TrackStatus, + TrackCode = @event.TrackCode, + TrackContent = @event.SystemPushInfo.TrackContent, + TrackPlace = @event.SystemPushInfo.TrackPlace, + TrackTime = @event.SystemPushInfo.TrackTime, + TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, + CreateUser = GlobalConst.SystemUser, + SubSystemCode = @event.SubSystemCode, + IsToMq = @event.IsToMq, + Extra = @event.SystemPushInfo.Extra + }; + var item = await BuiltPushItem(config, log, @event.SystemPushInfo.CompareFields); + item.Log = JsonConvert.SerializeObject(log); + items.Add(item); + } + } + private async Task DoUpdateAsync(TrackPushEvent @event) { var config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); @@ -253,7 +261,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe //配置的类型如何和订单类型不一致则不允许推送 if (config.OrderType != order.OrderType) { - TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event, order); + TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event, + order); continue; } @@ -292,8 +301,10 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (r.Code != GlobalConst.SuccessCode) { - TrackPushFailedPublicTopic($"轨迹中台调用接口通失败,RequestId: {r.RequestId}; Msg: {r.Msg}", @event, r.RequestId, items.Cast().ToList()); - throw new BusinessException(message: $"requestId: {r.RequestId}; serviceProviderCode:{serviceProviderCode} Msg: {r.Msg}"); + TrackPushFailedPublicTopic($"轨迹中台调用接口通失败,RequestId: {r.RequestId}; Msg: {r.Msg}", @event, r.RequestId, + items.Cast().ToList()); + throw new BusinessException( + message: $"requestId: {r.RequestId}; serviceProviderCode:{serviceProviderCode} Msg: {r.Msg}"); } } } @@ -363,12 +374,15 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { //反序列化出的JsonElement和字典字符串类型做比较 var a = ((JsonElement) x["code"]!).GetString(); - var b = cur["code"]!.ToString(); //tips: 需要要将object类型的字符串转为string类型,否则使用的是引用比较,反序列化出的string一定和本地string引用不同 + var b = cur["code"]! + .ToString(); //tips: 需要要将object类型的字符串转为string类型,否则使用的是引用比较,反序列化出的string一定和本地string引用不同 return a == b; - }).WhereIf(!compareFields.IsNullOrWhiteSpace(), x => + }) + .WhereIf(!compareFields.IsNullOrWhiteSpace(), x => { if (x["extra"] == null || log.Extra == null) return false; - return TextJsonHelper.EqByJsonElementField(x["extra"]!, TextJsonHelper.Deserialize(log.Extra), compareFields!); + return TextJsonHelper.EqByJsonElementField(x["extra"]!, + TextJsonHelper.Deserialize(log.Extra), compareFields!); }) .FirstOrDefault(); @@ -376,8 +390,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { body.Data.Remove(old); } - } + // //添加当前要推送的轨迹 body!.Data.Add(cur); } @@ -392,24 +406,28 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe /// 根据轨迹代码推断下一个(升序)要推送的内容,如果找不到或者已经是最后一个了 /// 则查询有没有可交换的推送,没有就返回null /// - private static (TrackPushContentConfigDto? config, string nextCode) GetValidPushConfigAsync(List cache, - string? latestPushTrackCode, string? trackCode) + private static TrackPushContentConfigDto? GetValidPushConfigAsync(List cache, + string? latestPushTrackCode, TrackPushEvent @event) { + var trackCode = @event.TrackCode; var idx = cache.FindIndex(x => x.TrackCode == latestPushTrackCode); + if (@event.ForcedPush && trackCode == latestPushTrackCode) + { + //强制推送,允许重复推送当前轨迹 + return cache[idx]; + } + if (idx + 1 >= cache.Count) return default; // 推完了 // find next var matched = cache[idx + 1].TrackCode == trackCode ? cache[idx + 1] - : // find swap - cache.FirstOrDefault(x => x.TrackCode == cache[idx + 1].SwapTrackCode); + : cache.FirstOrDefault(x => x.TrackCode == cache[idx + 1].SwapTrackCode); //没推完,可能不符合推送顺序 - return matched != null && matched.TrackCode == trackCode - ? (matched, matched.TrackCode) - : (default, matched?.TrackCode ?? cache[idx + 1].TrackCode); + return matched != null && matched.TrackCode == trackCode ? matched : default; } /// @@ -433,10 +451,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } //轨迹推送失败(被拦截) - private void TrackPushFailedPublicTopic( - string failedMessage, - TrackPushEvent @event, - OrderEntity order) + private void TrackPushFailedPublicTopic(string failedMessage, TrackPushEvent @event, OrderEntity order) { _broadcastingService.TrackPushFailedPubilcTopic(new TrackPushRecordDto { From 82bbca3002e0685b437b28742ec029c169ac7476 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Wed, 15 Jan 2025 17:41:06 +0800 Subject: [PATCH 71/80] =?UTF-8?q?update:=E8=B0=83=E6=95=B4=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=8E=A8=E9=80=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackPushEventHandler.cs | 98 +++++++++++++------ .../Services/ProvideServices/TrackService.cs | 9 ++ .../IOrderOperationRecordEsRepository.cs | 8 ++ .../ITrackPushRecordEsRepository.cs | 12 ++- .../OrderOperationRecordEsRepository.cs | 14 ++- .../TrackPushRecordEsRepository.cs | 27 ++++- 6 files changed, 132 insertions(+), 36 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 09d58a78..a7cc3d36 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -1,3 +1,4 @@ +using System.Collections.Immutable; using System.Text.Json; using DotNetCore.CAP; using Microsoft.Extensions.Options; @@ -11,6 +12,7 @@ using SJZY.Track.Application.Helpers; using SJZY.Track.Application.Options; using SJZY.Track.Application.Track2InterfaceRelay; using SJZY.Track.Domain.Aggregates.OrderAggregate; +using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Enums; using Volo.Abp.DependencyInjection; @@ -25,6 +27,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe private readonly IOrderRepository _orderRepository; private readonly ITrackPushCacheService _trackPushCacheService; private readonly ITrackPushRecordEsRepository _trackPushRecordEsRepository; + private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; private readonly IBroadcastingService _broadcastingService; private List _orders = null!; private List _pushConfigs = null!; @@ -34,7 +37,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe ITrackPushCacheService trackPushCacheService, ITrackPushRecordEsRepository trackPushRecordEsRepository, IOptionsMonitor options, - IBroadcastingService broadcastingService) + IBroadcastingService broadcastingService, + ITrackDetailsEsRepository trackDetailsEsRepository) { _httpClientProxy = httpClientProxy; _orderRepository = orderRepository; @@ -42,6 +46,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe _trackPushRecordEsRepository = trackPushRecordEsRepository; _options = options; _broadcastingService = broadcastingService; + _trackDetailsEsRepository = trackDetailsEsRepository; } [CapSubscribe(GlobalConst.TrackPushSubscribe, Group = GlobalConst.TrackPushSubscribe)] @@ -206,11 +211,15 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行,为了约束顺序 - config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event); - if (config == null) + // 如果当前推送code与订单上的最后的code不一致,则考虑推送映射顺序 + if (!string.Equals(order.LatestPushTrackCode, @event.TrackCode)) { - TrackPushFailedPublicTopic("推送顺序异常,找不到有效推送配置", @event, order); - continue; + config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event); + if (config == null) + { + TrackPushFailedPublicTopic("推送顺序异常,找不到有效推送配置", @event, order); + continue; + } } // 是否自动推送 @@ -362,38 +371,67 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (config.IsAllPush) { - var history = await _trackPushRecordEsRepository.GetLatestTrackPushRecordAsync(log.OrderId); + var history = await _trackPushRecordEsRepository.GetLatestTrackPushRecordAsync(log.OrderId, true); if (history != default) { body = TextJsonHelper.Deserialize(history.PushContent); - if (config.IsAllPushWithLatest) - { - //同code同比较字段保证唯一 - var old = body!.Data - .Where(x => - { - //反序列化出的JsonElement和字典字符串类型做比较 - var a = ((JsonElement) x["code"]!).GetString(); - var b = cur["code"]! - .ToString(); //tips: 需要要将object类型的字符串转为string类型,否则使用的是引用比较,反序列化出的string一定和本地string引用不同 - return a == b; - }) - .WhereIf(!compareFields.IsNullOrWhiteSpace(), x => - { - if (x["extra"] == null || log.Extra == null) return false; - return TextJsonHelper.EqByJsonElementField(x["extra"]!, - TextJsonHelper.Deserialize(log.Extra), compareFields!); - }) - .FirstOrDefault(); - if (old != null) + //在推送历史中,选出当前轨迹明细一致的轨迹 + var tracks = await _trackDetailsEsRepository.GetListAsync(log.OrderId); + //确定轨迹标识符 + var trackIdentifies = tracks.Select(x => { - body.Data.Remove(old); + //寻找映射配置(转换后的code) + var code = _pushConfigs.First(y => y.TrackCode == x.TrackCode).TrackContentCodeValue; + var timeStr = DateTimeFormat(x.TrackTime, config.TrackTimeZone ?? log.TrackTimeZone, config); + return string.IsNullOrWhiteSpace(compareFields) + ? $"{code}{timeStr}" + : $"{code}{TextJsonHelper.ExtractValue(x.Extra, compareFields)}"; } - } + ).ToImmutableHashSet(); + //在历史中选取在订单当前轨迹明细中的记录 + body!.Data = body.Data.Where(x => + { + var code = ((JsonElement) x["code"]!).GetString(); + var timeStr = ((JsonElement) x["date"]!).GetString(); - // //添加当前要推送的轨迹 - body!.Data.Add(cur); + if (string.IsNullOrWhiteSpace(compareFields)) + return trackIdentifies.Contains($"{code}{timeStr}"); + + if (((JsonElement) x["extra"]!).TryGetProperty(compareFields, out var comparerValueJsonElement)) + return trackIdentifies.Contains($"{code}{TextJsonHelper.GetString(comparerValueJsonElement)}"); + + return trackIdentifies.Contains($"{code}{null}"); + }).ToList(); + + // if (config.IsAllPushWithLatest) + // { + // //同code同比较字段保证唯一 + // var old = body!.Data + // .Where(x => + // { + // //反序列化出的JsonElement和字典字符串类型做比较 + // var a = ((JsonElement) x["code"]!).GetString(); + // var b = cur["code"]! + // .ToString(); //tips: 需要要将object类型的字符串转为string类型,否则使用的是引用比较,反序列化出的string一定和本地string引用不同 + // return a == b; + // }) + // .WhereIf(!compareFields.IsNullOrWhiteSpace(), x => + // { + // if (x["extra"] == null || log.Extra == null) return false; + // return TextJsonHelper.EqByJsonElementField(x["extra"]!, + // TextJsonHelper.Deserialize(log.Extra), compareFields!); + // }) + // .FirstOrDefault(); + // + // if (old != null) + // { + // body.Data.Remove(old); + // } + // } + + // 添加当前要推送的轨迹 + body.Data.Add(cur); } } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 92ce9710..7e8206f8 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Http; using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Events; using SJZY.Track.Application.Contract.Services.ProvideServices; +using SJZY.Track.Application.Helpers; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackContentAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; @@ -120,6 +121,14 @@ public partial class TrackService : ApplicationService, ITrackService .Where(x => x.TrackTime == input.TrackTime) .ToList(); + //根据比较字段选出所需的轨迹 + if (!string.IsNullOrWhiteSpace(input.CompareFields)) + { + var a = input.TrackCode + TextJsonHelper.ExtractValue(input.Extra, input.CompareFields); + tracks = tracks.Where(x => string.Equals(a, + x.TrackCode + TextJsonHelper.ExtractValue(x.Extra, input.CompareFields!))).ToList(); + } + // todo:es落盘延迟是不确定的 //当为更新操作时发现更新的数目为0进行重试操作 if (!input.IsAdd && tracks.Count == 0) diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderOperationRecordEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderOperationRecordEsRepository.cs index eb97ddae..18485b5a 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderOperationRecordEsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderOperationRecordEsRepository.cs @@ -16,6 +16,14 @@ public interface IOrderOperationRecordEsRepository /// Task AddManyAsync(List indexes); + /// + /// 根据id删除订单操作记录 + /// + /// + /// + /// + Task DeleteOperationRecordByIdAsync(string id, string indexName); + /// /// 获取订单操作记录 /// diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordEsRepository.cs index 261599f3..de1f0fa3 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordEsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordEsRepository.cs @@ -11,6 +11,14 @@ public interface ITrackPushRecordEsRepository Task AddManyAsync(List index); + /// + /// 根据id删除轨迹推送记录 + /// + /// + /// + /// + Task DeletePushRecordByIdAsync(string id, string indexName); + /// /// 获取轨迹推送记录 /// @@ -22,9 +30,9 @@ public interface ITrackPushRecordEsRepository /// 获取最新轨迹推送记录 /// /// + /// 只选择成功的记录 /// - Task GetLatestTrackPushRecordAsync(int orderId); - + Task GetLatestTrackPushRecordAsync(int orderId, bool isSuccess = false); /// /// 获取历史中推送成功的记录 diff --git a/src/SJZY.Track.Repository/Repositories/OrderOperationRecordEsRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderOperationRecordEsRepository.cs index 0c30c860..7230d375 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderOperationRecordEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderOperationRecordEsRepository.cs @@ -47,6 +47,18 @@ public class OrderOperationRecordEsRepository : ElasticSearchContextAbstract(id, u => u + .Index(indexName) + ); + + if (!r.IsValid) + { + throw new InvalidOperationException($"轨迹操作记录失败,id:{indexName},原因:{r.DebugInformation}。"); + } + } + public async Task> GetOrderOperationsByIdAsync(int orderId) { var data = await Context.SearchAsync(x => x @@ -57,6 +69,6 @@ public class OrderOperationRecordEsRepository : ElasticSearchContextAbstract s.Field(f => f.CreateTime, SortOrder.Descending))); - return data.Documents.ToList(); + return data.ToIdList(); } } diff --git a/src/SJZY.Track.Repository/Repositories/TrackPushRecordEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackPushRecordEsRepository.cs index b606bc29..3cbef97d 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackPushRecordEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackPushRecordEsRepository.cs @@ -45,6 +45,18 @@ public class TrackPushRecordEsRepository : ElasticSearchContextAbstract(id, u => u + .Index(indexName) + ); + + if (!r.IsValid) + { + throw new InvalidOperationException($"轨迹推送记录失败,id:{indexName},原因:{r.DebugInformation}。"); + } + } + public async Task> GetTrackPushRecordsAsync(int orderId) { @@ -56,15 +68,24 @@ public class TrackPushRecordEsRepository : ElasticSearchContextAbstract s.Field(f => f.CreateTime, SortOrder.Descending))); - return data.Documents.ToList(); + return data.ToIdList(); } - public async Task GetLatestTrackPushRecordAsync(int orderId) + public async Task GetLatestTrackPushRecordAsync(int orderId, bool isSuccess = false) { + var musts = new List, QueryContainer>> + { + mu => mu.Term(t => t.OrderId, orderId), + }; + + if (isSuccess) + musts.Add(mu => mu.Term(t => t.IsSuccess, true)); + var data = await Context.SearchAsync(x => x .Index(GlobalConst.TrackPushRecordIndex) .Query(q => - q.Term(t => t.OrderId, orderId) + q.Bool(b => + b.Must(musts)) ) .Size(1000) .Sort(s => s.Field(f => f.CreateTime, SortOrder.Descending))); From 3ca803fe5b5009a3ec1e087ba548f13f7c76777a Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Wed, 15 Jan 2025 17:41:58 +0800 Subject: [PATCH 72/80] =?UTF-8?q?update:=E4=BF=9D=E7=95=99=E5=8F=AA?= =?UTF-8?q?=E6=8E=A8=E6=9C=80=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackPushEventHandler.cs | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index a7cc3d36..fc9c5e03 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -404,31 +404,32 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe return trackIdentifies.Contains($"{code}{null}"); }).ToList(); - // if (config.IsAllPushWithLatest) - // { - // //同code同比较字段保证唯一 - // var old = body!.Data - // .Where(x => - // { - // //反序列化出的JsonElement和字典字符串类型做比较 - // var a = ((JsonElement) x["code"]!).GetString(); - // var b = cur["code"]! - // .ToString(); //tips: 需要要将object类型的字符串转为string类型,否则使用的是引用比较,反序列化出的string一定和本地string引用不同 - // return a == b; - // }) - // .WhereIf(!compareFields.IsNullOrWhiteSpace(), x => - // { - // if (x["extra"] == null || log.Extra == null) return false; - // return TextJsonHelper.EqByJsonElementField(x["extra"]!, - // TextJsonHelper.Deserialize(log.Extra), compareFields!); - // }) - // .FirstOrDefault(); - // - // if (old != null) - // { - // body.Data.Remove(old); - // } - // } + + if (config.IsAllPushWithLatest) + { + //同code同比较字段保证唯一 + var old = body!.Data + .Where(x => + { + //反序列化出的JsonElement和字典字符串类型做比较 + var a = ((JsonElement) x["code"]!).GetString(); + var b = cur["code"]! + .ToString(); //tips: 需要要将object类型的字符串转为string类型,否则使用的是引用比较,反序列化出的string一定和本地string引用不同 + return a == b; + }) + .WhereIf(!compareFields.IsNullOrWhiteSpace(), x => + { + if (x["extra"] == null || log.Extra == null) return false; + return TextJsonHelper.EqByJsonElementField(x["extra"]!, + TextJsonHelper.Deserialize(log.Extra), compareFields!); + }) + .FirstOrDefault(); + + if (old != null) + { + body.Data.Remove(old); + } + } // 添加当前要推送的轨迹 body.Data.Add(cur); From e0be935489da76c5b9ad57d8fb614399d6d8544c Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 16 Jan 2025 11:51:26 +0800 Subject: [PATCH 73/80] =?UTF-8?q?update:=E6=96=B0=E5=A2=9E/=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E8=BD=A8=E8=BF=B9=E5=BB=B6=E6=97=B6=E5=8F=91=E9=80=81?= =?UTF-8?q?=E5=8F=98=E6=9B=B4=E5=B9=BF=E6=92=AD=EF=BC=8C=E7=9B=AE=E7=9A=84?= =?UTF-8?q?=E4=B8=BA=E4=BA=86=E7=AD=89=E5=BE=85es=E5=AE=9E=E9=99=85?= =?UTF-8?q?=E5=86=99=E7=9B=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/IBroadcastingService.cs | 6 ++--- .../EventHandlers/TrackDeleteEventHandler.cs | 4 +-- .../EventHandlers/TrackPushEventHandler.cs | 2 +- .../EventHandlers/TrackUpsertEventHandler.cs | 25 +++++++++++-------- .../Helpers/TextJsonHelper.cs | 6 ++--- .../Broadcasting/BroadcastingService.cs | 6 ++--- 6 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs index a3d1091e..782126bb 100644 --- a/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs +++ b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs @@ -12,7 +12,7 @@ public interface IBroadcastingService : ITransientDependency /// /// /// - void TrackChangePublicTopicAsync(TrackUpsertEvent eto, string subSystemCode, string trackStatusCode); + void TrackChangePublicTopic(TrackUpsertEvent eto, string subSystemCode, string trackStatusCode); /// /// 轨迹变更广播(删除) @@ -20,7 +20,7 @@ public interface IBroadcastingService : ITransientDependency /// /// /// - void TrackChangePublicTopicAsync(TrackDeleteEvent eto, OrderIdentifier[] orderIdentifiers, string trackCode, string trackStatusCode, string subSystemCode); + void TrackChangePublicTopic(TrackDeleteEvent eto, OrderIdentifier[] orderIdentifiers, string trackCode, string trackStatusCode, string subSystemCode); /// /// 轨迹变更广播(删除) @@ -28,7 +28,7 @@ public interface IBroadcastingService : ITransientDependency /// /// /// - void TrackChangePublicTopicAsync(TrackChangeEto eto, string subSystemCode); + void TrackChangePublicTopic(TrackChangeEto eto, string subSystemCode); /// /// 轨迹推送完成广播(推送完成回调) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index 1265a4d9..d3bda67b 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -147,7 +147,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe var item = dataItem.First(); var content = contentList.First(m => m.TrackContentCode == item.TrackCode); - // _broadcastingService.TrackChangePublicTopicAsync(track, + // _broadcastingService.TrackChangePublicTopic(track, // dataItem.Select(m => new OrderIdentifier // { // OrderId = m.OrderId, @@ -162,7 +162,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe //将每个订单的每个轨迹的删除变更发布 foreach (var track in dataItem) { - _broadcastingService.TrackChangePublicTopicAsync(new TrackChangeEto + _broadcastingService.TrackChangePublicTopic(new TrackChangeEto { EstimatedDeliveryDate = track.EstimatedDeliveryDate, TrackPlacePostcode = track.TrackPlacePostcode, diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index fc9c5e03..cd792aa6 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -408,7 +408,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (config.IsAllPushWithLatest) { //同code同比较字段保证唯一 - var old = body!.Data + var old = body.Data .Where(x => { //反序列化出的JsonElement和字典字符串类型做比较 diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 135bb0bd..1cd62f13 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -56,7 +56,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe // 处理广播事件 if (content != null && (content.IsToMq || @event.IsToMq)) - _broadcastingService.TrackChangePublicTopicAsync(@event, content.SubSystemCode, content.TrackStatusCode); + _ = EnsureWriteAfterPublicTopicAsync(@event, content.SubSystemCode, content.TrackStatusCode); if (canNextOrderIds.Count == 0) return; // 根据订单关联关系异步向下刷(异步) @@ -277,7 +277,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe else { Debug.Assert(@event.CompareFields != null, "@event.CompareFields != null"); - var extraDict = GetExtraDictForTextJson(@event.Extra); + var extraDict = TextJsonHelper.DeserializeDictionary(@event.Extra); if (extraDict == null || !extraDict.TryGetValue(@event.CompareFields, out var compareValue)) { throw new BusinessException(message: $"请检查拓展字段,为什么找不到比较字段:{@event.CompareFields}"); @@ -285,7 +285,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe existTracks = existTracks.Where(x => { - var oldExtraDict = GetExtraDictForTextJson(x.Extra); + var oldExtraDict = TextJsonHelper.DeserializeDictionary(x.Extra); // tips:注意兼容性,历史轨迹的字段可能为空 if (oldExtraDict == null || !oldExtraDict.TryGetValue(@event.CompareFields, out var oldValue)) { @@ -432,13 +432,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe return track; } - private Dictionary? GetExtraDictForTextJson(string? extraStr) - { - return string.IsNullOrWhiteSpace(extraStr) - ? null - : System.Text.Json.JsonSerializer.Deserialize>(extraStr); - } - private OrderOperationRecordIndex BuildOrderOperationRecord(TrackUpsertEvent @event, TrackDetailsIndex track, OrderIdentifier order) { return new OrderOperationRecordIndex @@ -452,4 +445,16 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe CreateTime = DateTime.Now }; } + + private async Task EnsureWriteAfterPublicTopicAsync(TrackUpsertEvent @event, string subSystemCode, string statusCode) + { + //理想情况在写入之后1s会刷盘 https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-refresh.html + //增加一个版本号来确定是否真的变更了 + //没有刷盘成功事件回调 + //方案1:!!【轮询等待静默刷盘】查出版本号确实发生了变更在发送广播 + //方案2:考虑强制刷盘(对es压力大)后发送 + //方案3:采用一个较大延时,不查询直接发 + await Task.Delay(1000); + _broadcastingService.TrackChangePublicTopic(@event, subSystemCode, statusCode); + } } diff --git a/src/SJZY.Track.Application/Helpers/TextJsonHelper.cs b/src/SJZY.Track.Application/Helpers/TextJsonHelper.cs index e63b0360..b7c833cf 100644 --- a/src/SJZY.Track.Application/Helpers/TextJsonHelper.cs +++ b/src/SJZY.Track.Application/Helpers/TextJsonHelper.cs @@ -18,11 +18,11 @@ public static class TextJsonHelper return string.IsNullOrWhiteSpace(json) ? default : System.Text.Json.JsonSerializer.Deserialize(json); } - public static Dictionary? DeserializeDictionary(string? dictString) + public static Dictionary? DeserializeDictionary(string? dictJsonString) { - return string.IsNullOrWhiteSpace(dictString) + return string.IsNullOrWhiteSpace(dictJsonString) ? null - : System.Text.Json.JsonSerializer.Deserialize>(dictString); + : System.Text.Json.JsonSerializer.Deserialize>(dictJsonString); } /// diff --git a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs index 4add29c6..7322f296 100644 --- a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs +++ b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs @@ -26,7 +26,7 @@ public class BroadcastingService : IBroadcastingService /// 子系统代码 /// 轨迹状态代码 /// - public void TrackChangePublicTopicAsync(TrackUpsertEvent eto, string subSystemCode, string trackStatusCode) + public void TrackChangePublicTopic(TrackUpsertEvent eto, string subSystemCode, string trackStatusCode) { var data = new TrackChangeEto { @@ -65,7 +65,7 @@ public class BroadcastingService : IBroadcastingService Encoding.UTF8.GetBytes(data.ToJson())); } - public void TrackChangePublicTopicAsync(TrackDeleteEvent eto, OrderIdentifier[] orderIdentifiers, string trackCode, string trackStatusCode, string subSystemCode) + public void TrackChangePublicTopic(TrackDeleteEvent eto, OrderIdentifier[] orderIdentifiers, string trackCode, string trackStatusCode, string subSystemCode) { var data = new TrackChangeEto { @@ -81,7 +81,7 @@ public class BroadcastingService : IBroadcastingService Encoding.UTF8.GetBytes(data.ToJson())); } - public void TrackChangePublicTopicAsync(TrackChangeEto eto, string subSystemCode) + public void TrackChangePublicTopic(TrackChangeEto eto, string subSystemCode) { _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{subSystemCode}", Encoding.UTF8.GetBytes(eto.ToJson())); From 40c663634e25302e07979ec31f0c4aba19ef4cbb Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 16 Jan 2025 11:55:46 +0800 Subject: [PATCH 74/80] =?UTF-8?q?perf:=E4=BC=98=E5=8C=96=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A2=9E=E5=8A=A0=E5=B9=BF=E6=92=AD=E5=BB=B6?= =?UTF-8?q?=E6=97=B6=E5=8F=91=E9=80=81=EF=BC=8C=E5=B9=B6=E4=B8=94=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E4=B8=BA=E4=B8=8D=E9=98=BB=E5=A1=9E=E4=B8=BB=E6=B5=81?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackDeleteEventHandler.cs | 213 ++++++------------ 1 file changed, 75 insertions(+), 138 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index d3bda67b..41956e2d 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -47,7 +47,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe //当轨迹删除,根据轨迹标记/状态上IsToMq选择进行广播 if (trackList.Count != 0) - await PublicTrackTopicAsync(@event, trackList); + _ = PublicTrackTopicAsync(@event, trackList); // 根据订单关联关系异步向下刷(异步) await DownByOrderLink(@event); @@ -121,89 +121,6 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe return true; } - private async Task PublicTrackTopicAsync(TrackDeleteEvent @event, List trackList) - { - var systemIds = trackList.Select(x => x.SubSystemId).Distinct().ToArray(); - var trackCodes = trackList.Select(x => x.TrackCode).Distinct().ToArray(); - - //从轨迹内容中查询出标记是否需要mq广播 - var contentList = await _provideQueries.GetTrackContentsAsync(systemIds, trackCodes); - var toMqDict = contentList - .ToDictionary(x => x.SubSystemId + x.TrackContentCode, y => y.IsToMq); - - //选出需要广播的轨迹,并按code和订单号分组 - var trackGroup = trackList - .Where(x => toMqDict[x.SubSystemId + x.TrackCode]) - .GroupBy(m => new - { - m.TrackCode, - m.OrderNo - }) - .ToList(); - if (trackGroup.Count == 0) return; - - foreach (var dataItem in trackGroup) - { - var item = dataItem.First(); - var content = contentList.First(m => m.TrackContentCode == item.TrackCode); - - // _broadcastingService.TrackChangePublicTopic(track, - // dataItem.Select(m => new OrderIdentifier - // { - // OrderId = m.OrderId, - // OrderNo = m.OrderNo, - // OrderType = m.OrderType - // }).ToArray(), - // item.TrackCode, - // item.TrackStatusCode, - // content.SubSystemCode - // ); - - //将每个订单的每个轨迹的删除变更发布 - foreach (var track in dataItem) - { - _broadcastingService.TrackChangePublicTopic(new TrackChangeEto - { - EstimatedDeliveryDate = track.EstimatedDeliveryDate, - TrackPlacePostcode = track.TrackPlacePostcode, - TrackPlaceNation = track.TrackPlaceNation, - TrackPlaceNationId = track.TrackPlaceNationId, - TrackPlaceProvince = track.TrackPlaceProvince, - TrackPlaceProvinceId = track.TrackPlaceProvinceId, - TrackPlaceCity = track.TrackPlaceCity, - TrackPlaceCityId = track.TrackPlaceCityId, - Files = track.Files?.Select(x => new FileItemDto() - { - FileName = x.FileName, - OssKey = x.OssKey - }).ToList(), - Remarks = track.Remarks, - Source = track.Source, - IsVisibility = track.IsVisibility, - TrackTimeZone = track.TrackTimeZone, - TrackTime = track.TrackTime, - TrackPlace = track.TrackPlace, - TrackStatusCode = track.TrackStatusCode, - EnStatus = track.TrackEnContent, - Content = track.TrackContent, - TrackCode = track.TrackCode, - OperationMan = @event.OperationMan, - OrderIdentifiers = new[] - { - new OrderIdentifier() - { - OrderId = track.OrderId, - OrderNo = track.OrderNo, - OrderType = track.OrderType - } - }, - SubSystemId = @event.SubSystemId, - Extra = track.Extra - }, content.SubSystemCode); - } - } - } - private async Task> DeleteTrackAsync(TrackDeleteEvent @event) { List orderIds; @@ -264,7 +181,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe throw new BusinessException(message: $"当前轨迹不存在扩展信息,无法利用扩展字段:{@event.CompareFields}"); } - var extraDict = GetExtraDictForTextJson(x.Extra); + var extraDict = TextJsonHelper.DeserializeDictionary(x.Extra); if (extraDict == null || !extraDict.TryGetValue(@event.CompareFields, out var compareValue)) { throw new BusinessException(message: $"请检查拓展字段,为什么找不到比较字段:{@event.CompareFields}"); @@ -361,68 +278,88 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe return deleteTracks; } - private Dictionary? GetExtraDictForTextJson(string? extraStr) + private async Task PublicTrackTopicAsync(TrackDeleteEvent @event, List trackList) { - return string.IsNullOrWhiteSpace(extraStr) - ? null - : System.Text.Json.JsonSerializer.Deserialize>(extraStr); - } + var systemIds = trackList.Select(x => x.SubSystemId).Distinct().ToArray(); + var trackCodes = trackList.Select(x => x.TrackCode).Distinct().ToArray(); - //json Element和object的比较 - private bool EqJsonElementObject2(object? a, object? b) - { - if (a == null && b == null) - { - return true; - } + //从轨迹内容中查询出标记是否需要mq广播 + var contentList = await _provideQueries.GetTrackContentsAsync(systemIds, trackCodes); + var toMqDict = contentList + .ToDictionary(x => x.SubSystemId + x.TrackContentCode, y => y.IsToMq); - if (a is JsonElement aJsonElement) - { - switch (aJsonElement.ValueKind) + //选出需要广播的轨迹,并按code和订单号分组 + var trackGroup = trackList + .Where(x => toMqDict[x.SubSystemId + x.TrackCode]) + .GroupBy(m => new { - case JsonValueKind.Undefined: - return false; - case JsonValueKind.Object: - return false; - case JsonValueKind.Array: - return false; - case JsonValueKind.String: - return string.Equals(aJsonElement.GetString(), b as string); - case JsonValueKind.Number: + m.TrackCode, + m.OrderNo + }) + .ToList(); + if (trackGroup.Count == 0) return; + + //增加延时确保写盘成功 + await Task.Delay(1000); + foreach (var dataItem in trackGroup) + { + var item = dataItem.First(); + var content = contentList.First(m => m.TrackContentCode == item.TrackCode); + + // _broadcastingService.TrackChangePublicTopic(track, + // dataItem.Select(m => new OrderIdentifier + // { + // OrderId = m.OrderId, + // OrderNo = m.OrderNo, + // OrderType = m.OrderType + // }).ToArray(), + // item.TrackCode, + // item.TrackStatusCode, + // content.SubSystemCode + // ); + + //将每个订单的每个轨迹的删除变更发布 + foreach (var track in dataItem) + { + _broadcastingService.TrackChangePublicTopic(new TrackChangeEto + { + EstimatedDeliveryDate = track.EstimatedDeliveryDate, + TrackPlacePostcode = track.TrackPlacePostcode, + TrackPlaceNation = track.TrackPlaceNation, + TrackPlaceNationId = track.TrackPlaceNationId, + TrackPlaceProvince = track.TrackPlaceProvince, + TrackPlaceProvinceId = track.TrackPlaceProvinceId, + TrackPlaceCity = track.TrackPlaceCity, + TrackPlaceCityId = track.TrackPlaceCityId, + Files = track.Files?.Select(x => new FileItemDto() { - if (b == null) return false; - - if (b is int bInt) - { - var aInt = aJsonElement.GetInt32(); - return aInt == bInt; - } - - if (b is long bLong) - { - var aLong = aJsonElement.GetInt64(); - return aLong == bLong; - } - - return false; - } - case JsonValueKind.True: - case JsonValueKind.False: + FileName = x.FileName, + OssKey = x.OssKey + }).ToList(), + Remarks = track.Remarks, + Source = track.Source, + IsVisibility = track.IsVisibility, + TrackTimeZone = track.TrackTimeZone, + TrackTime = track.TrackTime, + TrackPlace = track.TrackPlace, + TrackStatusCode = track.TrackStatusCode, + EnStatus = track.TrackEnContent, + Content = track.TrackContent, + TrackCode = track.TrackCode, + OperationMan = @event.OperationMan, + OrderIdentifiers = new[] { - if (b is bool bl) + new OrderIdentifier() { - return aJsonElement.GetBoolean() == bl; + OrderId = track.OrderId, + OrderNo = track.OrderNo, + OrderType = track.OrderType } - - return false; - } - case JsonValueKind.Null: - { - return false; - } + }, + SubSystemId = @event.SubSystemId, + Extra = track.Extra + }, content.SubSystemCode); } } - - return false; } } From 78571e57b90e3fe4fee9514b15d77c745fd75203 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 16 Jan 2025 11:58:46 +0800 Subject: [PATCH 75/80] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=A0=B9=E6=8D=AE=E6=AF=94=E8=BE=83=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E9=80=89=E5=8F=96=E7=9A=84=E6=AF=94=E8=BE=83=E5=BC=82?= =?UTF-8?q?=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ProvideServices/TrackService.cs | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 7e8206f8..31ab4fcc 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -255,11 +255,8 @@ public partial class TrackService : ApplicationService, ITrackService } var extraDict = System.Text.Json.JsonSerializer.Deserialize>(y.Extra); - if (extraDict!.TryGetValue(input.CompareFields!, out var compareValue)) - { - //todo:需要修改JsonElement和object的逻辑 - return compareValue.Equals(input.CompareValue); - } + if (extraDict!.TryGetValue(input.CompareFields!, out var compareValueJsonElement)) + return TextJsonHelper.EqJsonElementAndObject(compareValueJsonElement, input.CompareValue); return false; }) @@ -378,12 +375,9 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: "轨迹extra为空无法使用比较字段比较,请检查轨迹"); } - var extraDict = System.Text.Json.JsonSerializer.Deserialize>(y.Extra); - if (extraDict!.TryGetValue(input.CompareFields!, out var compareValue)) - { - //todo:需要修改JsonElement和object的逻辑 - return compareValue.Equals(input.CompareValue); - } + var extraDict = TextJsonHelper.DeserializeDictionary(y.Extra); + if (extraDict!.TryGetValue(input.CompareFields!, out var compareValueJsonElement)) + return TextJsonHelper.EqJsonElementAndObject(compareValueJsonElement, input.CompareValue); return false; }) From 9f4872b432eece6d7014b1a421ac7c957292f5d8 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 16 Jan 2025 16:25:31 +0800 Subject: [PATCH 76/80] =?UTF-8?q?fix:=20=E5=A1=AB=E8=A1=A5=E6=96=B0?= =?UTF-8?q?=E5=A2=9E/=E4=BF=AE=E6=94=B9=E8=BD=A8=E8=BF=B9=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E9=80=BB=E8=BE=91=E7=BC=BA=E9=99=B7=EF=BC=8C=20=20-?= =?UTF-8?q?=20=E4=B8=8D=E5=85=81=E8=AE=B8=E9=87=8D=E5=A4=8D=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=9A=84=E8=BD=A8=E8=BF=B9=E6=8B=A6=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refactor: 重构新增/更新轨迹,提取公共的检查逻辑 update: Text.Json增加json字符串转JsonElement rename: DeserializeDictionary => DeserializeToDictionary --- .../Dtos/ProvideServices/UpsertTrackInput.cs | 2 +- .../EventHandlers/TrackDeleteEventHandler.cs | 2 +- .../EventHandlers/TrackUpsertEventHandler.cs | 4 +- .../Helpers/TextJsonHelper.cs | 11 +- .../Services/ProvideServices/TrackService.cs | 479 +++++++++--------- 5 files changed, 255 insertions(+), 243 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs index d7679cda..def0e322 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs @@ -32,7 +32,7 @@ public class UpsertTrackInput : OrderNoInfo /// 轨迹发生时间 /// [Required] - public DateTime? TrackTime { get; set; } + public DateTime TrackTime { get; set; } /// /// 更改后的轨迹发生时间,无需更改保持为空 diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index 41956e2d..551322ed 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -181,7 +181,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe throw new BusinessException(message: $"当前轨迹不存在扩展信息,无法利用扩展字段:{@event.CompareFields}"); } - var extraDict = TextJsonHelper.DeserializeDictionary(x.Extra); + var extraDict = TextJsonHelper.DeserializeToDictionary(x.Extra); if (extraDict == null || !extraDict.TryGetValue(@event.CompareFields, out var compareValue)) { throw new BusinessException(message: $"请检查拓展字段,为什么找不到比较字段:{@event.CompareFields}"); diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 1cd62f13..f8d2cc5a 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -277,7 +277,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe else { Debug.Assert(@event.CompareFields != null, "@event.CompareFields != null"); - var extraDict = TextJsonHelper.DeserializeDictionary(@event.Extra); + var extraDict = TextJsonHelper.DeserializeToDictionary(@event.Extra); if (extraDict == null || !extraDict.TryGetValue(@event.CompareFields, out var compareValue)) { throw new BusinessException(message: $"请检查拓展字段,为什么找不到比较字段:{@event.CompareFields}"); @@ -285,7 +285,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe existTracks = existTracks.Where(x => { - var oldExtraDict = TextJsonHelper.DeserializeDictionary(x.Extra); + var oldExtraDict = TextJsonHelper.DeserializeToDictionary(x.Extra); // tips:注意兼容性,历史轨迹的字段可能为空 if (oldExtraDict == null || !oldExtraDict.TryGetValue(@event.CompareFields, out var oldValue)) { diff --git a/src/SJZY.Track.Application/Helpers/TextJsonHelper.cs b/src/SJZY.Track.Application/Helpers/TextJsonHelper.cs index b7c833cf..306e22e2 100644 --- a/src/SJZY.Track.Application/Helpers/TextJsonHelper.cs +++ b/src/SJZY.Track.Application/Helpers/TextJsonHelper.cs @@ -18,13 +18,20 @@ public static class TextJsonHelper return string.IsNullOrWhiteSpace(json) ? default : System.Text.Json.JsonSerializer.Deserialize(json); } - public static Dictionary? DeserializeDictionary(string? dictJsonString) + public static Dictionary? DeserializeToDictionary(string? dictJsonString) { return string.IsNullOrWhiteSpace(dictJsonString) ? null : System.Text.Json.JsonSerializer.Deserialize>(dictJsonString); } + public static JsonElement? DeserializeToJsonElement(string? dictJsonString) + { + return string.IsNullOrWhiteSpace(dictJsonString) + ? null + : System.Text.Json.JsonSerializer.Deserialize(dictJsonString); + } + /// /// 获取JsonElement字符串表达的值 /// @@ -158,7 +165,7 @@ public static class TextJsonHelper /// /// /// - public static bool EqByJsonElementField(object a, object b, string fieldName) + public static bool EqByJsonElementField(object? a, object? b, string fieldName) { if (a is not JsonElement aJsonElement || b is not JsonElement bJsonElement) return false; diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 31ab4fcc..c294e850 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -47,156 +47,6 @@ public partial class TrackService : ApplicationService, ITrackService _trackDetailsEsRepository = trackDetailsEsRepository; } - /// - /// 新增、更新轨迹(存在就更新) - /// - /// - /// - /// - [HttpPost("Track/Upsert")] - public async Task UpsertTrackAsync(UpsertTrackInput input) - { - // todo: 代码太长了 - var order = await _orderRepository.GetFirstAsync(x => - x.SubSystemId == input.SubSystemId && x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, - x => new - { - x.Id, - x.CustomId - }); - if (order == default) - { - throw new BusinessException(message: $"订单:{input.OrderNo}不存在"); - } - - if (!GlobalConst.SupportTrackSources.Contains(input.Source)) - { - throw new BusinessException(message: "轨迹来源是必须的"); - } - - //要求时间在当前时间的前后100年之间内 - bool ValidateTrackTime(DateTime? d) => (d != null && d < DateTime.Now.AddYears(-100) || d > DateTime.Now.AddYears(100)); - if (ValidateTrackTime(input.TrackTime) || ValidateTrackTime(input.NewTrackTime) || ValidateTrackTime(input.EstimatedDeliveryDate)) - { - throw new BusinessException(message: "轨迹时间不合法"); - } - - if ((input.EstimatedDeliveryDate.HasValue == false && input.DestinationTimeZone.HasValue) || - (input.EstimatedDeliveryDate.HasValue && input.DestinationTimeZone.HasValue == false)) - { - 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) - { - 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}不允许手动更新"); - } - - //如果传递了esId并且是修改操作则使用esid - var tracks = (!string.IsNullOrWhiteSpace(input.EsId) && !input.IsAdd) - ? await _trackDetailsEsRepository.GetDataByIds(new[] { input.EsId }) - : (await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true)) - .Where(x => x.TrackTime == input.TrackTime) - .ToList(); - - //根据比较字段选出所需的轨迹 - if (!string.IsNullOrWhiteSpace(input.CompareFields)) - { - var a = input.TrackCode + TextJsonHelper.ExtractValue(input.Extra, input.CompareFields); - tracks = tracks.Where(x => string.Equals(a, - x.TrackCode + TextJsonHelper.ExtractValue(x.Extra, input.CompareFields!))).ToList(); - } - - // todo:es落盘延迟是不确定的 - //当为更新操作时发现更新的数目为0进行重试操作 - if (!input.IsAdd && tracks.Count == 0) - { - var curRetryCount = 0; - var success = false; - while (!success && curRetryCount < GlobalConst.MaxUpdateTrackRetryCount) - { - try - { - tracks = (await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true)) - .Where(x => x.TrackTime == input.TrackTime) - .ToList(); - if (tracks.Count > 0) - success = true; - // todo: 最大重试次数应该是可配置的,当出现的时候应该有告警,而不是直接给调用方,指数退避 2^N - await Task.Delay(300); - } - finally - { - curRetryCount++; - } - } - - if (tracks.Count == 0) - { - throw new BusinessException(message: $"订单:{input.OrderNo},轨迹代码:{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) - { - //todo:保留之前的方式(FBA在用) 后续可能去除 - userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(input.OptionUserId); - - if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) - //TODO: log || ex - throw new BusinessException(message: $"调用用户中心,获取用户信息失败:{userInfo.Msg}"); - } - - var name = userInfo.Data.UserName; - - // 新增/更新轨迹 - var @event = ObjectMapper.Map(input); - @event.SubSystemId = input.SubSystemId; - @event.CustomId = order.CustomId; - @event.OrderIdentifiers = new[] - { - new OrderIdentifier - { - OrderId = order.Id, - OrderNo = input.OrderNo, - OrderType = input.OrderType, - } - }; - @event.OperationMan = name; - await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); - return new UnifyResultDto(true, true); - } - /// /// 删除轨迹 /// @@ -375,7 +225,7 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: "轨迹extra为空无法使用比较字段比较,请检查轨迹"); } - var extraDict = TextJsonHelper.DeserializeDictionary(y.Extra); + var extraDict = TextJsonHelper.DeserializeToDictionary(y.Extra); if (extraDict!.TryGetValue(input.CompareFields!, out var compareValueJsonElement)) return TextJsonHelper.EqJsonElementAndObject(compareValueJsonElement, input.CompareValue); @@ -403,8 +253,76 @@ public partial class TrackService : ApplicationService, ITrackService return new UnifyResultDto(true, true); } + /// + /// 新增、更新轨迹(存在就更新) + /// + /// + /// + /// + [HttpPost("Track/Upsert")] + public async Task UpsertTrackAsync(UpsertTrackInput input) + { + var order = await _orderRepository.GetFirstAsync(x => + x.SubSystemId == input.SubSystemId + && x.OrderType == input.OrderType + && x.OrderNo == input.OrderNo, + x => new + { + x.Id, + x.OrderNo, + x.CustomId + }); + if (order == default) + { + throw new BusinessException(message: $"订单:{input.OrderNo}不存在"); + } + + // 输入参数的静态规则检查 + // 轨迹内容上的约束检查 + // 更新轨迹时是否可以匹配到轨迹的检查 + await TrackUpsertValidation(input.IsAdd, + input.SubSystemId, + order.Id, + order.OrderNo, + input.TrackCode, + input.Source, + input.TrackTime, + input.NewTrackTime, + input.EstimatedDeliveryDate, + input.DestinationTimeZone, + input.Extra, + input.CompareFields); + + var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(); + if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) + { + //todo:保留之前的方式(FBA在用) 后续可能去除 + userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(input.OptionUserId); + + if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) + throw new BusinessException(message: $"调用用户中心,获取用户信息失败:{userInfo.Msg}"); + } + + var name = userInfo.Data.UserName; + + // 新增/更新轨迹 + var @event = ObjectMapper.Map(input); + @event.SubSystemId = input.SubSystemId; + @event.CustomId = order.CustomId; + @event.OrderIdentifiers = new[] + { + new OrderIdentifier + { + OrderId = order.Id, + OrderNo = input.OrderNo, + OrderType = input.OrderType, + } + }; + @event.OperationMan = name; + await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); + return new UnifyResultDto(true, true); + } - // todo:代码封装性太差了,拆小一点 /// /// 批量新增、更新轨迹 /// @@ -416,8 +334,9 @@ public partial class TrackService : ApplicationService, ITrackService { input.OrderNos = input.OrderNos.Where(x => !x.IsNullOrWhiteSpace()).Distinct().ToList(); // 单号去重、去空 var orders = await _orderRepository.GetListAsync(x => - x.SubSystemId == input.SubSystemId && x.OrderType == input.OrderType && - input.OrderNos.Contains(x.OrderNo), + x.SubSystemId == input.SubSystemId + && x.OrderType == input.OrderType + && input.OrderNos.Contains(x.OrderNo), x => new { x.Id, @@ -430,94 +349,26 @@ 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) - { - throw new BusinessException(message: "来源为外部服务商轨迹不允许修改"); - } - // 校验主体:批量新增只选取第一条订单进行校验 //【新增】存在指定轨迹的内容,进行更新覆盖(只处理一条的情况,并且决定权交给用户),不存在直接插入即可 //【更新】存在指定轨迹的内容(匹配到多条则不处理) var order = orders.First(); - //要求时间在当前时间的前后100年之间内 - bool ValidateTrackTime(DateTime? d) => (d != null && d < DateTime.Now.AddYears(-100) || d > DateTime.Now.AddYears(100)); - if (ValidateTrackTime(input.TrackTime) || ValidateTrackTime(input.NewTrackTime) || ValidateTrackTime(input.EstimatedDeliveryDate)) - { - 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)) - .Where(x => x.TrackTime == input.TrackTime) - .ToList(); - - // todo:这块代码抽出去 - //当为更新操作时发现更新的数目为0进行重试操作 - if (!input.IsAdd && tracks.Count == 0) - { - var curRetryCount = 0; - var success = false; - while (!success && curRetryCount < GlobalConst.MaxUpdateTrackRetryCount) - { - try - { - tracks = (await _trackDetailsEsRepository.GetListAsync(new[] { order.Id }, input.TrackCode, true)) - .Where(x => x.TrackTime == input.TrackTime) - .ToList(); - if (tracks.Count > 0) - success = true; - await Task.Delay(300); - } - finally - { - curRetryCount++; - } - } - - if (tracks.Count == 0) - { - throw new BusinessException(message: $"订单:[{string.Join(",", input.OrderNos)}],轨迹代码:{input.TrackCode}没有要更新的记录"); - } - } - - //更新轨迹,同一时间存在多条轨迹记录,理由:不清晰到底要修改哪一条或是全部修改 - if (!input.IsAdd && tracks.Count > 1) - { - throw new BusinessException(message: $"订单:{order.OrderNo},轨迹代码:{input.TrackCode}存在多条记录,不允许修改"); - } + // 输入参数的静态规则检查 + // 轨迹内容上的约束检查 + // 更新轨迹时是否可以匹配到轨迹的检查 + await TrackUpsertValidation(input.IsAdd, + input.SubSystemId, + order.Id, + order.OrderNo, + input.TrackCode, + input.Source, + input.TrackTime, + input.NewTrackTime, + input.EstimatedDeliveryDate, + input.DestinationTimeZone, + input.Extra, + input.CompareFields); // 获取用户name var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(); @@ -572,4 +423,158 @@ public partial class TrackService : ApplicationService, ITrackService return new UnifyResultDto(true, true); } + + //在轨迹更新主流程之前的前置检查 + private async Task TrackUpsertValidation( + bool isAdd, + int subSystemId, + int orderId, + string orderNo, + string trackCode, + int source, + DateTime trackTime, + DateTime? newTrackTime, + DateTime? estimatedDeliveryDate, + float? destinationTimeZone, + string? extra, + string? compareFields + ) + { + #region 静态规则检查 + + // 约束轨迹来源只能选取 1-外部 2-内部 3-手动 + if (!GlobalConst.SupportTrackSources.Contains(source)) + { + throw new BusinessException(message: "轨迹来源是必须的,1:外部服务商 2:内部系统 3:人工操作"); + } + + //当修改时,如果为来源为外部提供商则不允许修改 + if (!isAdd && source == (int) TrackSourceEnum.ExternalServiceProvide) + { + throw new BusinessException(message: "来源为外部服务商轨迹不允许修改"); + } + + //要求时间在当前时间的前后100年之间内 + bool ValidateTrackTime(DateTime? d) => (d != null && d < DateTime.Now.AddYears(-100) || d > DateTime.Now.AddYears(100)); + if (ValidateTrackTime(trackTime) || ValidateTrackTime(newTrackTime) || ValidateTrackTime(estimatedDeliveryDate)) + { + throw new BusinessException(message: "轨迹时间不合法"); + } + + if ((estimatedDeliveryDate.HasValue == false && destinationTimeZone.HasValue) || + (estimatedDeliveryDate.HasValue && destinationTimeZone.HasValue == false)) + { + throw new BusinessException(message: "【预计签收时间】和【签收地时区】必须同时输入"); + } + + if (string.IsNullOrWhiteSpace(compareFields) && string.IsNullOrWhiteSpace(extra)) + { + throw new BusinessException(message: "当输入了【轨迹对比字段】则轨迹扩展是必须的的"); + } + + #endregion + + #region 轨迹内容中的配置规则检查 + + var trackContent = await _trackContentRepository.GetByCodeAsync(subSystemId, trackCode); + if (trackContent == default) + { + throw new BusinessException(message: $"轨迹代码:{trackCode}轨迹内容不存在"); + } + + //指示是否为手动操作 + var manualOperation = source == (int) TrackSourceEnum.Artificial; + + //不允许手动创建 + if (manualOperation && isAdd && !trackContent.IsAllowManuallyCreate) + { + throw new BusinessException(message: $"轨迹代码:{trackCode}不允许手动创建"); + } + + //不允许手动更新 + if (manualOperation && !isAdd && !trackContent.IsAllowManuallyUpdate) + { + throw new BusinessException(message: $"轨迹代码:{trackCode}不允许手动更新"); + } + + #endregion + + //轨迹新增,不允许重复的轨迹提前拦截 + if (isAdd) + { + //允许重复,跳过检查 + if (trackContent.IsRepeatable) return; + //找到这个订单的这个轨迹code的所有轨迹 + var tracks = await QueryAndFilterAsync(orderId, trackCode, trackTime, extra, compareFields); + if (tracks.Count > 0) + throw new BusinessException(message: $"订单:[{orderNo}],轨迹代码:{trackCode}不允许重复创建轨迹"); + } + //针对于轨迹更新检查 + else + { + //找到这个订单的这个轨迹code的所有轨迹, + var tracks = await RetryQueryTrackAsync(orderId, trackCode, trackTime, extra, compareFields); + //不存在需要更新的轨迹 + if (tracks.Count == 0) + throw new BusinessException(message: $"订单:[{orderNo}],轨迹代码:{trackCode}没有要更新的记录"); + + //更新轨迹,同一时间存在多条轨迹记录,理由:不清晰到底要修改哪一条或是全部修改 + if (tracks.Count > 1) + throw new BusinessException(message: $"订单:{orderNo},轨迹代码:{trackCode}存在多条记录,不允许修改"); + } + } + + // 重试查询轨迹,直到存在符合要求的轨迹,或者超过最大重试次数 + private async Task> RetryQueryTrackAsync(int orderId, string trackCode, DateTime trackTime, string? extra, string? compareFields) + { + var tracks = await QueryAndFilterAsync(orderId, trackCode, trackTime, extra, compareFields); + if (tracks.Count > 0) + return tracks; + + //重试阶段 + var curRetryCount = 0; + while (curRetryCount < GlobalConst.MaxUpdateTrackRetryCount) //tips:后续将最大重试次数提出到配置中 + { + try + { + tracks = await QueryAndFilterAsync(orderId, trackCode, trackTime, extra, compareFields); + if (tracks.Count > 0) + return tracks; + //指数退避等待 + var delay = TimeSpan.FromMilliseconds(Math.Pow(2, curRetryCount) * 150); // 150ms, 300ms, 600ms, ... + await Task.Delay(delay); + } + finally + { + curRetryCount++; + } + } + + //超过最大重试次数还没找到 + return tracks; + } + + //查询并按比较字段过滤轨迹,当比较字段为空时则使用轨迹发生时间过滤 + //tips:后续进行投影缩参优化 + private async Task> QueryAndFilterAsync(int orderId1, string trackCode1, DateTime trackTime1, string? extra1, string? compareFields1) + { + var tracks1 = await _trackDetailsEsRepository.GetListAsync(new[] { orderId1 }, trackCode1, true); + //无比较字段时使用轨迹时间参与过滤(兼容老版本) + if (string.IsNullOrWhiteSpace(compareFields1)) + { + return tracks1.Where(x => x.TrackTime == trackTime1).ToList(); + } + + return tracks1.Where(x => + { + if (string.IsNullOrWhiteSpace(x.Extra)) + throw new BusinessException(message: "轨迹extra为空无法使用比较字段比较,请检查轨迹"); + + var extraJsonElement = TextJsonHelper.DeserializeToJsonElement(x.Extra); + var inputExtraJsonElement = TextJsonHelper.DeserializeToJsonElement(extra1); + + return TextJsonHelper.EqByJsonElementField(extraJsonElement, inputExtraJsonElement, compareFields1); + }) + .ToList(); + } } From 355c7d02cd3a1e921c762dd04ad7cd5900bc2d37 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Thu, 16 Jan 2025 17:00:56 +0800 Subject: [PATCH 77/80] =?UTF-8?q?fix:=E6=96=B0=E5=A2=9E/=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9=20=E4=BF=AE=E5=A4=8D=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E4=B8=AD=E7=9A=84bool=E9=80=BB=E8=BE=91=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ProvideServices/TrackService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index c294e850..f52e1b17 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -467,7 +467,7 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: "【预计签收时间】和【签收地时区】必须同时输入"); } - if (string.IsNullOrWhiteSpace(compareFields) && string.IsNullOrWhiteSpace(extra)) + if (!string.IsNullOrWhiteSpace(compareFields) && string.IsNullOrWhiteSpace(extra)) { throw new BusinessException(message: "当输入了【轨迹对比字段】则轨迹扩展是必须的的"); } From 928c3b15e8628e9fcccb411c5e8bf5e9d6e89197 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 17 Jan 2025 14:54:29 +0800 Subject: [PATCH 78/80] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=B9=BF=E6=92=AD=E5=88=A0=E9=99=A4=E4=B8=8D?= =?UTF-8?q?=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/Broadcasting/BroadcastingService.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs index 7322f296..4bf2a839 100644 --- a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs +++ b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs @@ -83,6 +83,7 @@ public class BroadcastingService : IBroadcastingService public void TrackChangePublicTopic(TrackChangeEto eto, string subSystemCode) { + eto.Option = 2; _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{subSystemCode}", Encoding.UTF8.GetBytes(eto.ToJson())); } From 0b27240d9083903a4fc2e51d7bb1e7e0b1c19b7a Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 17 Jan 2025 15:05:32 +0800 Subject: [PATCH 79/80] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E5=8F=98=E6=9B=B4=E5=B9=BF=E6=92=AD=E7=BC=BA=E5=A4=B1=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E8=AE=A2=E5=8D=95=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/Broadcasting/BroadcastingService.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs index 4bf2a839..48345f81 100644 --- a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs +++ b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs @@ -46,6 +46,7 @@ public class BroadcastingService : IBroadcastingService TrackTime = eto.TrackTime, TrackPlace = eto.TrackPlace, TrackStatusCode = trackStatusCode, + OrderNo = eto.OrderIdentifiers.First().OrderNo, EnStatus = eto.EnStatus, Content = eto.Content, TrackCode = eto.TrackCode, From 8ca174c93a207eec9da9fe0ed7e2f319c6983898 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 17 Jan 2025 15:34:07 +0800 Subject: [PATCH 80/80] =?UTF-8?q?fix:=20=E8=A1=A5=E5=85=85=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E7=9A=84=E8=AE=A2=E5=8D=95=E5=8F=B7=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CAP/EventHandlers/TrackDeleteEventHandler.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index 551322ed..e1c416d0 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -347,6 +347,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe Content = track.TrackContent, TrackCode = track.TrackCode, OperationMan = @event.OperationMan, + OrderNo = track.OrderNo, OrderIdentifiers = new[] { new OrderIdentifier()