diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs index eda7ecbc..dcafe452 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs @@ -5,17 +5,18 @@ public class GetTrackOutput /// /// 订单号 /// - public string OrderNo { get; set; } + public string OrderNo { get; set; } = null!; - public List TrackDetails { get; set; } + public List TrackDetails { get; set; } = new(); } public class TrackDetail { - public string Code { get; set; } - public string Status { get; set; } - public string Content { get; set; } - public string Location { get; set; } + public string Code { get; set; } = null!; + public string Status { get; set; } = null!; + public string? Content { get; set; } + public string? OriginContent { get; set; } + public string Location { get; set; } = null!; public DateTime Time { get; set; } public float TimeZone { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs index d2a829ca..8a99f816 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs @@ -88,7 +88,7 @@ /// /// 轨迹标记id /// - public int TrackFlagId { get; set; } + public int? TrackFlagId { get; set; } /// /// 轨迹标记 diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackOrder/TrackPushRecordOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackOrder/TrackPushRecordOutput.cs new file mode 100644 index 00000000..bc136ca0 --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackOrder/TrackPushRecordOutput.cs @@ -0,0 +1,75 @@ +namespace SJZY.Track.Application.Contract.Dtos.TrackOrder; + +public class TrackPushRecordOutput +{ + /// + /// 订单Id + /// + public int OrderId { get; set; } + + /// + /// 接口通请求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 string TrackGTMTimeZone { get; set; } = null!; + + /// + /// 是否成功 + /// + public bool IsSuccess { get; set; } + + /// + /// 推送内容(json) + /// + public string PushContent { get; set; } = null!; + + /// 创建人 + public string? CreateUser { get; set; } + + /// 创建时间 + public DateTime CreateTime { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs new file mode 100644 index 00000000..7875d4da --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs @@ -0,0 +1,20 @@ +namespace SJZY.Track.Application.Contract.Dtos.TrackPush; + +public class TrackPushInput +{ + public string OrderNo { get; set; } = null!; + + public List Data { get; set; } = new(); +} + +public class TrackItem +{ + public string Location { get; set; } = null!; + public DateTime 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; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index 3533f2e6..53e0d856 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -22,6 +22,16 @@ public class TrackUpsertEvent /// public string? ServiceProviderName { get; set; } + /// + /// 原轨迹内容 + /// + public string? OriginTrackContent { get; set; } + + /// + /// 原轨迹报文 + /// + public string? OriginTrackData { get; set; } + /// /// 表示订单是否完成(只由轨迹刷新配置决定) /// tips:能够使得IsCompleted为true的点,全局只有一个:轨迹刷新 diff --git a/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs b/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs index d04c0fa2..8928ae11 100644 --- a/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs +++ b/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs @@ -12,6 +12,14 @@ public interface ITrackPushCacheService /// Task?> GetPushContentConfigsAsync(int subSystemId, int customId); + /// + /// 设置服务商拉取配置缓存 + /// + /// + /// + /// + Task?> SetPushContentConfigsAsync(int subSystemId, int customId); + /// /// 获取服务商拉取配置 /// @@ -33,14 +41,4 @@ public interface ITrackPushCacheService Task IsValidPushAsync(int subSystemId, int customId, string? latestPushTrackCode, string? trackCode); - - /// - /// 设置推送配置缓存 - /// - /// - /// 子系统id - /// 客户id - /// - Task?> SetPushContentConfigsAsync(int? id = null, int? subSystemId = null, - int? customId = null); } \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Services/ITrackService.cs b/src/SJZY.Track.Application.Contract/Services/ITrackService.cs index 31dae617..904f834d 100644 --- a/src/SJZY.Track.Application.Contract/Services/ITrackService.cs +++ b/src/SJZY.Track.Application.Contract/Services/ITrackService.cs @@ -31,5 +31,5 @@ public interface ITrackService : IRemoteService /// /// /// - Task> QueryAsync(GetTrackInput input); + Task QueryAsync(GetTrackInput input); } \ No newline at end of file diff --git a/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs index 8befae94..dbe6b8f6 100644 --- a/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs +++ b/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs @@ -1,8 +1,10 @@ using AutoMapper; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Track.Application.Contract.Dtos.ProvideServices; +using SJZY.Track.Application.Contract.Dtos.TrackOrder; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; +using SJZY.Track.Domain.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Dtos.Order; using SJZY.Track.Domain.Enums; using Volo.Abp.AutoMapper; @@ -34,6 +36,8 @@ public class OrderAutoMapperProfile : Profile .ForMember(dest => dest.Content, opt => opt.MapFrom(m => m.TrackContent)) .ForMember(dest => dest.EnContent, opt => opt.MapFrom(m => m.TrackEnContent)) .ForMember(dest => dest.TrackTimeZoneValue, opt => opt.MapFrom(m => m.TrackTimeZone)); + + CreateMap(MemberList.None); } /// diff --git a/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs b/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs index d6186324..06bdeca3 100644 --- a/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs +++ b/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs @@ -20,8 +20,9 @@ public class CapFilter : SubscribeFilter { context.DeliverMessage.Headers["sjzy-receive-time"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"); - // 轨迹刷新不做幂等 - if (context.DeliverMessage.Headers["cap-msg-name"]!.EndsWith(GlobalConst.TrackRefreshSubscribe)) + // 轨迹增删改要做幂等 + if (!context.DeliverMessage.Headers["cap-msg-name"] + .IsIn(GlobalConst.TrackUpsertSubscribe, GlobalConst.TrackDeleteSubscribe)) return Task.CompletedTask; // 本地调试不做幂等 diff --git a/src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs b/src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs index 2d8a0ef5..37daa472 100644 --- a/src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs @@ -1,6 +1,5 @@ using DotNetCore.CAP; using SJZY.Track.Application.Contract.Events; -using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Consts; using Volo.Abp.DependencyInjection; @@ -11,14 +10,11 @@ public class OrderLinkAfterFillTrackHandler : ITransientDependency, ICapSubscrib { private readonly ITrackDetailsRepository _trackDetailsRepository; private readonly ICapPublisher _capPublisher; - private readonly IOrderRepository _orderRepository; - public OrderLinkAfterFillTrackHandler(ITrackDetailsRepository trackDetailsRepository, ICapPublisher capPublisher, - IOrderRepository orderRepository) + public OrderLinkAfterFillTrackHandler(ITrackDetailsRepository trackDetailsRepository, ICapPublisher capPublisher) { _trackDetailsRepository = trackDetailsRepository; _capPublisher = capPublisher; - _orderRepository = orderRepository; } [CapSubscribe(GlobalConst.OrderLinkAfterFillTrack)] diff --git a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs index e95906da..a9a207e9 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs @@ -1,5 +1,5 @@ using DotNetCore.CAP; -using Newtonsoft.Json.Linq; +using Newtonsoft.Json; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.InterfaceRelay.Application.Contracts; using SJZY.Track.Application.Contract.Dtos.TrackPush; @@ -39,9 +39,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { x.SubSystemId, x.LatestPushTrackCode, x.QuestionType, x.CustomId }); - if (order == null || order.QuestionType == (int)TrackProblemType.Error) return; // 是否通知? - - TrackPushContentConfigDto? config; + if (order == null) return; var log = new TrackPushRecordIndex { @@ -58,6 +56,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe CreateTime = DateTime.Now }; + TrackPushContentConfigDto? config = null; + switch (@event.OptionType) { case OptionType.无: @@ -65,9 +65,16 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe case OptionType.新增: if (@event.OperationMan == null) { - // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行 - config = await _trackPushCacheService.IsValidPushAsync(order.SubSystemId, order.CustomId, - order.LatestPushTrackCode, @event.TrackCode); + if (order.QuestionType != (int)TrackProblemType.Error) + { + // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行 + config = await _trackPushCacheService.IsValidPushAsync(order.SubSystemId, order.CustomId, + order.LatestPushTrackCode, @event.TrackCode); + if (config is not { IsAutoPush: true }) + { + config = null; + } + } } else { @@ -132,45 +139,50 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe // tips:只有新增会影响推送进度? order.LatestPushTrackCode = dto.TrackCode; order.LatestPushTime = DateTime.Now; + await _orderRepository.UpdateColumnAsync(order, x => new + { + x.LatestPushTrackCode, x.LatestPushTime, x.QuestionType, x.LatestPushError + }); + return; } } await _orderRepository.UpdateColumnAsync(order, x => new { - x.LatestPushTrackCode, x.QuestionType, x.LatestPushError, x.LatestPushTime + x.QuestionType, x.LatestPushError }); } private async Task DoAddAsync(TrackPushEvent @event, TrackPushContentConfigDto config, TrackPushRecordIndex log) { - var track = new + var track = new TrackItem { // 推真实的发生地和发生时间(时间是计算后的) - location = @event.TrackPlace, - date = @event.TrackTime.AddHours( + Location = @event.TrackPlace, + Date = @event.TrackTime.AddHours( config.TrackTimeZone ?? @event.TrackTimeZone - @event.TrackTimeZone), - timeZone = config.TrackTimeZone ?? @event.TrackTimeZone, - description = config.TrackEnContentValue, - description_cn = config.TrackContentValue, - code = config.TrackContentCodeValue, - status = config.TrackStatusValue, - extra = config.ExpandFieldsValue + TimeZone = config.TrackTimeZone ?? @event.TrackTimeZone, + Description = config.TrackEnContentValue, + DescriptionCn = config.TrackContentValue, + Code = config.TrackContentCodeValue, + Status = config.TrackStatusValue, + Extra = config.ExpandFieldsValue }; - JObject body = JObject.FromObject(new + var body = new TrackPushInput() { - orderNo = @event.OrderNo, - data = new[] { track } - }); + OrderNo = @event.OrderNo, + }; + body.Data.Add(track); if (config.IsAllPush) { var history = await _trackPushRecordsRepository.GetLatestTrackPushRecordAsync(@event.OrderId); if (history != default) { - body = JObject.Parse(history.PushContent); - ((JArray)body["data"]!).Add(JObject.FromObject(track)); + body = JsonConvert.DeserializeObject(history.PushContent); + body!.Data.Add(track); } } @@ -178,6 +190,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe config.ServiceProviderCode, body); log.PushContent = body.ToJson(); + log.IsSuccess = res.Code == InterfaceRelayConst.SuccessCode; log.RequestId = res.RequestId; log.Message = res.Msg; diff --git a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs index b4bfe207..61431b30 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs @@ -218,6 +218,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe OrderType = context.OrderType, OrderNo = context.OrderNo, ServiceProviderName = context.ServiceProviderName, + OriginTrackData = JsonConvert.SerializeObject(trackToken), IsCompleted = matchedContentConfig.IsCompleted, SubSystemId = context.SubSystemId, TrackCode = matchedContentConfig.TrackContentCode, @@ -225,6 +226,11 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe TrackTime = trackTime ?? DateTime.Now, TrackTimeZone = trackTimeZone ?? matchedContentConfig.TrackTimeZoneValue ?? 8 }; + if (paramConfig.TrackContentName != null) + { + trackUpsertEvent.OriginTrackContent = trackToken[paramConfig.TrackContentName]?.Value(); + } + await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, trackUpsertEvent); } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs index 41ce263b..105ef588 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs @@ -131,6 +131,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackTime = @event.TrackTime, TrackTimeZone = @event.TrackTimeZone, ServiceProviderName = @event.ServiceProviderName, + OriginTrackContent = @event.OriginTrackContent, + OriginTrackData = @event.OriginTrackData, IsCanDelete = false, CreateUser = @event.OperationMan ?? GlobalConst.SystemUser, CreateTime = DateTime.Now diff --git a/src/SJZY.Track.Application/SJZY.Track.Application.csproj b/src/SJZY.Track.Application/SJZY.Track.Application.csproj index 172e83f5..99912fb3 100644 --- a/src/SJZY.Track.Application/SJZY.Track.Application.csproj +++ b/src/SJZY.Track.Application/SJZY.Track.Application.csproj @@ -12,7 +12,7 @@ - + diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs index d7b0bc94..7cf315b2 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs @@ -64,7 +64,7 @@ public class TrackPullService : ApplicationService var attach = Base64Helper.SerializeObject(group.Key); // 批量获取轨迹 - await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( + var _ = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( "A012", serviceProviderCode, data, GlobalConst.TrackRefreshSubscribe, attach); } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs index 35237196..74f4e52f 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs @@ -17,7 +17,7 @@ public partial class TrackService /// /// [HttpPost("Track/Query")] - public async Task> QueryAsync(GetTrackInput input) + public async Task QueryAsync(GetTrackInput input) { if (input.OrderNos.Count > 500) { @@ -39,6 +39,7 @@ public partial class TrackService Code = x.TrackCode, Status = x.TrackStatus, Content = x.TrackContent, + OriginContent = x.OriginTrackContent, Location = x.TrackPlace, Time = x.TrackTime.AddHours(input.TimeZone ?? 8 - x.TrackTimeZone), TimeZone = input.TimeZone ?? 8 @@ -49,11 +50,34 @@ public partial class TrackService await TrackDetailSort(res, input); - return res; + return new UnifyResultDto(true, res, "操作成功"); } private async Task TrackDetailSort(List list, GetTrackInput input) { + var orderTemplates = await _provideQueries + .GetOrderTemplateLinksAsync(input.OrderType, input.OrderNos); + var distinctTemplateIds = orderTemplates.Select(x => x.TemplateId).Distinct().ToList(); + var templateContent = await _provideQueries.GetOrderedTrackCodesAsync(distinctTemplateIds); + + list.ForEach(item => + { + var codes = new List(); + // 多模板拼接显示 + foreach (var orderTemplate in orderTemplates.Where(x => x.OrderNo == item.OrderNo)) + { + codes.AddRange(templateContent + .Where(t => t.TemplateId == orderTemplate.TemplateId) // 按模板 + .Where(t => t.IsExternal) // 过滤不对外的 + .Select(t => t.Code)); + } + + item.TrackDetails = item.TrackDetails + .Where(x => codes.Contains(x.Code)) // 剔除不在模板内容中的元素 + .OrderBy(x => codes.IndexOf(x.Code)) // 按照在模板内容的位置排序 + .ToList(); + }); + switch (input.SortMethod) { case SortMethod.ByTrackTime: @@ -64,30 +88,21 @@ public partial class TrackService list.ForEach(item => item.TrackDetails.Sort((a, b) => b.Time.CompareTo(a.Time))); break; case SortMethod.ByTemplate: - var orderTemplates = await _provideQueries - .GetOrderTemplateLinksAsync(input.OrderType, input.OrderNos); - var distinctTemplateIds = orderTemplates.Select(x => x.TemplateId).Distinct().ToList(); - var templateContent = await _provideQueries.GetOrderedTrackCodesAsync(distinctTemplateIds); - list.ForEach(item => - { - var codes = new List(); - // 多模板拼接显示 - foreach (var orderTemplate in orderTemplates.Where(x => x.OrderNo == item.OrderNo)) - { - codes.AddRange(templateContent - .Where(t => t.TemplateId == orderTemplate.TemplateId) // 按模板 - .Where(t => t.IsExternal) // 过滤不对外的 - .Select(t => t.Code)); - } - - item.TrackDetails = item.TrackDetails - .Where(x => codes.Contains(x.Code)) // 剔除不在模板内容中的元素 - .OrderBy(x => codes.IndexOf(x.Code)) // 按照在模板内容的位置排序 - .ToList(); - }); break; default: throw new ArgumentOutOfRangeException(nameof(input.SortMethod), input.SortMethod, "不支持的排序方式"); } + + // 显示原轨迹 + list.ForEach(item => + { + item.TrackDetails.ForEach(track => + { + if (templateContent.First(x => x.Code == track.Code).ShowOrigin) + { + track.Content = track.OriginContent; + } + }); + }); } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index 657cc671..9ed8374e 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -59,6 +59,8 @@ public class TrackContentService : ApplicationService } var dto = ObjectMapper.Map(detailInfo); + + if (dto.TrackFlagId == 0) dto.TrackFlagId = null; return new UnifyResultDto("200", "", dto); } diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index 5f3c1179..477456cb 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -160,8 +160,20 @@ public class TrackOrderService : ApplicationService /// /// 订单id [HttpGet("GetTrackPushRecords")] - public async Task> GetTrackPushRecordsAsync(int orderId) + public async Task> GetTrackPushRecordsAsync(int orderId) { - return await _trackPushRecordsRepository.GetTrackPushRecordsAsync(orderId); + var records = await _trackPushRecordsRepository.GetTrackPushRecordsAsync(orderId); + + var res = ObjectMapper.Map, List>(records); + + res.ForEach(x => + { + int hours = (int)x.TrackTimeZone; // 提取整数部分作为小时 + int minutes = (int)((x.TrackTimeZone - hours) * 60); // 将小数部分乘以 60 转换为分钟 + x.TrackGTMTimeZone = + $"GTM {(x.TrackTimeZone >= 0 ? "+" : "-")}{new TimeSpan(hours, minutes, 0).ToString().RemovePostFix(":00")}"; + }); + + return res; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs index 88d6b079..e5d413f4 100644 --- a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs +++ b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs @@ -1,5 +1,4 @@ -using System.Linq.Expressions; -using SJZY.Expand.ABP.Core; +using SJZY.Expand.ABP.Core; using SJZY.Track.Application.Contract.Dtos.TrackPush; using SJZY.Track.Application.Contract.Services; using SJZY.Track.Domain.Aggregates.TrackPushAggregate; @@ -22,11 +21,25 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc public async Task?> GetPushContentConfigsAsync(int subSystemId, int customId) { - var data = await RedisHelper.Client.GetAsync>( - TrackPushContentKey(subSystemId, customId)); + var exists = await RedisHelper.Client.ExistsAsync(TrackPushContentKey(subSystemId, customId)); + if (exists) + { + return await RedisHelper.Client.GetAsync>( + TrackPushContentKey(subSystemId, customId)); + } - data ??= await SetPushContentConfigsAsync(subSystemId: subSystemId, customId: customId); + return await SetPushContentConfigsAsync(subSystemId, customId); + } + public async Task?> SetPushContentConfigsAsync(int subSystemId, int customId) + { + // maybe is null + var data = await DoGetPushContentConfigsAsync(subSystemId, customId); + var ttl = 3 * 24 * 60 * 60; + if (data == null) ttl = 5; + // ttl 3days + await RedisHelper.Client.SetAsync(TrackPushContentKey(subSystemId, customId), + data, ttl); return data; } @@ -55,26 +68,26 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc // find swap cache.FirstOrDefault(x => x.TrackCode == cache[idx + 1].SwapTrackCode); - return matched != null && matched.TrackCode == trackCode && matched.IsAutoPush ? matched : default; + return matched != null && matched.TrackCode == trackCode ? matched : default; } - public async Task?> SetPushContentConfigsAsync(int? id = null, - int? subSystemId = null, - int? customId = null) + private async Task?> DoGetPushContentConfigsAsync(int subSystemId, int customId) { - Expression> exp = x => true; - if (id.HasValue) exp = x => x.Id == id; - else if (subSystemId.HasValue && customId.HasValue) - exp = x => x.SubSystemId == subSystemId && x.CustomId == customId; - - var trackPushConfig = await _trackPushConfigRepository.GetFirstAsync(exp, x => new + var trackPushConfig = await _trackPushConfigRepository.GetFirstAsync( + x => x.SubSystemId == subSystemId && x.CustomId == customId, x => new + { + x.Id, x.IsAutoPush, x.IsAllPush, x.IsCanDelete, x.IsCanUpdate, x.SubSystemId, x.CustomId + }); + if (trackPushConfig == null) { - x.Id, x.IsAutoPush, x.IsAllPush, x.IsCanDelete, x.IsCanUpdate, x.SubSystemId, x.CustomId - }); - if (trackPushConfig == null) return null; + return null; + } var trackPushContentList = await _trackPushConfigRepository.GetContentListAsync(trackPushConfig.Id); - if (trackPushContentList.Count == 0) return null; + if (trackPushContentList.Count == 0) + { + return null; + } // tips:hot path,auto mapper性能不如原生 var res = trackPushContentList.Select(item => new TrackPushContentConfigDto @@ -95,9 +108,6 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc ExpandFieldsValue = item.ExpandFieldsValue, }).ToList(); - await RedisHelper.Client.SetAsync(TrackPushContentKey(trackPushConfig.SubSystemId, trackPushConfig.CustomId), - res); - return res; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs b/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs index 5225e8db..f7d69e1d 100644 --- a/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs +++ b/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs @@ -95,12 +95,17 @@ public class TrackPushService : ApplicationService throw new BusinessException(message: _stringLocalizer["IsTrackPushConfigAny"]); } + using var ts = TransactionScopeHelper.Create(); + switch (input.Options) { case OptionTypeNoNull.新增: { var trackPushEntity = ObjectMapper.Map(input); + await _trackPushConfigRepository.InsertReturnIdentityAsync(trackPushEntity); + await _trackPushCacheService.SetPushContentConfigsAsync(trackPushEntity.SubSystemId, + trackPushEntity.CustomId); } break; @@ -111,21 +116,19 @@ public class TrackPushService : ApplicationService ObjectMapper.Map(input, oldTrackPushEntity); await _trackPushConfigRepository.UpdateAsync(oldTrackPushEntity); - - if (input.IsAutoPush!.Value) await _trackPushCacheService.SetPushContentConfigsAsync(input.Id); + await _trackPushCacheService.SetPushContentConfigsAsync(oldTrackPushEntity.SubSystemId, + oldTrackPushEntity.CustomId); } break; case OptionTypeNoNull.删除: { - _ = await _trackPushConfigRepository.GetFirstAsync(x => x.Id == input.Id) ?? - throw new BusinessException(message: _stringLocalizer["NotFindData"]); + var entity = await _trackPushConfigRepository.GetFirstAsync(x => x.Id == input.Id) ?? + throw new BusinessException(message: _stringLocalizer["NotFindData"]); - using var ts = TransactionScopeHelper.Create(); await _trackPushConfigRepository.SoftDeleteAsync(x => x.Id == input.Id); await _trackPushConfigRepository.SoftDeleteContentAsync(x => x.TrackPushConfigId == input.Id); - - ts.Complete(); + await _trackPushCacheService.SetPushContentConfigsAsync(entity.SubSystemId, entity.CustomId); } break; @@ -134,6 +137,7 @@ public class TrackPushService : ApplicationService nameof(EditTrackPushConfigInput.Options)]); } + ts.Complete(); return true; } @@ -172,6 +176,10 @@ public class TrackPushService : ApplicationService throw new BusinessException(message: _stringLocalizer["IsTrackPushEnContentValueAny"]); } + var trackPushConfigId = input.TrackPushConfigId; + + using var ts = TransactionScopeHelper.Create(); + switch (input.Options) { case OptionTypeNoNull.新增: @@ -181,10 +189,7 @@ public class TrackPushService : ApplicationService var entity = ObjectMapper.Map(input); entity.Sort = maxSort + 1; - await _trackPushConfigRepository.InsertContentAsync(entity); - await _trackPushCacheService.SetPushContentConfigsAsync(input.TrackPushConfigId); - break; } @@ -194,10 +199,7 @@ public class TrackPushService : ApplicationService throw new BusinessException(message: _stringLocalizer["NotFindData"]); ObjectMapper.Map(input, entity); - await _trackPushConfigRepository.UpdateContentAsync(entity); - await _trackPushCacheService.SetPushContentConfigsAsync(entity.TrackPushConfigId); - break; } @@ -205,18 +207,10 @@ public class TrackPushService : ApplicationService { var entity = await _trackPushConfigRepository.GetContentByIdAsync(input.Id!.Value) ?? throw new BusinessException(message: _stringLocalizer["NotFindData"]); - - using (var ts = TransactionScopeHelper.Create()) - { - await _trackPushConfigRepository.SoftDeleteContentAsync(x => x.Id == input.Id); - await _trackPushConfigRepository.UpdateContentAsync(x => x.Sort == x.Sort - 1, - x => x.TrackPushConfigId == entity.TrackPushConfigId && x.Sort > entity.Sort); - - ts.Complete(); - } - - await _trackPushCacheService.SetPushContentConfigsAsync(entity.TrackPushConfigId); - + trackPushConfigId = entity.TrackPushConfigId; + await _trackPushConfigRepository.SoftDeleteContentAsync(x => x.Id == input.Id); + await _trackPushConfigRepository.UpdateContentAsync(x => x.Sort == x.Sort - 1, + x => x.TrackPushConfigId == entity.TrackPushConfigId && x.Sort > entity.Sort); break; } @@ -225,6 +219,14 @@ public class TrackPushService : ApplicationService nameof(EditTrackPushContentInput.Options)]); } + var pushConfig = await _trackPushConfigRepository.GetFirstAsync(x => x.Id == trackPushConfigId); + if (pushConfig != null) + { + await _trackPushCacheService.SetPushContentConfigsAsync(pushConfig.SubSystemId, pushConfig.CustomId); + } + + ts.Complete(); + return true; } @@ -247,8 +249,19 @@ public class TrackPushService : ApplicationService if (trackPushContentEntities.Count > 0) { + using var ts = TransactionScopeHelper.Create(); + await _trackPushConfigRepository.UpdateContentRangeAsync(trackPushContentEntities); - await _trackPushCacheService.SetPushContentConfigsAsync(trackPushContentEntities[0].TrackPushConfigId); + + var pushConfig = + await _trackPushConfigRepository.GetFirstAsync(x => + x.Id == trackPushContentEntities[0].TrackPushConfigId); + if (pushConfig != null) + { + await _trackPushCacheService.SetPushContentConfigsAsync(pushConfig.SubSystemId, pushConfig.CustomId); + } + + ts.Complete(); } return true; diff --git a/src/SJZY.Track.Application/Services/TrackTemplates/ITrackTemplateService.cs b/src/SJZY.Track.Application/Services/TrackTemplates/ITrackTemplateService.cs deleted file mode 100644 index f6e29107..00000000 --- a/src/SJZY.Track.Application/Services/TrackTemplates/ITrackTemplateService.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace SJZY.Track.Application.Services.TrackTemplates -{ - public interface ITrackTemplateService - { - - } -} diff --git a/src/SJZY.Track.Domain/Dtos/TrackTemplate/OrderedTrackCodeDto.cs b/src/SJZY.Track.Domain/Dtos/TrackTemplate/OrderedTrackCodeDto.cs index cb31744d..43805324 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackTemplate/OrderedTrackCodeDto.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackTemplate/OrderedTrackCodeDto.cs @@ -16,4 +16,9 @@ public class OrderedTrackCodeDto /// 是否对外 /// public bool IsExternal { get; set; } + + /// + /// 显示原轨迹 + /// + public bool ShowOrigin { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs index cce3c885..7f144688 100644 --- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs +++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs @@ -20,20 +20,6 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, Context = SqlsugarScopeBasic.GetContextSafely("default"); } - public async Task> GetOrderTemplateLinksAsync(int orderType, - params string[] orderNumbers) - { - return await Context.Queryable() - .LeftJoin((a, b) => a.Id == b.OrderId) - .Where(a => a.OrderType == orderType && orderNumbers.Contains(a.OrderNo)) - .Select((a, b) => new OrderTemplateLinkDto - { - OrderNo = a.OrderNo, - TemplateId = b.TrackTemplateId - }) - .ToListAsync(); - } - public async Task> GetOrderTemplateLinksAsync(int orderType, List orderNumbers) { return await Context.Queryable() @@ -49,15 +35,17 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, public async Task> GetOrderedTrackCodesAsync(List templateIds) { - return await Context.Queryable() - .LeftJoin((a, b) => a.TrackContentId == b.Id) - .Where(a => templateIds.Contains(a.TrackTemplateId)) - .OrderBy(a => a.Sort) - .Select((a, b) => new OrderedTrackCodeDto + return await Context.Queryable() + .LeftJoin((a, b) => a.Id == b.TrackTemplateId) + .LeftJoin((a, b, c) => b.TrackContentId == c.Id) + .Where(a => templateIds.Contains(a.Id)) + .OrderBy((a, b) => b.Sort) + .Select((a, b, c) => new OrderedTrackCodeDto { - TemplateId = a.TrackTemplateId, - Code = b.Code, - IsExternal = a.IsExternal + TemplateId = a.Id, + ShowOrigin = a.ShowOrigin, + Code = c.Code, + IsExternal = b.IsExternal }) .ToListAsync(); } diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs index 1229eec7..03b3c7c9 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs @@ -85,6 +85,7 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract 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.TrackTimeZone)