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; } }