diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs index baaeb7bb..d5767cd5 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs @@ -49,6 +49,7 @@ public class BatchUpsertTrackInput : OrderNosInfo /// /// 数据来源:1外部服务商创建,2内部系统创建,3人工创建 + /// 批量新增时使用指定轨迹来源,更新时无需指定 /// [Required] public int Source { get; set; } diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs index 72df17e3..84c1ed15 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs @@ -7,6 +7,9 @@ public class GetTrackOutput /// public string OrderNo { get; set; } = null!; + /// + /// 轨迹明细列表 + /// public List TrackDetails { get; set; } = new(); } @@ -32,4 +35,70 @@ public class TrackDetail /// 是否对外 /// public bool IsDisplay { get; set; } + + /// + /// 客户是否可见 + /// + public bool IsVisibility { get; set; } + + /// + /// 数据来源:1外部服务商创建,2内部系统创建,3人工创建 + /// + public int Source { get; set; } + + /// + /// 备注 + /// + public string? Remarks { get; set; } + + /// + /// 附件集合 + /// + public List? Files { get; set; } + + /// + /// 轨迹发生地(城市) + /// + public string? TrackPlaceCity { get; set; } + + /// + /// 轨迹发生地(城市)Id + /// + public int? TrackPlaceCityId { get; set; } + + /// + /// 轨迹发生地(省/州) + /// + public string? TrackPlaceProvince { get; set; } + + /// + /// 轨迹发生地(省/州)Id + /// + public int? TrackPlaceProvinceId { get; set; } + + /// + /// 轨迹发生地(国家/地区) + /// + public string? TrackPlaceNation { get; set; } + + /// + /// 轨迹发生地(国家/地区)Id + /// + public int? TrackPlaceNationId { get; set; } + + /// + /// 轨迹发生地邮编 + /// + public string? TrackPlacePostcode { get; set; } + + + /// + /// 预计到达时间 + /// + public DateTime? EstimatedDeliveryDate { get; set; } + + /// + /// 目的地时区 + /// + public float? DestinationTimeZone { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs index 69e77773..f1c9300c 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs @@ -26,4 +26,19 @@ public class GetAvailableContentOutput /// 是否对外 /// public bool IsExternal { get; set; } + + /// + /// 轨迹来源 + /// + public int? Source { get; set; } + + /// + /// 轨迹发生时间 + /// + public DateTime? TrackTime { get; set; } + + /// + /// 轨迹发生时区 + /// + public float? TrackTimeZone { get; set; } } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index 436e55dd..288face2 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -172,6 +172,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe tracks = await _trackDetailsEsRepository.GetDataByIds(@event.EsIds); orderIds = tracks.Select(m => m.OrderId).Distinct().ToList(); @event.OrderIds = orderIds.ToArray(); + @event.TrackCodes = tracks.Select(x => x.TrackCode).Distinct().ToList(); // 外部api获取的轨迹不允许删除 if (tracks.Any(m => m.Source == TrackSourceEnum.ExternalServiceProvide.GetHashCode())) @@ -182,6 +183,9 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe { await _trackDetailsEsRepository.DeleteTrackByIdAsync(item.Id, item.IndexName); } + + //清理已经删除过的esid + @event.EsIds = Array.Empty(); } else //原有逻辑,根据轨迹code和订单进行删除 { @@ -235,7 +239,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe OrderId = order.Id, OrderNo = order.OrderNo, OptionType = OrderOperationType.删除轨迹.ToString(), - Content = tracks?.Where(m=>m.OrderId == order.Id)?.ToList().ToJson(), + Content = tracks?.Where(m => m.OrderId == order.Id)?.ToList().ToJson(), CreateUserId = @event.OperationManId, CreateUserName = @event.OperationMan ?? "", CreateTime = DateTime.Now diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 58b1cd4f..eba60623 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -298,8 +298,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe if (track == null) continue; // 不存在不让改 - //来源与外部服务商不允许修改 - if (track.Source == (int) TrackSourceEnum.ExternalServiceProvide) continue; } else { @@ -398,9 +396,14 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe } else { - track.TrackPlace = @event.TrackPlace; - track.TrackTime = @event.NewTrackTime ?? @event.TrackTime; - track.TrackTimeZone = @event.TrackTimeZone; + //外部轨迹,轨迹发生地,轨迹发生时间,轨迹发生时区,不允许更改 + if (track.Source != (int) TrackSourceEnum.ExternalServiceProvide) + { + track.TrackPlace = @event.TrackPlace; + track.TrackTime = @event.NewTrackTime ?? @event.TrackTime; + track.TrackTimeZone = @event.TrackTimeZone; + } + track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 ? track.TrackTime : track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); diff --git a/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs index 8afa7705..25367043 100644 --- a/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs +++ b/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs @@ -15,6 +15,7 @@ using SJZY.Track.Application.Contract.Services; using SJZY.Track.Application.Helpers; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; +using SJZY.Track.Domain.Enums; using Volo.Abp.DependencyInjection; namespace SJZY.Track.Application.Rabbit; @@ -258,6 +259,22 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler TrackTime = trackTime ?? DateTime.Now, TrackTimeZone = trackTimeZone ?? GlobalConst.NoneTrackTimeZone, IsAdd = true, + //S06新增 + IsVisibility = false, + Source = (int)TrackSourceEnum.ExternalServiceProvide, + Remarks = GlobalConst.EmptyString, + Files = null, + Content = GlobalConst.EmptyString, + EnStatus = GlobalConst.EmptyString, + TrackPlaceCity = GlobalConst.EmptyString, + TrackPlaceCityId = GlobalConst.NotExistId, + TrackPlaceProvince = GlobalConst.EmptyString, + TrackPlaceProvinceId = GlobalConst.NotExistId, + TrackPlaceNation = GlobalConst.EmptyString, + TrackPlaceNationId = GlobalConst.NotExistId, + TrackPlacePostcode = GlobalConst.EmptyString, + DestinationTimeZone = null, + EstimatedDeliveryDate = null, }; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertForRefreshSubscribe, trackUpsertEvent); @@ -281,7 +298,26 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler OriginTrackDataHash = StringHelper.GetHash(JsonConvert.SerializeObject(trackToken)), OriginTrackContent = trackContent ?? GlobalConst.EmptyString, CreateUser = GlobalConst.SystemUser, - CreateTime = DateTime.Now + CreateTime = DateTime.Now, + //来源轨迹内容,第一次新增的时候使用轨迹内容表提供的 + TrackStatus = GlobalConst.EmptyString, + TrackStatusCode = GlobalConst.EmptyString, + TrackContent = GlobalConst.EmptyString, + TrackEnContent = GlobalConst.EmptyString, + //S06新增轨迹明细字段 + IsVisibility = false, + Source = (int) TrackSourceEnum.ExternalServiceProvide, + Remarks = GlobalConst.EmptyString, + Files = null, + TrackPlaceCity = GlobalConst.EmptyString, + TrackPlaceCityId = GlobalConst.NotExistId, + TrackPlaceProvince = GlobalConst.EmptyString, + TrackPlaceProvinceId = GlobalConst.NotExistId, + TrackPlaceNation = GlobalConst.EmptyString, + TrackPlaceNationId = GlobalConst.NotExistId, + TrackPlacePostcode = GlobalConst.EmptyString, + DestinationTimeZone = null, + EstimatedDeliveryDate = null, }; track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs index 30b0e0d2..ab0bd27d 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs @@ -62,7 +62,24 @@ public partial class TrackService TimeZone = Math.Abs(x.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 ? null : input.TimeZone ?? 8, - IsDisplay = trackContentDic.TryGetValue(x.TrackCode, out var isExternal) && isExternal + IsDisplay = trackContentDic.TryGetValue(x.TrackCode, out var isExternal) && isExternal, + IsVisibility = x.IsVisibility, + Source = x.Source, + Remarks = x.Remarks, + Files = x.Files?.Select(y => new FileItemDto + { + FileName = y.FileName, + OssKey = y.OssKey + }).ToList(), + TrackPlaceCity = x.TrackPlaceCity, + TrackPlaceCityId = x.TrackPlaceCityId, + TrackPlaceProvince = x.TrackPlaceProvince, + TrackPlaceProvinceId = x.TrackPlaceProvinceId, + TrackPlaceNation = x.TrackPlaceNation, + TrackPlaceNationId = x.TrackPlaceNationId, + TrackPlacePostcode = x.TrackPlacePostcode, + DestinationTimeZone = x.DestinationTimeZone, + EstimatedDeliveryDate = x.EstimatedDeliveryDate }).ToList(); res.Add(item); diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index bdc6edab..4aa023da 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -266,13 +266,7 @@ public class TrackContentService : ApplicationService if (!item.IsAllowManuallyCreate && input.TrackOptionType == TrackOptionType.创建) //跳过不允许手动创建的轨迹内容 continue; - if (!item.IsAllowManuallyUpdate && input.TrackOptionType == TrackOptionType.修改) //跳过不允许手动创建的轨迹内容 - continue; - - if (!item.IsRepeatable && input.TrackOptionType == TrackOptionType.删除) //删除操作中跳过不重复的轨迹内容 - continue; - - if (!item.IsAllowManuallyCreate && input.TrackOptionType == TrackOptionType.删除) //删除操作中跳过不允许手动创建的轨迹内容 + if (!item.IsAllowManuallyUpdate && input.TrackOptionType == TrackOptionType.修改) //跳过不允许手动修改的轨迹内容 continue; res.Data.Add(new GetAvailableContentOutput() @@ -285,6 +279,42 @@ public class TrackContentService : ApplicationService }); } + if (input.TrackOptionType == TrackOptionType.创建 + || trackDetails == null + || trackDetails.Count == 0) + { + return res; + } + + + //修改操作,查轨迹内容列表反映明细表数据,重新构造响应数据 + var matchContent = new List(); + var contents = res.Data.Select(x => new + { + x.Id, + x.IsExternal, + x.Code + }); + + foreach (var content in contents) + { + var match = trackDetails + .Where(x => x.TrackCode == content.Code) + .Select(matchItem => new GetAvailableContentOutput + { + IsExternal = content.IsExternal, + Id = content.Id, + EnContent = matchItem.TrackEnContent, + Content = matchItem.TrackContent, + Code = matchItem.TrackCode, + TrackTime = matchItem.TrackTime, + TrackTimeZone = matchItem.TrackTimeZone, + Source = matchItem.Source + }); + matchContent.AddRange(match); + } + + res.Data = matchContent; return res; } diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index 53f6c327..ec5f18fe 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -61,7 +61,7 @@ public class OrderRepository : BasicRepository, IOrderRepository, I public async Task<(int MainOrderId, int CustomId)> GetTrackOrderByProviderAndOrderNo(string serviceProvidrCode, string orderNo) { var orderList = await Context.Queryable() - .LeftJoin((a, b) => a.Id == b.OrderId && b.IsDeleted) + .LeftJoin((a, b) => a.Id == b.OrderId && b.IsDeleted == false) .Where((a, b) => a.OrderNo == orderNo || (b.Platform == serviceProvidrCode && b.OrderNumber == orderNo)) .Select((a, b) => new