From 8f0f40cc56130280f35b778719aaedcae40a47a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Thu, 14 Mar 2024 11:49:24 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackPull/TrackPullConfigDto.cs | 17 +- .../TrackPullParamWithContentConfigDto.cs | 8 + .../Services/ITrackPullCacheService.cs | 14 +- .../EventHandlers/TrackRefreshEventHandler.cs | 19 +- .../UpdateOrderTrackEventHandler.cs | 2 + .../ProvideServices/TrackPushPullService.cs | 55 ++++- .../Services/TrackOrders/TrackOrderService.cs | 215 +++++++++--------- .../TrackPull/TrackPullCacheService.cs | 43 ++-- .../TrackPush/TrackPushCacheService.cs | 2 +- .../OrderAggregate/IOrderRepository.cs | 18 +- ...emplateVO.cs => OrderServiceProviderVO.cs} | 4 +- src/SJZY.Track.Domain/GlobalConst.cs | 14 +- .../Queries/ITrackOrderQueries.cs | 13 ++ .../Queries/TrackOrderQueries.cs | 117 ++++++++++ .../Repositories/OrderRepository.cs | 198 ++-------------- 15 files changed, 404 insertions(+), 335 deletions(-) create mode 100644 src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullParamWithContentConfigDto.cs rename src/SJZY.Track.Domain/Dtos/Order/{OrderTemplateVO.cs => OrderServiceProviderVO.cs} (87%) create mode 100644 src/SJZY.Track.Domain/Queries/ITrackOrderQueries.cs create mode 100644 src/SJZY.Track.Repository/Queries/TrackOrderQueries.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullConfigDto.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullConfigDto.cs index f6020d9f..10f78964 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullConfigDto.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullConfigDto.cs @@ -1,8 +1,19 @@ -namespace SJZY.Track.Application.Contract.Dtos.TrackPull; +namespace SJZY.Track.Application.Contract.Dtos.TrackPull; public class TrackPullConfigDto { - public TrackPullParamConfigDto ParamConfig { get; set; } + /// + /// 服务商拉取频率(分钟) + /// + public int PullInterval { get; set; } - public List ContentConfigs { get; set; } + /// + /// 服务商id + /// + public int ServiceProviderId { get; set; } + + /// + /// 子系统id + /// + public int SubSystemId { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullParamWithContentConfigDto.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullParamWithContentConfigDto.cs new file mode 100644 index 00000000..ba38457f --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullParamWithContentConfigDto.cs @@ -0,0 +1,8 @@ +namespace SJZY.Track.Application.Contract.Dtos.TrackPull; + +public class TrackPullParamWithContentConfigDto +{ + public TrackPullParamConfigDto ParamConfig { get; set; } + + public List ContentConfigs { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Services/ITrackPullCacheService.cs b/src/SJZY.Track.Application.Contract/Services/ITrackPullCacheService.cs index 7eb93992..486d4157 100644 --- a/src/SJZY.Track.Application.Contract/Services/ITrackPullCacheService.cs +++ b/src/SJZY.Track.Application.Contract/Services/ITrackPullCacheService.cs @@ -4,13 +4,22 @@ namespace SJZY.Track.Application.Contract.Services; public interface ITrackPullCacheService { + string TrackPullKey(int subSystemId, int serviceProviderId); + string TrackPullContentKey(int subSystemId, int serviceProviderId); + + /// + /// 获取所有拉取配置 + /// + /// + Task> GetAllPullConfigsAsync(); + /// /// 获取服务商拉取配置 /// /// 子系统id /// 服务商id /// - Task GetPullConfigAsync(int subSystemId, int serviceProviderId); + Task GetPullParamWithContentConfigAsync(int subSystemId, int serviceProviderId); /// /// 设置拉取配置缓存 @@ -19,5 +28,6 @@ public interface ITrackPullCacheService /// 子系统id /// 服务商id /// - Task SetPullConfigAsync(int? id = null, int? subSystemId = null, int? serviceProviderId = null); + Task SetPullConfigAsync(int? id = null, int? subSystemId = null, + int? serviceProviderId = null); } \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs index f708877e..b3864e55 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs @@ -34,7 +34,9 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe // tips:attach返回的是服务商id,必有 var attach = JsonConvert.DeserializeObject(@event.Attach); if (attach is null) return; - var config = await _trackPullCacheService.GetPullConfigAsync(attach.SubSystemId, attach.ServiceProviderId); + var config = + await _trackPullCacheService.GetPullParamWithContentConfigAsync(attach.SubSystemId, + attach.ServiceProviderId); var data = JObject.Parse(@event.Data.ToString()!); var orderToken = data[config.ParamConfig.OrderPath]; @@ -51,9 +53,10 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe } } - private async Task HandleOrderAsync(JToken orderToken, TrackPullConfigDto config, int orderType) + private async Task HandleOrderAsync(JToken orderToken, TrackPullParamWithContentConfigDto paramWithContentConfig, + int orderType) { - var paramConfig = config.ParamConfig; + var paramConfig = paramWithContentConfig.ParamConfig; var orderNo = orderToken[paramConfig.OrderNoName]?.Value(); if (orderNo.IsNullOrWhiteSpace()) return; @@ -80,21 +83,21 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe { foreach (var item in trackTokens) { - await HandleTrackAsync(item, config, trackUpsertEvent); + await HandleTrackAsync(item, paramWithContentConfig, trackUpsertEvent); } } else if (orderToken is JObject) { - await HandleTrackAsync(orderToken, config, trackUpsertEvent); + await HandleTrackAsync(orderToken, paramWithContentConfig, trackUpsertEvent); } } - private async Task HandleTrackAsync(JToken trackToken, TrackPullConfigDto config, + private async Task HandleTrackAsync(JToken trackToken, TrackPullParamWithContentConfigDto paramWithContentConfig, TrackUpsertEvent @event) { var trackUpsertEvent = @event.DeepCopy(); - var paramConfig = config.ParamConfig; - var contentConfigs = config.ContentConfigs; + var paramConfig = paramWithContentConfig.ParamConfig; + var contentConfigs = paramWithContentConfig.ContentConfigs; TrackPullContentConfigDto? matchedContentConfig = null; // 1、匹配轨迹代码 diff --git a/src/SJZY.Track.Application/EventHandlers/UpdateOrderTrackEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/UpdateOrderTrackEventHandler.cs index 72316cef..414a4afd 100644 --- a/src/SJZY.Track.Application/EventHandlers/UpdateOrderTrackEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/UpdateOrderTrackEventHandler.cs @@ -25,7 +25,9 @@ public class UpdateOrderTrackEventHandler : ITransientDependency, ICapSubscribe if (@event.TrackTime == default) { if (order.LatestTrackTime == null) return; + // 删除全部轨迹导致的重置行为 + // tips:订单是支持从已完成态到未完成态的 order.ResetTrackInfo(); } else if (order.LatestTrackTime != null && diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushPullService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushPullService.cs index 1401b5b8..faa64a0f 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushPullService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushPullService.cs @@ -1,7 +1,9 @@ using Newtonsoft.Json; +using SJZY.Expand.ABP.Core; using SJZY.InterfaceRelay.Application.Contracts; using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Dtos.TrackPull; +using SJZY.Track.Application.Contract.Services; using SJZY.Track.Domain.Aggregates.OrderAggregate; using Volo.Abp.Http.Client.DynamicProxying; @@ -16,22 +18,26 @@ public class TrackPushPullService : ApplicationService { private readonly IOrderRepository _orderRepository; private readonly IHttpClientProxy _httpClientProxy; + private readonly ITrackPullCacheService _trackPullCacheService; public TrackPushPullService(IOrderRepository orderRepository, - IHttpClientProxy httpClientProxy) + IHttpClientProxy httpClientProxy, + ITrackPullCacheService trackPullCacheService) { _orderRepository = orderRepository; _httpClientProxy = httpClientProxy; + _trackPullCacheService = trackPullCacheService; } /// - /// 刷新轨迹 + /// 手动刷新轨迹 /// /// /// [HttpPost("Track/Refresh")] public async Task RefreshTrackAsync(RefreshTrackInput input) { + // todo:罚时? if (input.OrderNos.Count == 0) { throw new BusinessException(message: "订单号数组不能为空"); @@ -39,7 +45,8 @@ public class TrackPushPullService : ApplicationService input.OrderNos = input.OrderNos.Distinct().ToList(); - var orderTemplates = await _orderRepository.GetOrderTemplatesAsync(input.OrderNos); + // 这里没有区分订单类型,就算的不同类型的单一起刷新了也无所谓 + var orderTemplates = await _orderRepository.FindServiceProviderByOrderAsync(input.OrderNos); foreach (var group in orderTemplates.GroupBy(x => new TrackRefreshAttach(x.ServiceProviderId, x.ServiceProviderCode, x.SubSystemId, x.OrderType))) @@ -50,11 +57,51 @@ public class TrackPushPullService : ApplicationService }).ToList(); // 批量获取轨迹 - var requestId = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( + await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( "A012", group.Key.ServiceProviderCode, data, GlobalConst.TrackRefreshSubscribe, JsonConvert.SerializeObject(group.Key)); } + return true; + } + + /// + /// 定时任务刷新轨迹 + /// + /// + [HttpPost("Track/RefreshForTask")] + public async Task RefreshTrackAsync() + { + var configs = await _trackPullCacheService.GetAllPullConfigsAsync(); + foreach (var config in configs) + { + var redisKey = _trackPullCacheService.TrackPullKey(config.SubSystemId, config.ServiceProviderId); + if (await RedisHelper.Client.ExistsAsync(redisKey)) + { + continue; + } + + var orders = await _orderRepository.FindOrderByServiceProviderAsync(config.ServiceProviderId); + + foreach (var group in orders.GroupBy(x => + new TrackRefreshAttach(x.ServiceProviderId, x.ServiceProviderCode, x.SubSystemId, + x.OrderType))) + { + var data = group.Select(x => new + { + x.OrderNo + }).ToList(); + + // 批量获取轨迹 + await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( + "A012", group.Key.ServiceProviderCode, data, + GlobalConst.TrackRefreshSubscribe, JsonConvert.SerializeObject(group.Key)); + } + + await RedisHelper.Client.SetExAsync(redisKey, config.PullInterval * 60, 1); + } + + return true; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index 908d7227..06800fc0 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -1,115 +1,118 @@ using SJZY.Track.Application.Contract.Dtos.ProvideServices; -using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackContentAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Dtos.Order; using SJZY.Track.Domain.Dtos.TrackTemplate; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; +using SJZY.Track.Domain.Queries; -namespace SJZY.Track.Application.Services.TrackOrders +namespace SJZY.Track.Application.Services.TrackOrders; + +[ApiExplorerSettings(GroupName = "轨迹订单")] +[Route("/Track/Order")] +public class TrackOrderService : ApplicationService { - [ApiExplorerSettings(GroupName = "轨迹订单")] - [Route("/Track/Order")] - public class TrackOrderService : ApplicationService, ITransientDependency + private readonly ITrackOrderQueries _trackOrderQueries; + private readonly ITrackDetailsRepository _trackDetailsRepository; + private readonly ITrackContentRepository _trackContentRepository; + + public TrackOrderService( + ITrackOrderQueries trackOrderQueries, + ITrackDetailsRepository trackDetailsRepository, + ITrackContentRepository trackContentRepository + ) { - private readonly IOrderRepository _orderRepository; - private readonly ITrackDetailsRepository _trackDetailsRepository; - private readonly ITrackContentRepository _trackContentRepository; - - public TrackOrderService( - IOrderRepository orderRepository, - ITrackDetailsRepository trackDetailsRepository, - ITrackContentRepository trackContentRepository - ) - { - this._orderRepository=orderRepository; - this._trackDetailsRepository=trackDetailsRepository; - this._trackContentRepository=trackContentRepository; - } - - #region 轨迹订单明细 - /// - /// 根据轨迹订单id获取轨迹订单明细列表 - /// - /// - /// - [HttpPost("GetDetails")] - public async Task> GetOrderDetails(GetOrderDetailsInput input) - { - var trackDetails = await _trackDetailsRepository.GetListAsync(input.OrderId); - if (!trackDetails.IsNullOrEmpty()) - { - var list = ObjectMapper.Map, List>(trackDetails); - var trackCodes = list.Where(a => !a.Code.IsNullOrWhiteSpace()).Select(a => a.Code).Distinct().ToList(); - - var trackContents = await _trackContentRepository.GetTrackContentAttributeValue(new GetTemplateContentAttributeValueInputVO - { - SubSystemId =input.SubSystemId, - TrackTemplateIds = input.TrackTemplateIds, - TrackCodes=trackCodes - }); - input.TrackTemplateIds =input.TrackTemplateIds.Where(a => a>0).ToList(); - int id = 1; - list.ForEach(a => - { - a.Id = id++; - - var trackContentsOfTemplates = trackContents.Where(b => b.SubSystemId==input.SubSystemId && b.TrackCode==a.Code - && input.TrackTemplateIds.Contains(b.TrackTemplateId)); - GetTemplateContentAttributeValueVO trackContent = null; - var insertData = input.TrackTemplateIds.Intersect(trackContentsOfTemplates.Select(aa => aa.TrackTemplateId)).ToList(); - if (!insertData.IsNullOrEmpty()) - { - trackContent =trackContentsOfTemplates.FirstOrDefault(a => a.TrackTemplateId==insertData.FirstOrDefault()); - } - - if (trackContent!=null) - { - a.IsCanDelete=trackContent.IsCanDelete; - a.IsExternal = trackContent.IsExternal; - } - if (a.TrackTimeZoneValue==0f) - { - a.TrackTimeZone=$"GTM{" "}+00:00"; - } - else - { - // 将小数形式的小时转换为时区偏移量 - int hours = (int)a.TrackTimeZoneValue; // 提取整数部分作为小时 - int minutes = (int)((a.TrackTimeZoneValue - hours) * 60); // 将小数部分乘以 60 转换为分钟 - TimeSpan offset = new TimeSpan(hours, minutes, 0); - string timeZoneStr = offset.ToString(); - string flag = a.TrackTimeZoneValue>0f ? "+" : ""; - a.TrackTimeZone = $"GTM{" "}{flag}{timeZoneStr.RemovePostFix(":00")}"; - } - }); - return list; - } - - return new List(); - } - #endregion - - #region 轨迹订单列表 - /// - /// 获取分页的轨迹订单 - /// - /// - /// - [HttpPost("GetTrackOrderList")] - public async Task> GetPageTrackOrder(GetPageTrackOrderInput input) - { - var vo = ObjectMapper.Map(input); - var pageList = await _orderRepository.GetPageTrackOrder(vo); - var pageResultDto = - ObjectMapper.Map, UnifyPageResultDto>(pageList); - return pageResultDto; - } - #endregion + _trackOrderQueries = trackOrderQueries; + _trackDetailsRepository = trackDetailsRepository; + _trackContentRepository = trackContentRepository; } -} + + #region 轨迹订单明细 + + /// + /// 根据轨迹订单id获取轨迹订单明细列表 + /// + /// + /// + [HttpPost("GetDetails")] + public async Task> GetOrderDetails(GetOrderDetailsInput input) + { + var trackDetails = await _trackDetailsRepository.GetListAsync(input.OrderId); + if (!trackDetails.IsNullOrEmpty()) + { + var list = ObjectMapper.Map, List>(trackDetails); + var trackCodes = list.Where(a => !a.Code.IsNullOrWhiteSpace()).Select(a => a.Code).Distinct().ToList(); + + var trackContents = await _trackContentRepository.GetTrackContentAttributeValue( + new GetTemplateContentAttributeValueInputVO + { + SubSystemId = input.SubSystemId, + TrackTemplateIds = input.TrackTemplateIds, + TrackCodes = trackCodes + }); + input.TrackTemplateIds = input.TrackTemplateIds.Where(a => a > 0).ToList(); + int id = 1; + list.ForEach(a => + { + a.Id = id++; + + var trackContentsOfTemplates = trackContents.Where(b => b.SubSystemId == input.SubSystemId && + b.TrackCode == a.Code + && input.TrackTemplateIds.Contains( + b.TrackTemplateId)); + GetTemplateContentAttributeValueVO trackContent = null; + var insertData = input.TrackTemplateIds + .Intersect(trackContentsOfTemplates.Select(aa => aa.TrackTemplateId)).ToList(); + if (!insertData.IsNullOrEmpty()) + { + trackContent = + trackContentsOfTemplates.FirstOrDefault(a => a.TrackTemplateId == insertData.FirstOrDefault()); + } + + if (trackContent != null) + { + a.IsCanDelete = trackContent.IsCanDelete; + a.IsExternal = trackContent.IsExternal; + } + + if (a.TrackTimeZoneValue == 0f) + { + a.TrackTimeZone = $"GTM{" "}+00:00"; + } + else + { + // 将小数形式的小时转换为时区偏移量 + int hours = (int)a.TrackTimeZoneValue; // 提取整数部分作为小时 + int minutes = (int)((a.TrackTimeZoneValue - hours) * 60); // 将小数部分乘以 60 转换为分钟 + TimeSpan offset = new TimeSpan(hours, minutes, 0); + string timeZoneStr = offset.ToString(); + string flag = a.TrackTimeZoneValue > 0f ? "+" : ""; + a.TrackTimeZone = $"GTM{" "}{flag}{timeZoneStr.RemovePostFix(":00")}"; + } + }); + return list; + } + + return new List(); + } + + #endregion + + #region 轨迹订单列表 + + /// + /// 获取分页的轨迹订单 + /// + /// + /// + [HttpPost("GetTrackOrderList")] + public async Task> GetPageTrackOrder(GetPageTrackOrderInput input) + { + var vo = ObjectMapper.Map(input); + var pageList = await _trackOrderQueries.GetPageTrackOrder(vo); + var pageResultDto = + ObjectMapper.Map, UnifyPageResultDto>(pageList); + return pageResultDto; + } + + #endregion +} \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/TrackPull/TrackPullCacheService.cs b/src/SJZY.Track.Application/Services/TrackPull/TrackPullCacheService.cs index f54f366a..55351d80 100644 --- a/src/SJZY.Track.Application/Services/TrackPull/TrackPullCacheService.cs +++ b/src/SJZY.Track.Application/Services/TrackPull/TrackPullCacheService.cs @@ -1,28 +1,39 @@ -using SJZY.Expand.ABP.Core; +using System.Linq.Expressions; +using SJZY.Expand.ABP.Core; using SJZY.Track.Application.Contract.Dtos.TrackPull; using SJZY.Track.Application.Contract.Services; using SJZY.Track.Domain.Aggregates.TrackPullAggregate; using SJZY.Track.Domain.Dtos.TrackPull; -using System.Linq.Expressions; -using Volo.Abp.DependencyInjection; namespace SJZY.Track.Application.Services.TrackPull; -public class TrackPullCacheService : ApplicationService, ITrackPullCacheService, ITransientDependency +public class TrackPullCacheService : ApplicationService, ITrackPullCacheService { private readonly ITrackPullConfigRepository _trackPullConfigRepository; - private string RedisKey(int subSystemId, int serviceProviderId) => GlobalConst.TrackPushKeyPrefix + subSystemId + ":" + serviceProviderId; + public string TrackPullKey(int subSystemId, int serviceProviderId) => + $"{GlobalConst.TrackPullKeyPrefix}:{subSystemId}:{serviceProviderId}"; + + public string TrackPullContentKey(int subSystemId, int serviceProviderId) => + $"{GlobalConst.TrackPullContentKeyPrefix}:{subSystemId}:{serviceProviderId}"; public TrackPullCacheService(ITrackPullConfigRepository trackPullConfigRepository) { _trackPullConfigRepository = trackPullConfigRepository; } - [NonAction] - public async Task GetPullConfigAsync(int subSystemId, int serviceProviderId) + public Task> GetAllPullConfigsAsync() { - var data = await RedisHelper.Client.GetAsync(RedisKey(subSystemId, serviceProviderId)); + throw new NotImplementedException(); + } + + [NonAction] + public async Task GetPullParamWithContentConfigAsync(int subSystemId, + int serviceProviderId) + { + var data = await RedisHelper.Client.GetAsync(TrackPullContentKey( + subSystemId, + serviceProviderId)); data ??= await SetPullConfigAsync(subSystemId: subSystemId, serviceProviderId: serviceProviderId); @@ -30,9 +41,10 @@ public class TrackPullCacheService : ApplicationService, ITrackPullCacheService, } [NonAction] - public async Task SetPullConfigAsync(int? id = null, int? subSystemId = null, int? serviceProviderId = null) + public async Task SetPullConfigAsync(int? id = null, int? subSystemId = null, + int? serviceProviderId = null) { - var data = new TrackPullConfigDto(); + var data = new TrackPullParamWithContentConfigDto(); Expression> exp = x => true; if (id.HasValue) exp = x => x.Id == id; @@ -47,10 +59,15 @@ public class TrackPullCacheService : ApplicationService, ITrackPullCacheService, var trackPullContentList = await _trackPullConfigRepository.GetContentListCacheAsync(trackPullConfigEntity.Id); if (trackPullContentList.Count == 0) return data; - data.ParamConfig = ObjectMapper.Map(trackPullConfigDetail); - data.ContentConfigs = ObjectMapper.Map, List>(trackPullContentList); + data.ParamConfig = + ObjectMapper.Map(trackPullConfigDetail); + data.ContentConfigs = + ObjectMapper.Map, List>( + trackPullContentList); - await RedisHelper.Client.SetAsync(RedisKey(trackPullConfigEntity.SubSystemId, trackPullConfigEntity.ServiceProviderId), data, 86400); + await RedisHelper.Client.SetAsync( + TrackPullContentKey(trackPullConfigEntity.SubSystemId, trackPullConfigEntity.ServiceProviderId), data, + 86400); return data; } diff --git a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs index 62df4046..046ea943 100644 --- a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs +++ b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs @@ -10,7 +10,7 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc { private readonly IBasicQuery _trackPushConfigQuery; - private string RedisKey(int customId) => GlobalConst.TrackPushKeyPrefix + customId; + private string RedisKey(int customId) => $"{GlobalConst.TrackPushKeyPrefix}:{customId}"; public TrackPushCacheService(IBasicQuery trackPushConfigQuery) { diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs index 9e8d59eb..2f99ba3f 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs @@ -11,13 +11,6 @@ public interface IOrderRepository : IBasicRepository /// Task CreateOrderAsync(OrderEntity order); - /// - /// 获取分页的轨迹订单 - /// - /// - /// - Task> GetPageTrackOrder(GetPageTrackOrderInputVO input); - /// /// 更新订单 /// @@ -60,9 +53,16 @@ public interface IOrderRepository : IBasicRepository /// - /// 获取订单模板列表 + /// 根据订单模板找对应服务商 /// /// /// - Task> GetOrderTemplatesAsync(List orderNos); + Task> FindServiceProviderByOrderAsync(List orderNos); + + /// + /// 获取服务商下所有单(未完成的) + /// + /// + /// + Task> FindOrderByServiceProviderAsync(int serviceProvider); } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Order/OrderTemplateVO.cs b/src/SJZY.Track.Domain/Dtos/Order/OrderServiceProviderVO.cs similarity index 87% rename from src/SJZY.Track.Domain/Dtos/Order/OrderTemplateVO.cs rename to src/SJZY.Track.Domain/Dtos/Order/OrderServiceProviderVO.cs index 6fe7d2b5..36a46aa8 100644 --- a/src/SJZY.Track.Domain/Dtos/Order/OrderTemplateVO.cs +++ b/src/SJZY.Track.Domain/Dtos/Order/OrderServiceProviderVO.cs @@ -1,6 +1,6 @@ namespace SJZY.Track.Domain.Dtos.Order; -public class OrderTemplateVO +public class OrderServiceProviderVO { public string OrderNo { get; set; } = null!; @@ -9,8 +9,6 @@ public class OrderTemplateVO /// public int OrderType { get; set; } - public int TemplateId { get; set; } - public int ServiceProviderId { get; set; } /// diff --git a/src/SJZY.Track.Domain/GlobalConst.cs b/src/SJZY.Track.Domain/GlobalConst.cs index 629149a8..981ce249 100644 --- a/src/SJZY.Track.Domain/GlobalConst.cs +++ b/src/SJZY.Track.Domain/GlobalConst.cs @@ -27,11 +27,6 @@ public class GlobalConst /// public const string UpdateOrderTrackSubscribe = "SJZY.Track.UpdateOrderTrack"; - /// - /// 轨迹删除后触发更新订单轨迹 mq订阅名称 - /// - public const string DeleteTrackAfterUpdateOrderSubscribe = "SJZY.Track.DeleteTrackAfterUpdateOrder"; - /// /// 关联订单后补轨迹 mq订阅名称 /// @@ -40,10 +35,15 @@ public class GlobalConst /// /// 轨迹要推送的客户redis key前缀 /// - public const string TrackPushKeyPrefix = "TrackPush:"; + public const string TrackPushKeyPrefix = "TrackPush"; /// /// 轨迹拉取配置信息redis key前缀 /// - public const string TrackPullConfigInfoKeyPrefix = "TrackPullConfigInfo:"; + public const string TrackPullKeyPrefix = "TrackPull"; + + /// + /// 轨迹拉取配置信息redis key前缀 + /// + public const string TrackPullContentKeyPrefix = "TrackPullContent"; } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Queries/ITrackOrderQueries.cs b/src/SJZY.Track.Domain/Queries/ITrackOrderQueries.cs new file mode 100644 index 00000000..45309ad5 --- /dev/null +++ b/src/SJZY.Track.Domain/Queries/ITrackOrderQueries.cs @@ -0,0 +1,13 @@ +using SJZY.Track.Domain.Dtos.Order; + +namespace SJZY.Track.Domain.Queries; + +public interface ITrackOrderQueries +{ + /// + /// 获取分页的轨迹订单 + /// + /// + /// + Task> GetPageTrackOrder(GetPageTrackOrderInputVO input); +} \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Queries/TrackOrderQueries.cs b/src/SJZY.Track.Repository/Queries/TrackOrderQueries.cs new file mode 100644 index 00000000..73a566d0 --- /dev/null +++ b/src/SJZY.Track.Repository/Queries/TrackOrderQueries.cs @@ -0,0 +1,117 @@ +using SJZY.Track.Domain.Aggregates.OrderAggregate; +using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; +using SJZY.Track.Domain.Dtos.Order; +using SJZY.Track.Domain.Queries; +using SJZY.Track.Domain.VEntities; +using SJZY.Track.Repository.VData.Entitys; + +namespace SJZY.Track.Repository.Queries; + +public class TrackOrderQueries : ISugarRepository, ITrackOrderQueries, + ITransientDependency +{ + public ISqlSugarClient Context { get; set; } + + public TrackOrderQueries() + { + Context = SqlsugarScopeBasic.GetContextSafely("default"); + } + + /// + /// 获取分页的轨迹订单 + /// + /// + /// + public async Task> GetPageTrackOrder(GetPageTrackOrderInputVO input) + { + List orderNoList = new List(); + List questionTypeIds = new List(); + int ques = 0; + if (!input.OrderNos.IsNullOrWhiteSpace()) + { + orderNoList = input.OrderNos!.Split(new[] { ',', ',', ':', ':' }).ToList(); + } + + if (input.TabType == 1) + { + questionTypeIds = new List { 1, 4 }; + ques = questionTypeIds.Sum(); + } + else if (input.TabType == 2) + { + questionTypeIds = new List { 2, 4 }; + ques = questionTypeIds.Sum(); + } + + var 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(!orderNoList.IsNullOrEmpty(), (a, b, c) => orderNoList.Contains(a.OrderNo)) + .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 && !questionTypeIds.IsNullOrEmpty(), (a, b, c) => (a.QuestionType & ques) > 0) + .OrderByDescending((a, b, c) => a.CreateTime) + .Select((a, b, c) => new TrackOrderVO + { + Id = a.Id, + OrderNumber = a.OrderNo, + OrderType = a.OrderType, + OrderTypeName = SqlFunc.IF(a.OrderType == 1).Return("干线提单").ElseIF(a.OrderType == 2).Return("小包运单") + .ElseIF(a.OrderType == 3) + .Return("箱/袋单").ElseIF(a.OrderType == 4).Return("FBA订单").End(""), + CustomerShortName = b.Abbreviation, + CustomerCode = b.Code, + CustomerId = a.CustomId, + QuestionType = a.QuestionType, + QuestionTypeName = SqlFunc.IF(a.QuestionType == 1).Return("异常").ElseIF(a.QuestionType == 2).Return("预警") + .End(""), + ProblemDescription = a.ProblemDescription, + ProblemDescriptionName = SqlFunc.IF(a.ProblemDescription == 1).Return("推送异常") + .ElseIF(a.ProblemDescription == 2).Return("推送预警").End(""), + //TrackTemplateNames = SqlFunc.Subqueryable() + // .LeftJoin((aa, bb) => aa.TrackTemplateId == bb.Id) + // .Where((aa, bb) => a.Id == aa.OrderId).SelectStringJoin((aa, bb) => bb.Name, ","), + + //TrackTemplateIds = SqlFunc.Subqueryable() + // .LeftJoin((aa, bb) => aa.TrackTemplateId == bb.Id) + // .Where((aa, bb) => a.Id == aa.OrderId).SelectStringJoin((aa, bb) => bb.Id, ","), + NewestTrackContent = a.LatestTrackContent, + NewestTrackEnContent = a.LatestTrackEnContent, + NewestTrackPlace = a.LatestTrackPlace, + NewestTrackTime = a.LatestTrackTime, + IsFinish = a.IsCompleted, + CreateTime = a.CreateTime, + SubSystem = c.CnName, + SubSystemId = c.Id + }) + .ToPagedListAsync(input.PageIndex, input.PageSize); + + if (pageList.List.Any()) + { + //查询也需要最新的轨迹 + var orderIds = pageList.List.Select(a => a.Id).ToList(); + //查询轨迹模版 + var trackTemplateList = await Context.Queryable() + .LeftJoin((a, b) => a.TrackTemplateId == b.Id) + .Where((a, b) => orderIds.Contains(a.OrderId)) + .Select((a, b) => new { a.OrderId, b.Name, TemplateId = b.Id }) + .ToListAsync(); + pageList.List.ForEach(a => + { + a.TrackTemplateNames = trackTemplateList.Where(b => b.OrderId == a.Id).Select(x => x.Name) + .JoinAsString(","); + a.TrackTemplateIds = trackTemplateList.Where(b => b.OrderId == a.Id).Where(b => b.TemplateId > 0) + .Select(x => x.TemplateId).ToList(); + }); + } + + return pageList; + } +} \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index e160ec0b..aac0ef93 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -1,25 +1,12 @@ using SJZY.Track.Domain; using SJZY.Track.Domain.Aggregates.OrderAggregate; -using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; -using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Dtos.Order; using SJZY.Track.Domain.VEntities; -using SJZY.Track.Repository.VData.Entitys; -using SqlSugar; namespace SJZY.Track.Repository.Repositories; public class OrderRepository : BasicRepository, IOrderRepository, ITransientDependency { - private readonly ITrackDetailsRepository _trackDetailsRepository; - - public OrderRepository( - ITrackDetailsRepository trackDetailsRepository - ) - { - this._trackDetailsRepository = trackDetailsRepository; - } - public async Task CreateOrderAsync(OrderEntity order) { using var tran = TransactionHelper.GetReadCommitted(); @@ -98,180 +85,33 @@ public class OrderRepository : BasicRepository, IOrderRepository, I #endregion - #region 轨迹订单明细 - - ///// - ///// 根据轨迹订单id获取轨迹明细列表 - ///// - ///// - ///// - //public async Task> GetOrderDetails(GetOrderDetailsInputVO input) - //{ - // return null; - //} - - #endregion - - #region 轨迹订单分页 - - /// - /// 获取分页的轨迹订单 - /// - /// - /// - public async Task> GetPageTrackOrder(GetPageTrackOrderInputVO input) - { - List orderNoList = new List(); - List questionTypeIds = new List(); - int ques = 0; - if (!input.OrderNos.IsNullOrWhiteSpace()) - { - orderNoList = input.OrderNos.Split(new char[] { ',', ',', ':', ':' }).ToList(); - } - if (input.TabType==1) - { - questionTypeIds= new List { 1, 4 }; - ques = questionTypeIds.Sum(); - } - else if (input.TabType==2) - { - questionTypeIds= new List { 2, 4 }; - ques = questionTypeIds.Sum(); - } - - var 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(!orderNoList.IsNullOrEmpty(), (a, b, c) => orderNoList.Contains(a.OrderNo)) - .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 && (!questionTypeIds.IsNullOrEmpty()), (a, b, c) => (a.QuestionType&ques)>0) - .OrderByDescending((a, b, c) => a.CreateTime) - .Select((a, b, c) => new TrackOrderVO - { - Id = a.Id, - OrderNumber = a.OrderNo, - OrderType = a.OrderType, - OrderTypeName = SqlFunc.IF(a.OrderType == 1).Return("干线提单").ElseIF(a.OrderType == 2).Return("小包运单") - .ElseIF(a.OrderType == 3) - .Return("箱/袋单").ElseIF(a.OrderType == 4).Return("FBA订单").End(""), - CustomerShortName = b.Abbreviation, - CustomerCode = b.Code, - CustomerId = a.CustomId, - QuestionType = a.QuestionType, - QuestionTypeName = SqlFunc.IF(a.QuestionType == 1).Return("异常").ElseIF(a.QuestionType == 2).Return("预警").End(""), - ProblemDescription = a.ProblemDescription, - ProblemDescriptionName =SqlFunc.IF(a.ProblemDescription == 1).Return("推送异常").ElseIF(a.ProblemDescription == 2).Return("推送预警").End(""), - //TrackTemplateNames = SqlFunc.Subqueryable() - // .LeftJoin((aa, bb) => aa.TrackTemplateId == bb.Id) - // .Where((aa, bb) => a.Id == aa.OrderId).SelectStringJoin((aa, bb) => bb.Name, ","), - - //TrackTemplateIds = SqlFunc.Subqueryable() - // .LeftJoin((aa, bb) => aa.TrackTemplateId == bb.Id) - // .Where((aa, bb) => a.Id == aa.OrderId).SelectStringJoin((aa, bb) => bb.Id, ","), - NewestTrackContent = a.LatestTrackContent, - NewestTrackEnContent = a.LatestTrackEnContent, - NewestTrackPlace = a.LatestTrackPlace, - NewestTrackTime = a.LatestTrackTime, - IsFinish = a.IsCompleted, - CreateTime = a.CreateTime, - SubSystem = c.CnName, - SubSystemId = c.Id - }) - .ToPagedListAsync(input.PageIndex, input.PageSize); - - if (pageList.List.Any()) - { - //查询也需要最新的轨迹 - var orderIds = pageList.List.Select(a => a.Id).ToList(); - //查询轨迹模版 - var trackTemplateList = await Context.Queryable() - .LeftJoin((a, b) => a.TrackTemplateId == b.Id) - .Where((a, b) => orderIds.Contains(a.OrderId)) - .Select((a, b) => new { OrderId = a.OrderId, Name = b.Name, TemplateId = b.Id }) - .ToListAsync(); - var esTrackDetails = await _trackDetailsRepository.GetListAsync(orderIds); - pageList.List.ForEach(a => - { - var esDetails = esTrackDetails?.Where(b => b.OrderId == a.Id).OrderByDescending(b => b.TrackTime); - var trackDetail = esDetails?.FirstOrDefault(); - if (trackDetail != null) - { - if (trackDetail.TrackContent != a.NewestTrackContent) - { - a.NewestTrackContent = trackDetail.TrackContent; - } - - if (trackDetail.TrackEnContent != a.NewestTrackEnContent) - { - a.NewestTrackEnContent = trackDetail.TrackEnContent; - } - - if (trackDetail.TrackPlace != a.NewestTrackPlace) - { - a.NewestTrackPlace = trackDetail.TrackPlace; - } - - if (trackDetail.TrackTime != a.NewestTrackTime) - { - a.NewestTrackTime = trackDetail.TrackTime; - } - } - - a.TrackTemplateNames = trackTemplateList.Where(b => b.OrderId == a.Id).Select(a => a.Name) - .JoinAsString(","); - a.TrackTemplateIds = trackTemplateList.Where(b => b.OrderId == a.Id).Where(b => b.TemplateId>0).Select(a => a.TemplateId).ToList(); - }); - } - - - #region 暂时注释 - - //if (pageList.List.Any()) - //{ - // var orderIds = pageList.List.Select(a => a.Id); - // //查询轨迹模版 - - - // var trackTemplateList = await Context.Queryable() - // .LeftJoin((a, b) => a.TrackTemplateId==b.Id) - // .Where((a, b) => orderIds.Contains(a.OrderId)) - // .Select((a, b) => new { OrderId = a.OrderId, Name = b.Name }) - // .ToListAsync(); - - // pageList.List.ForEach(a => - // { - // var templateListOfOrderId = trackTemplateList.Where(b => b.OrderId== a.Id); - // a.TrackTemplateNames = templateListOfOrderId.Select(c => c.Name).JoinAsString(","); - // }); - //} - - #endregion - - return pageList; - } - - #endregion - - - public async Task> GetOrderTemplatesAsync(List orderNos) + public async Task> FindServiceProviderByOrderAsync(List orderNos) { return await Context.Queryable() .LeftJoin((a, b) => a.Id == b.OrderId) .LeftJoin((a, b, c) => b.ServiceProviderId == c.Id) .Where(a => orderNos.Contains(a.OrderNo)) - .Select((a, b, c) => new OrderTemplateVO + .Select((a, b, c) => new OrderServiceProviderVO + { + OrderNo = a.OrderNo, + OrderType = a.OrderType, + ServiceProviderId = b.ServiceProviderId, + ServiceProviderCode = c.Code, + SubSystemId = a.SubSystemId + }) + .ToListAsync(); + } + + public async Task> FindOrderByServiceProviderAsync(int serviceProvider) + { + return await Context.Queryable() + .RightJoin((a, b) => a.Id == b.OrderId) + .LeftJoin((a, b, c) => b.ServiceProviderId == c.Id) + .Where((a, b) => b.ServiceProviderId == serviceProvider && !a.IsCompleted) + .Select((a, b, c) => new OrderServiceProviderVO { OrderNo = a.OrderNo, OrderType = a.OrderType, - TemplateId = b.TrackTemplateId, ServiceProviderId = b.ServiceProviderId, ServiceProviderCode = c.Code, SubSystemId = a.SubSystemId From 786f1f0d2537a88caa5ce5c29e25f0d4adbd7128 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9F=B3=E6=96=87=E7=BF=94?= <878130837@qq.com> Date: Thu, 14 Mar 2024 14:07:09 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8B=89=E5=8F=96?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TrackPull/TrackPullCacheService.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/SJZY.Track.Application/Services/TrackPull/TrackPullCacheService.cs b/src/SJZY.Track.Application/Services/TrackPull/TrackPullCacheService.cs index 55351d80..26541474 100644 --- a/src/SJZY.Track.Application/Services/TrackPull/TrackPullCacheService.cs +++ b/src/SJZY.Track.Application/Services/TrackPull/TrackPullCacheService.cs @@ -22,9 +22,15 @@ public class TrackPullCacheService : ApplicationService, ITrackPullCacheService _trackPullConfigRepository = trackPullConfigRepository; } - public Task> GetAllPullConfigsAsync() + [NonAction] + public async Task> GetAllPullConfigsAsync() { - throw new NotImplementedException(); + return await _trackPullConfigRepository.GetListAsync(x => true, x => new TrackPullConfigDto + { + SubSystemId = x.SubSystemId, + ServiceProviderId = x.ServiceProviderId, + PullInterval = x.PullInterval + }); } [NonAction] @@ -53,7 +59,6 @@ public class TrackPullCacheService : ApplicationService, ITrackPullCacheService var trackPullConfigEntity = await _trackPullConfigRepository.GetFirstAsync(exp); if (trackPullConfigEntity == null) return data; - var trackPullConfigDetail = await _trackPullConfigRepository.GetDetailAsync(trackPullConfigEntity.Id); if (trackPullConfigDetail is null) return data; var trackPullContentList = await _trackPullConfigRepository.GetContentListCacheAsync(trackPullConfigEntity.Id); From f50dccebe836be233f23308c528a615eb993dc26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Fri, 15 Mar 2024 09:53:24 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ITrackPushCacheService.cs | 8 ++++++++ .../EventHandlers/TrackUpsertEventHandler.cs | 3 ++- .../Services/TrackPush/TrackPushCacheService.cs | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs b/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs index 04369975..378d2d02 100644 --- a/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs +++ b/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs @@ -9,6 +9,14 @@ public interface ITrackPushCacheService /// Task IsPushAsync(int customId); + /// + /// 判断客户是否需要推送 + /// + /// + /// + /// + Task IsPushAsync(int subSystemId, int customId); + /// /// 更新缓存 /// diff --git a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs index 21ddffc0..fd33d3e1 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs @@ -99,7 +99,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe }; // todo:推送只做新增的,更新和删除的不做先 - if (!@event.IsPushCompleted && await _trackPushCacheService.IsPushAsync(@event.CustomId)) + if (!@event.IsPushCompleted && + await _trackPushCacheService.IsPushAsync(@event.SubSystemId, @event.CustomId)) { //await PushTrack(); } diff --git a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs index 046ea943..ba084f93 100644 --- a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs +++ b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs @@ -32,6 +32,21 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc return (bool)isPush; } + public async Task IsPushAsync(int subSystemId, int customId) + { + var isPush = + await RedisHelper.Client.GetAsync(RedisKey(customId)); + + if (isPush == null) + { + isPush = await _trackPushConfigQuery.GetFirstAsync(x => x.CustomId == customId, + x => x.IsAutoPush); + await RedisHelper.Client.SetAsync(RedisKey(customId), isPush); + } + + return (bool)isPush; + } + public async Task UpdateAsync(int customId, bool isPush) { await RedisHelper.Client.SetAsync(RedisKey(customId), isPush); From 91ad7eebb8fb022a0598b7e70222198351d5bf02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Fri, 15 Mar 2024 14:49:09 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TrackPushContentConfigDto.cs | 44 +++++ .../Events/TrackUpsertEvent.cs | 4 +- .../Events/UpdateOrderTrackEvent.cs | 5 + .../Services/ITrackPushCacheService.cs | 18 +- .../OrderLinkAfterFillTrackHandler.cs | 4 +- .../EventHandlers/TrackRefreshEventHandler.cs | 4 +- .../EventHandlers/TrackUpsertEventHandler.cs | 21 ++- .../Services/ProvideServices/TrackService.cs | 8 +- .../TrackPush/TrackPushCacheService.cs | 33 +--- .../Services/TrackPush/TrackPushService.cs | 173 ++++++++++-------- .../Aggregates/OrderAggregate/OrderEntity.cs | 8 +- .../TrackDetailsIndex.cs | 5 + .../Dtos/Order/LinkedOrderVO.cs | 10 +- .../Dtos/TrackDetails/MatchTrackContentDto.cs | 5 + .../Enums/TrackProblemType.cs | 15 ++ src/SJZY.Track.Domain/GlobalConst.cs | 5 + .../Queries/ProvideQueries.cs | 1 + .../Repositories/OrderRepository.cs | 2 +- 18 files changed, 234 insertions(+), 131 deletions(-) create mode 100644 src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackPushContentConfigDto.cs create mode 100644 src/SJZY.Track.Domain/Enums/TrackProblemType.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackPushContentConfigDto.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackPushContentConfigDto.cs new file mode 100644 index 00000000..ed2e02d0 --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackPushContentConfigDto.cs @@ -0,0 +1,44 @@ +namespace SJZY.Track.Application.Contract.Dtos.ProvideServices; + +public class TrackPushContentConfigDto +{ + /// + /// 扩展字段参数值 + /// + public string? ExpandFieldsValue { get; set; } + + /// + /// 推送单号类型(主数据枚举TrackOrderType) + /// + public int OrderType { get; set; } + + /// + /// 轨迹代码参数值 + /// + public string? TrackContentCodeValue { get; set; } + + /// + /// 轨迹内容id + /// + public int TrackContentId { get; set; } + + /// + /// 轨迹内容参数值 + /// + public string? TrackContentValue { get; set; } + + /// + /// 轨迹内容英文参数值 + /// + public string? TrackEnContentValue { get; set; } + + /// + /// 轨迹状态参数值 + /// + public string? TrackStatusValue { get; set; } + + /// + /// 轨迹时区GMT + /// + public double? TrackTimeZone { 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 04f91415..56032acb 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -20,9 +20,9 @@ public class TrackUpsertEvent : UpsertTrackInput public int SubSystemId { get; set; } /// - /// 订单是否推送完成(异步维护) + /// 最新推送代码(异步维护) /// - public bool IsPushCompleted { get; set; } + public int? LatestPushTrackContentId { get; set; } /// /// 上游子系统id diff --git a/src/SJZY.Track.Application.Contract/Events/UpdateOrderTrackEvent.cs b/src/SJZY.Track.Application.Contract/Events/UpdateOrderTrackEvent.cs index 779415e2..7daa9a7d 100644 --- a/src/SJZY.Track.Application.Contract/Events/UpdateOrderTrackEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/UpdateOrderTrackEvent.cs @@ -41,4 +41,9 @@ public class UpdateOrderTrackEvent /// 轨迹时区 /// public float TrackTimeZone { get; set; } + + /// + /// 轨迹代码 + /// + public string TrackCode { get; set; } = null!; } \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs b/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs index 378d2d02..acc00b72 100644 --- a/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs +++ b/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs @@ -1,4 +1,6 @@ -namespace SJZY.Track.Application.Contract.Services; +using SJZY.Track.Application.Contract.Dtos.ProvideServices; + +namespace SJZY.Track.Application.Contract.Services; public interface ITrackPushCacheService { @@ -10,12 +12,22 @@ public interface ITrackPushCacheService Task IsPushAsync(int customId); /// - /// 判断客户是否需要推送 + /// 获取服务商拉取配置 + /// + /// 子系统id + /// 服务商id + /// + Task> GetPushContentConfigsAsync(int subSystemId, int customId); + + /// + /// 根据轨迹代码推断下一个(升序)要推送的内容,如果找不到或者已经是最后一个了,返回null /// /// /// + /// /// - Task IsPushAsync(int subSystemId, int customId); + Task InferNextPushContentOrNullAsync(int subSystemId, int customId, + int? trackContentId); /// /// 更新缓存 diff --git a/src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs b/src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs index 4a014b49..80c5dda8 100644 --- a/src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs @@ -31,7 +31,7 @@ public class OrderLinkAfterFillTrackHandler : ITransientDependency, ICapSubscrib var order = await _orderRepository.GetFirstAsync(x => x.Id == linkOrderId, x => new { - x.OrderType, x.OrderNo, x.CustomId, x.IsPushCompleted, x.SubSystemId + x.OrderType, x.OrderNo, x.CustomId, LatestPushCode = x.LatestPushTrackContentId, x.SubSystemId }); if (order == default) continue; @@ -50,7 +50,7 @@ public class OrderLinkAfterFillTrackHandler : ITransientDependency, ICapSubscrib OrderId = linkOrderId, CustomId = order.CustomId, SubSystemId = order.SubSystemId, - IsPushCompleted = order.IsPushCompleted, + LatestPushTrackContentId = order.LatestPushCode, UpSubSystemId = @event.SubSystemId, }; diff --git a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs index b3864e55..5d74b758 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs @@ -63,7 +63,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe var order = await _orderRepository.GetFirstAsync(x => x.OrderType == orderType && x.OrderNo == orderNo, x => new { - x.Id, x.SubSystemId, x.IsPushCompleted, x.CustomId + x.Id, x.SubSystemId, LatestPushCode = x.LatestPushTrackContentId, x.CustomId }); if (order == default) return; @@ -73,7 +73,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe { OrderId = order.Id, SubSystemId = order.SubSystemId, - IsPushCompleted = order.IsPushCompleted, + LatestPushTrackContentId = order.LatestPushCode, CustomId = order.CustomId, OrderType = orderType, OrderNo = orderNo!, diff --git a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs index fd33d3e1..7c6f3159 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs @@ -88,6 +88,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackStatus = trackContent.Status, TrackCode = @event.TrackCode, TrackContent = trackContent.Content, + TrackContentId = trackContent.Id, IsCompleted = orderIsCompleted, TrackEnContent = trackContent.EnContent, TrackPlace = @event.TrackPlace, @@ -97,13 +98,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe CreateUser = CurrentUserRequest.CurrentUser.Name, CreateTime = DateTime.Now }; - - // todo:推送只做新增的,更新和删除的不做先 - if (!@event.IsPushCompleted && - await _trackPushCacheService.IsPushAsync(@event.SubSystemId, @event.CustomId)) - { - //await PushTrack(); - } } else { @@ -114,13 +108,24 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe track.UpdateTime = DateTime.Now; } + // upsert es轨迹 await _trackDetailsRepository.UpsertAsync(track); + // 触发轨迹推送事件 + var content = await _trackPushCacheService.InferNextPushContentOrNullAsync( + @event.SubSystemId, @event.CustomId, @event.LatestPushTrackContentId); + if (content != default && content.TrackContentId == track.TrackContentId && + content.OrderType == @event.OrderType) + { + //await PushTrack(content); + } + // 触发订单主表更新事件 await _capPublisher.PublishAsync(GlobalConst.UpdateOrderTrackSubscribe, new UpdateOrderTrackEvent { OrderId = track.OrderId, IsCompleted = orderIsCompleted, + TrackCode = track.TrackCode, TrackContent = track.TrackContent, TrackEnContent = track.TrackEnContent, TrackPlace = track.TrackPlace, @@ -137,7 +142,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe nextEvent.OrderType = linkedOrder.OrderType; nextEvent.OrderNo = linkedOrder.OrderNo; nextEvent.SubSystemId = linkedOrder.SubSystemId; - nextEvent.IsPushCompleted = linkedOrder.IsPushCompleted; + nextEvent.LatestPushTrackContentId = linkedOrder.LatestPushTrackContentId; nextEvent.CustomId = linkedOrder.CustomId; nextEvent.UpSubSystemId = @event.SubSystemId; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, nextEvent); diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 4c3d1a45..b1c809d3 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -41,7 +41,7 @@ public partial class TrackService : ApplicationService, ITrackService var order = await _orderRepository.GetFirstAsync(x => x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, x => new { - x.Id, x.SubSystemId, x.IsPushCompleted, x.CustomId + x.Id, x.SubSystemId, LatestPushCode = x.LatestPushTrackContentId, x.CustomId }); if (order == default) { @@ -52,7 +52,7 @@ public partial class TrackService : ApplicationService, ITrackService var @event = ObjectMapper.Map(input); @event.OrderId = order.Id; @event.SubSystemId = order.SubSystemId; - @event.IsPushCompleted = order.IsPushCompleted; + @event.LatestPushTrackContentId = order.LatestPushCode; @event.CustomId = order.CustomId; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); return true; @@ -76,7 +76,7 @@ public partial class TrackService : ApplicationService, ITrackService var orders = await _orderRepository.GetListAsync(x => x.OrderType == input.OrderType && input.OrderNos.Contains(x.OrderNo), x => new { - x.Id, x.OrderNo, x.SubSystemId, x.IsPushCompleted, x.CustomId + x.Id, x.OrderNo, x.SubSystemId, LatestPushCode = x.LatestPushTrackContentId, x.CustomId }); foreach (var order in orders) @@ -92,7 +92,7 @@ public partial class TrackService : ApplicationService, ITrackService OrderNo = order.OrderNo, OrderId = order.Id, SubSystemId = order.SubSystemId, - IsPushCompleted = order.IsPushCompleted, + LatestPushTrackContentId = order.LatestPushCode, CustomId = order.CustomId }; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); diff --git a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs index ba084f93..eb11ae2c 100644 --- a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs +++ b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs @@ -1,4 +1,5 @@ using SJZY.Expand.ABP.Core; +using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Services; using SJZY.Track.Domain.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Queries; @@ -17,34 +18,20 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc _trackPushConfigQuery = trackPushConfigQuery; } - public async Task IsPushAsync(int customId) + public Task IsPushAsync(int customId) { - var isPush = - await RedisHelper.Client.GetAsync(RedisKey(customId)); - - if (isPush == null) - { - isPush = await _trackPushConfigQuery.GetFirstAsync(x => x.CustomId == customId, - x => x.IsAutoPush); - await RedisHelper.Client.SetAsync(RedisKey(customId), isPush); - } - - return (bool)isPush; + throw new NotImplementedException(); } - public async Task IsPushAsync(int subSystemId, int customId) + public Task> GetPushContentConfigsAsync(int subSystemId, int customId) { - var isPush = - await RedisHelper.Client.GetAsync(RedisKey(customId)); + throw new NotImplementedException(); + } - if (isPush == null) - { - isPush = await _trackPushConfigQuery.GetFirstAsync(x => x.CustomId == customId, - x => x.IsAutoPush); - await RedisHelper.Client.SetAsync(RedisKey(customId), isPush); - } - - return (bool)isPush; + public Task InferNextPushContentOrNullAsync(int subSystemId, int customId, + int? trackContentId) + { + throw new NotImplementedException(); } public async Task UpdateAsync(int customId, bool isPush) diff --git a/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs b/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs index 1ecb8f41..34903f75 100644 --- a/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs +++ b/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.Localization; +using System.Linq.Expressions; +using Microsoft.Extensions.Localization; using SJZY.Expand.ABP.Core.Localization; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Track.Application.Contract.Dtos.TrackPush; @@ -9,9 +10,6 @@ using SJZY.Track.Domain.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Dtos.Common; using SJZY.Track.Domain.Dtos.TrackPush; -using SqlSugar; -using System.Linq.Expressions; -using Volo.Abp.DependencyInjection; namespace SJZY.Track.Application.Services.TrackPush; @@ -20,11 +18,10 @@ namespace SJZY.Track.Application.Services.TrackPush; /// [ApiExplorerSettings(GroupName = "轨迹推送")] [Route("/Track/PushConfig")] -public class TrackPushService : ApplicationService, ITransientDependency +public class TrackPushService : ApplicationService { private readonly IStringLocalizer _stringLocalizer; private readonly ITrackPushConfigRepository _trackPushConfigRepository; - private readonly ITrackTemplateRepository _trackTemplateRepository; private readonly ITrackPullConfigRepository _trackPullConfigRepository; private readonly ITrackPushCacheService _trackPushCacheService; @@ -37,7 +34,6 @@ public class TrackPushService : ApplicationService, ITransientDependency { _stringLocalizer = stringLocalizer; _trackPushConfigRepository = trackPushConfigRepository; - _trackTemplateRepository = trackTemplateRepository; _trackPullConfigRepository = trackPullConfigRepository; _trackPushCacheService = trackPushCacheService; } @@ -59,7 +55,8 @@ public class TrackPushService : ApplicationService, ITransientDependency /// /// [HttpPost("GetContentPage")] - public async Task> GetContentPageAsync([FromBody] GetTrackPushContentPageInputVO input) + public async Task> GetContentPageAsync( + [FromBody] GetTrackPushContentPageInputVO input) { return await _trackPushConfigRepository.GetContentPageAsync(input); } @@ -97,71 +94,79 @@ public class TrackPushService : ApplicationService, ITransientDependency if (input.Options != OptionTypeNoNull.删除) { Expression> isAnyExp = x => - x.SubSystemId == input.SubSystemId && x.CustomId == input.CustomId && x.ServiceProviderId == input.ServiceProviderId; + x.SubSystemId == input.SubSystemId && x.CustomId == input.CustomId && + x.ServiceProviderId == input.ServiceProviderId; if (input.Options == OptionTypeNoNull.修改) isAnyExp = isAnyExp.And(x => x.Id != input.Id); - if (await _trackPushConfigRepository.IsAnyAsync(isAnyExp)) throw new BusinessException(message: _stringLocalizer["IsTrackPushConfigAny"]); + if (await _trackPushConfigRepository.IsAnyAsync(isAnyExp)) + throw new BusinessException(message: _stringLocalizer["IsTrackPushConfigAny"]); } switch (input.Options) { case OptionTypeNoNull.新增: + { + var trackPushEntity = ObjectMapper.Map(input); + var trackPushParamsEntity = + ObjectMapper.Map(input); + + using (var ts = TransactionScopeHelper.Create()) { - var trackPushEntity = ObjectMapper.Map(input); - var trackPushParamsEntity = ObjectMapper.Map(input); + int id = await _trackPushConfigRepository.InsertReturnIdentityAsync(trackPushEntity); - using (var ts = TransactionScopeHelper.Create()) - { - int id = await _trackPushConfigRepository.InsertReturnIdentityAsync(trackPushEntity); + trackPushParamsEntity.PullOrPushConfigId = id; + await _trackPullConfigRepository.InsertParamsAsync(trackPushParamsEntity); - trackPushParamsEntity.PullOrPushConfigId = id; - await _trackPullConfigRepository.InsertParamsAsync(trackPushParamsEntity); + if (input.IsAutoPush!.Value) await _trackPushCacheService.IsPushAsync(input.CustomId!.Value); - if (input.IsAutoPush!.Value) await _trackPushCacheService.IsPushAsync(input.CustomId!.Value); - - ts.Complete(); - } + ts.Complete(); } + } break; case OptionTypeNoNull.修改: + { + var oldTrackPushEntity = await _trackPushConfigRepository.GetFirstAsync(x => x.Id == input.Id) ?? + throw new BusinessException(message: _stringLocalizer["NotFindData"]); + + int oldCustomId = oldTrackPushEntity.CustomId; + + var oldTrackPushParamsEntity = + await _trackPullConfigRepository.GetParamsSingleAsync(x => + x.PullOrPushConfigId == input.Id && x.IsPush); + + ObjectMapper.Map(input, oldTrackPushEntity); + ObjectMapper.Map(input, oldTrackPushParamsEntity); + + using (var ts = TransactionScopeHelper.Create()) { - var oldTrackPushEntity = await _trackPushConfigRepository.GetFirstAsync(x => x.Id == input.Id) ?? throw new BusinessException(message: _stringLocalizer["NotFindData"]); + await _trackPushConfigRepository.UpdateAsync(oldTrackPushEntity); + await _trackPullConfigRepository.UpdateParamsAsync(oldTrackPushParamsEntity); - int oldCustomId = oldTrackPushEntity.CustomId; + await _trackPushCacheService.UpdateAsync(oldCustomId, false); + if (input.IsAutoPush!.Value) await _trackPushCacheService.IsPushAsync(input.CustomId!.Value); - var oldTrackPushParamsEntity = await _trackPullConfigRepository.GetParamsSingleAsync(x => x.PullOrPushConfigId == input.Id && x.IsPush); - - ObjectMapper.Map(input, oldTrackPushEntity); - ObjectMapper.Map(input, oldTrackPushParamsEntity); - - using (var ts = TransactionScopeHelper.Create()) - { - await _trackPushConfigRepository.UpdateAsync(oldTrackPushEntity); - await _trackPullConfigRepository.UpdateParamsAsync(oldTrackPushParamsEntity); - - await _trackPushCacheService.UpdateAsync(oldCustomId, false); - if (input.IsAutoPush!.Value) await _trackPushCacheService.IsPushAsync(input.CustomId!.Value); - - ts.Complete(); - } + ts.Complete(); } + } break; case OptionTypeNoNull.删除: + { + var oldTrackPushEntity = await _trackPushConfigRepository.GetFirstAsync(x => x.Id == input.Id) ?? + throw new BusinessException(message: _stringLocalizer["NotFindData"]); + + using (var ts = TransactionScopeHelper.Create()) { - var oldTrackPushEntity = await _trackPushConfigRepository.GetFirstAsync(x => x.Id == input.Id) ?? throw new BusinessException(message: _stringLocalizer["NotFindData"]); + await _trackPushConfigRepository.SoftDeleteAsync(x => x.Id == input.Id); + await _trackPullConfigRepository.SoftDeleteParamsAsync(x => + x.PullOrPushConfigId == input.Id && x.IsPush); + await _trackPushConfigRepository.SoftDeleteContentAsync(x => x.TrackPushConfigId == input.Id); + await _trackPushCacheService.UpdateAsync(oldTrackPushEntity.CustomId, false); - using (var ts = TransactionScopeHelper.Create()) - { - await _trackPushConfigRepository.SoftDeleteAsync(x => x.Id == input.Id); - await _trackPullConfigRepository.SoftDeleteParamsAsync(x => x.PullOrPushConfigId == input.Id && x.IsPush); - await _trackPushConfigRepository.SoftDeleteContentAsync(x => x.TrackPushConfigId == input.Id); - await _trackPushCacheService.UpdateAsync(oldTrackPushEntity.CustomId, false); - - ts.Complete(); - } + ts.Complete(); } + } break; default: @@ -182,62 +187,76 @@ public class TrackPushService : ApplicationService, ITransientDependency { if (input.Options != OptionTypeNoNull.删除) { - Expression> isContentAnyExp = x => x.TrackPushConfigId == input.TrackPushConfigId; + Expression> isContentAnyExp = x => + x.TrackPushConfigId == input.TrackPushConfigId; if (input.Options == OptionTypeNoNull.修改) isContentAnyExp = isContentAnyExp.And(x => x.Id != input.Id); - if (await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x => x.TrackContentId == input.TrackContentId))) + if (await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x => + x.TrackContentId == input.TrackContentId))) throw new BusinessException(message: _stringLocalizer["IsTrackPushContentAny"]); - else if (!input.TrackContentCodeValue.IsNullOrWhiteSpace() && await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x => x.TrackContentCodeValue == input.TrackContentCodeValue))) + else if (!input.TrackContentCodeValue.IsNullOrWhiteSpace() && + await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x => + x.TrackContentCodeValue == input.TrackContentCodeValue))) throw new BusinessException(message: _stringLocalizer["IsTrackPushContentCodeValueAny"]); - else if (!input.TrackStatusValue.IsNullOrWhiteSpace() && await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x => x.TrackStatusValue == input.TrackStatusValue))) + else if (!input.TrackStatusValue.IsNullOrWhiteSpace() && + await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x => + x.TrackStatusValue == input.TrackStatusValue))) throw new BusinessException(message: _stringLocalizer["IsTrackPushContentStatusValueAny"]); - else if (!input.TrackContentValue.IsNullOrWhiteSpace() && await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x => x.TrackContentValue == input.TrackContentValue))) + else if (!input.TrackContentValue.IsNullOrWhiteSpace() && + await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x => + x.TrackContentValue == input.TrackContentValue))) throw new BusinessException(message: _stringLocalizer["IsTrackPushContentValueAny"]); - else if (!input.TrackEnContentValue.IsNullOrWhiteSpace() && await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x => x.TrackEnContentValue == input.TrackEnContentValue))) + else if (!input.TrackEnContentValue.IsNullOrWhiteSpace() && + await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x => + x.TrackEnContentValue == input.TrackEnContentValue))) throw new BusinessException(message: _stringLocalizer["IsTrackPushEnContentValueAny"]); } switch (input.Options) { case OptionTypeNoNull.新增: - { - int maxSort = await _trackPushConfigRepository.ContentMaxAsync(x => x.Sort, x => x.TrackPushConfigId == input.TrackPushConfigId); + { + int maxSort = await _trackPushConfigRepository.ContentMaxAsync(x => x.Sort, + x => x.TrackPushConfigId == input.TrackPushConfigId); - var entity = ObjectMapper.Map(input); - entity.Sort = maxSort + 1; + var entity = ObjectMapper.Map(input); + entity.Sort = maxSort + 1; - await _trackPushConfigRepository.InsertContentAsync(entity); + await _trackPushConfigRepository.InsertContentAsync(entity); - break; - } + break; + } case OptionTypeNoNull.修改: - { - var entity = await _trackPushConfigRepository.GetContentByIdAsync(input.Id!.Value) ?? throw new BusinessException(message: _stringLocalizer["NotFindData"]); + { + var entity = await _trackPushConfigRepository.GetContentByIdAsync(input.Id!.Value) ?? + throw new BusinessException(message: _stringLocalizer["NotFindData"]); - ObjectMapper.Map(input, entity); + ObjectMapper.Map(input, entity); - await _trackPushConfigRepository.UpdateContentAsync(entity); + await _trackPushConfigRepository.UpdateContentAsync(entity); - break; - } + break; + } case OptionTypeNoNull.删除: + { + var entity = await _trackPushConfigRepository.GetContentByIdAsync(input.Id!.Value) ?? + throw new BusinessException(message: _stringLocalizer["NotFindData"]); + + using (var ts = TransactionScopeHelper.Create()) { - var entity = await _trackPushConfigRepository.GetContentByIdAsync(input.Id!.Value) ?? throw new BusinessException(message: _stringLocalizer["NotFindData"]); + await _trackPushConfigRepository.SoftDeleteContentAsync(x => x.Id == input.Id); - 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); - await _trackPushConfigRepository.UpdateContentAsync(x => x.Sort == x.Sort - 1, x => x.TrackPushConfigId == entity.TrackPushConfigId && x.Sort > entity.Sort); - - ts.Complete(); - } - - break; + ts.Complete(); } + break; + } + default: throw new BusinessException(message: _stringLocalizer[SjzyBasicLocalization.Validation_IsInEnum, nameof(EditTrackPushContentInput.Options)]); diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs index 66f704a3..3defe94f 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs @@ -43,10 +43,10 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot public bool IsCompleted { get; set; } /// - /// 订单是否推送完成(异步维护) + /// 最新推送轨迹内容id(异步维护) /// - [SugarColumn(ColumnName = "IsPushCompleted")] - public bool IsPushCompleted { get; set; } + [SugarColumn(ColumnName = "LatestPushTrackContentId")] + public int? LatestPushTrackContentId { get; set; } /// /// 最新轨迹内容(异步维护) @@ -112,7 +112,7 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot /// 问题类型(主数据枚举TrackQuestionType) /// [SugarColumn(ColumnName = "QuestionType")] - public int QuestionType { get; set; } + public int QuestionType { get; set; } /// /// 问题描述(主数据枚举TrackProblemDescription) diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index d5909320..812b2377 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -46,6 +46,11 @@ public class TrackDetailsIndex : IdBaseIndex /// public string TrackContent { get; set; } = null!; + /// + /// 轨迹内容Id + /// + public int TrackContentId { get; set; } + /// /// 是否意味着完成 /// diff --git a/src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs b/src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs index c0344880..8cc9fbb2 100644 --- a/src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs +++ b/src/SJZY.Track.Domain/Dtos/Order/LinkedOrderVO.cs @@ -6,7 +6,7 @@ public class LinkedOrderVO /// 关联订单id /// public int OrderId { get; set; } - + /// /// 订单号 /// @@ -21,12 +21,12 @@ public class LinkedOrderVO /// 子系统id /// public int SubSystemId { get; set; } - + /// - /// 订单是否推送完成(异步维护) + /// 最新推送轨迹内容id(异步维护) /// - public bool IsPushCompleted { get; set; } - + public int? LatestPushTrackContentId { get; set; } + /// /// 客户id /// diff --git a/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs b/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs index adb51944..e0213b5e 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackDetails/MatchTrackContentDto.cs @@ -2,6 +2,11 @@ public class MatchTrackContentDto { + /// + /// 轨迹内容id + /// + public int Id { get; set; } + /// /// 轨迹内容 /// diff --git a/src/SJZY.Track.Domain/Enums/TrackProblemType.cs b/src/SJZY.Track.Domain/Enums/TrackProblemType.cs new file mode 100644 index 00000000..4abcc47e --- /dev/null +++ b/src/SJZY.Track.Domain/Enums/TrackProblemType.cs @@ -0,0 +1,15 @@ +namespace SJZY.Track.Domain.Enums; + +[Flags] +public enum TrackProblemType +{ + /// + /// 异常 + /// + Error = 1, + + /// + /// 预警 + /// + Warn = 2, +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/GlobalConst.cs b/src/SJZY.Track.Domain/GlobalConst.cs index 981ce249..528115ea 100644 --- a/src/SJZY.Track.Domain/GlobalConst.cs +++ b/src/SJZY.Track.Domain/GlobalConst.cs @@ -37,6 +37,11 @@ public class GlobalConst /// public const string TrackPushKeyPrefix = "TrackPush"; + /// + /// 轨迹推送内容配置redis key前缀 + /// + public const string TrackPushContentKeyPrefix = "TrackPushContent"; + /// /// 轨迹拉取配置信息redis key前缀 /// diff --git a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs index a84a28f5..04301286 100644 --- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs +++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs @@ -70,6 +70,7 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, .Where((x, a, b) => x.OrderId == orderId && b.Code == code) .Select((x, a, b, c) => new MatchTrackContentDto { + Id = b.Id, Content = b.Content, EnContent = b.EnContent, Status = c.Status, diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index aac0ef93..47c0bb60 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -67,7 +67,7 @@ public class OrderRepository : BasicRepository, IOrderRepository, I OrderType = b.OrderType, OrderNo = b.OrderNo, SubSystemId = b.SubSystemId, - IsPushCompleted = b.IsPushCompleted, + LatestPushTrackContentId = b.LatestPushTrackContentId, CustomId = b.CustomId }) .ToListAsync(); From 35bb8e13e0fa16dffe04839b0c63c1cd3770f348 Mon Sep 17 00:00:00 2001 From: moyongzhen <2534173414@qq.com> Date: Fri, 15 Mar 2024 15:33:27 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E6=98=8E=E7=BB=86=E8=A1=A5=E5=85=85s01=E9=81=97=E6=BC=8F?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TrackOrders/TrackOrderService.cs | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index 06800fc0..e799aeea 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -42,30 +42,25 @@ public class TrackOrderService : ApplicationService var list = ObjectMapper.Map, List>(trackDetails); var trackCodes = list.Where(a => !a.Code.IsNullOrWhiteSpace()).Select(a => a.Code).Distinct().ToList(); - var trackContents = await _trackContentRepository.GetTrackContentAttributeValue( - new GetTemplateContentAttributeValueInputVO - { - SubSystemId = input.SubSystemId, - TrackTemplateIds = input.TrackTemplateIds, - TrackCodes = trackCodes - }); + var trackContents = await _trackContentRepository.GetTrackContentAttributeValue(new GetTemplateContentAttributeValueInputVO + { + SubSystemId = input.SubSystemId, + TrackTemplateIds = input.TrackTemplateIds, + TrackCodes = trackCodes + }); input.TrackTemplateIds = input.TrackTemplateIds.Where(a => a > 0).ToList(); int id = 1; list.ForEach(a => { a.Id = id++; - var trackContentsOfTemplates = trackContents.Where(b => b.SubSystemId == input.SubSystemId && - b.TrackCode == a.Code - && input.TrackTemplateIds.Contains( - b.TrackTemplateId)); + var trackContentsOfTemplates = trackContents.Where(b => b.SubSystemId == input.SubSystemId && b.TrackCode == a.Code + && input.TrackTemplateIds.Contains(b.TrackTemplateId)); GetTemplateContentAttributeValueVO trackContent = null; - var insertData = input.TrackTemplateIds - .Intersect(trackContentsOfTemplates.Select(aa => aa.TrackTemplateId)).ToList(); + var insertData = input.TrackTemplateIds.Intersect(trackContentsOfTemplates.Select(aa => aa.TrackTemplateId)).ToList(); if (!insertData.IsNullOrEmpty()) { - trackContent = - trackContentsOfTemplates.FirstOrDefault(a => a.TrackTemplateId == insertData.FirstOrDefault()); + trackContent = trackContentsOfTemplates.FirstOrDefault(a => a.TrackTemplateId == insertData.FirstOrDefault()); } if (trackContent != null) @@ -73,7 +68,11 @@ public class TrackOrderService : ApplicationService a.IsCanDelete = trackContent.IsCanDelete; a.IsExternal = trackContent.IsExternal; } - + //else + //{ + // a.IsCanDelete=false; + // a.IsExternal=false; + //} if (a.TrackTimeZoneValue == 0f) { a.TrackTimeZone = $"GTM{" "}+00:00"; @@ -90,6 +89,7 @@ public class TrackOrderService : ApplicationService } }); return list; + } return new List();