From 80e6cc0c53f47651389314feb1a9532c4c60a803 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Mon, 18 Mar 2024 14:39:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=90=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Events/TrackPushAfterUpdateOrderEvent.cs | 9 ++- .../Events/TrackPushEvent.cs | 4 +- .../TrackPushAfterUpdateOrderEventHandler.cs | 28 ++++++-- .../EventHandlers/TrackPushEventHandler.cs | 69 +++++++++++-------- .../ProvideServices/TrackPullService.cs | 2 +- .../ProvideServices/TrackPushService.cs | 22 +++++- .../Aggregates/OrderAggregate/OrderEntity.cs | 10 ++- .../TrackPushRecordIndex.cs | 13 +++- .../Dtos/Order/GetPageTrackOrderInputVO.cs | 14 ++-- .../Queries/TrackOrderQueries.cs | 9 --- 10 files changed, 114 insertions(+), 66 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushAfterUpdateOrderEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushAfterUpdateOrderEvent.cs index b81b52cc..f57fad41 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackPushAfterUpdateOrderEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackPushAfterUpdateOrderEvent.cs @@ -2,6 +2,11 @@ public class TrackPushAfterUpdateOrderEvent { + /// + /// 操作类型 + /// + public OptionType OptionType { get; set; } = OptionType.新增; + /// /// 订单Id /// @@ -13,12 +18,12 @@ public class TrackPushAfterUpdateOrderEvent public int TrackContentId { get; set; } /// - /// 是否成功 + /// 问题类型 /// public bool IsSuccess { get; set; } /// - /// 最新描述 + /// 问题描述 /// public string? Message { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs index c7277eb2..b74281a9 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackPushEvent.cs @@ -68,7 +68,7 @@ public class TrackPushEvent public string? ExpandFieldsValue { get; set; } /// - /// 推送人 + /// 操作人 /// - public string? PushMan { get; set; } + public string? OperationMan { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/TrackPushAfterUpdateOrderEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackPushAfterUpdateOrderEventHandler.cs index a1953f49..a514639e 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackPushAfterUpdateOrderEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackPushAfterUpdateOrderEventHandler.cs @@ -2,6 +2,7 @@ using SJZY.Track.Application.Contract.Events; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Consts; +using SJZY.Track.Domain.Enums; using Volo.Abp.DependencyInjection; namespace SJZY.Track.Application.EventHandlers; @@ -21,16 +22,29 @@ public class TrackPushAfterUpdateOrderEventHandler : ITransientDependency, ICapS var order = await _orderRepository.GetFirstAsync(x => x.Id == @event.OrderId); if (order == default) return; - // 异常:最近一条推送是失败 - // 预警:添加一条推送距离现在超过12h - // if (!@event.IsSuccess) - // { - // order.QuestionType = TrackPushProblemType.Error; - // } + /* + * 异常:最近一条推送是失败 + */ + if (!@event.IsSuccess) + { + order.QuestionType = (int)TrackPushProblemType.Error; + order.ProblemDescription = @event.Message; + } + else + { + order.QuestionType = (int)TrackPushProblemType.None; + if (@event.OptionType == OptionType.新增) + { + // tips:只有新增会影响推送进度? + order.LatestPushTrackContentId = @event.TrackContentId; + order.LatestPushTime = DateTime.Now; + } + } + await _orderRepository.UpdateColumnAsync(order, x => new { - x.LatestPushTrackContentId, x.QuestionType + x.LatestPushTrackContentId, x.QuestionType, x.ProblemDescription, x.LatestPushTime }); } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs index b2b977a8..5aa94802 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs @@ -25,24 +25,54 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe [CapSubscribe(GlobalConst.TrackPushSubscribe)] public async Task ConsumerAsync(TrackPushEvent @event) { + InterfaceRelayUnifyResultDto res = null!; switch (@event.OptionType) { case OptionType.无: - break; + return; case OptionType.新增: - await PushAddAsync(@event); + res = await PushAddAsync(@event); break; case OptionType.删除: break; case OptionType.修改: - await PushUpdateAsync(@event); + res = await PushUpdateAsync(@event); break; default: throw new ArgumentOutOfRangeException(); } + + var isSuccess = res.Code == InterfaceRelayConst.SuccessCode; + + // 写推送日志 + await _trackPushRecordsRepository.AddAsync(new TrackPushRecordIndex + { + IndexName = $"{GlobalConst.TrackPushRecordsIndex}-{DateTime.Now:yyyy.MM.dd}", + RequestId = res.RequestId, + Message = res.Msg, + OptionType = @event.OptionType.ToString(), + TrackPlace = @event.TrackPlace, + TrackTime = @event.TrackTime, + TrackTimeZone = @event.TrackTimeZone, + IsSuccess = isSuccess, + IsAuto = @event.OperationMan == null, + CreateUser = @event.OperationMan ?? "系统", + CreateTime = DateTime.Now + }); + + // 更新订单主表(异步) + await _capPublisher.PublishAsync(GlobalConst.TrackPushAfterUpdateOrderSubscribe, + new TrackPushAfterUpdateOrderEvent + { + OptionType = @event.OptionType, + OrderId = @event.OrderId, + TrackContentId = @event.TrackContentId, + IsSuccess = isSuccess, + Message = res.Msg + }); } - private async Task PushAddAsync(TrackPushEvent @event) + private async Task PushAddAsync(TrackPushEvent @event) { var data = new { @@ -68,33 +98,10 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var res = await _httpClientProxy.Service.ForwardWithSubscribeAsync(InterfaceRelayConst.PushTrackInterfaceCode, @event.ServiceProviderCode, data); - var isSuccess = res.Code == InterfaceRelayConst.SuccessCode; - // 写推送日志 - await _trackPushRecordsRepository.AddAsync(new TrackPushRecordIndex - { - IndexName = $"{GlobalConst.TrackPushRecordsIndex}-{DateTime.Now:yyyy.MM.dd}", - RequestId = res.RequestId, - OptionType = OptionType.新增, - TrackPlace = @event.TrackPlace, - TrackTime = @event.TrackTime, - TrackTimeZone = @event.TrackTimeZone, - IsSuccess = isSuccess, - CreateUser = @event.PushMan ?? "系统", - CreateTime = DateTime.Now - }); - - // 更新订单主表 - await _capPublisher.PublishAsync(GlobalConst.TrackPushAfterUpdateOrderSubscribe, - new TrackPushAfterUpdateOrderEvent - { - OrderId = @event.OrderId, - TrackContentId = @event.TrackContentId, - IsSuccess = isSuccess, - Message = res.Msg - }); + return res; } - private async Task PushUpdateAsync(TrackPushEvent @event) + private async Task PushUpdateAsync(TrackPushEvent @event) { var data = new { @@ -117,7 +124,9 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe }; - await _httpClientProxy.Service.ForwardWithSubscribeAsync(InterfaceRelayConst.TrackUpdateInterfaceCode, + var res = await _httpClientProxy.Service.ForwardWithSubscribeAsync(InterfaceRelayConst.TrackUpdateInterfaceCode, @event.ServiceProviderCode, data); + + return res; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs index f1f72e52..de894ef4 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs @@ -74,7 +74,7 @@ public class TrackPullService : ApplicationService /// [AllowAnonymous] [HttpPost("Track/RefreshForTask")] - public async Task RefreshTrackAsync() + public async Task RefreshForTaskAsync() { var configs = await _trackPullCacheService.GetAllPullConfigsAsync(); foreach (var config in configs) diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs index 1ad3a61c..9c24046b 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs @@ -5,6 +5,7 @@ using SJZY.Track.Application.Contract.Services; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Consts; +using SJZY.Track.Domain.Enums; using SJZY.UserCenter.HttpApi.Services; namespace SJZY.Track.Application.Services.ProvideServices; @@ -86,7 +87,7 @@ public class TrackPushService : ApplicationService TrackEnContentValue = config.TrackEnContentValue, TrackStatusValue = config.TrackStatusValue, ExpandFieldsValue = config.ExpandFieldsValue, - PushMan = CurrentUserRequest.CurrentUser.Name, + OperationMan = CurrentUserRequest.CurrentUser.Name, }; await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, trackPushEvent); @@ -96,4 +97,23 @@ public class TrackPushService : ApplicationService return $"即将推送轨迹代码{input.TrackCode}给{res}个订单"; } + + + /// + /// 定时任务推送预警(》12小时没有推送的) + /// + /// + [HttpPost("Track/PushWarnForTask")] + public async Task PushWarnForTaskAsync() + { + var time = DateTime.Now.Subtract(TimeSpan.FromHours(12)); + var orders = await _orderRepository.GetListAsync(x => + !x.IsCompleted && x.QuestionType == 0 && x.LatestPushTime < time); + + orders.ForEach(x => { x.QuestionType = (int)TrackPushProblemType.Warn; }); + + await _orderRepository.UpdateRangeAsync(orders, x => new { x.QuestionType }); + + return $"成功将{orders.Select(x => x.OrderNo).JoinAsString(",")}置为预警单"; + } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs index 3defe94f..2553cb31 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs @@ -48,6 +48,12 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot [SugarColumn(ColumnName = "LatestPushTrackContentId")] public int? LatestPushTrackContentId { get; set; } + /// + /// 最新推送时间(异步维护) + /// + [SugarColumn(ColumnName = "LatestPushTime")] + public DateTime? LatestPushTime { get; set; } + /// /// 最新轨迹内容(异步维护) /// @@ -115,10 +121,10 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot public int QuestionType { get; set; } /// - /// 问题描述(主数据枚举TrackProblemDescription) + /// 问题描述 /// [SugarColumn(ColumnName = "ProblemDescription")] - public int ProblemDescription { get; set; } + public string? ProblemDescription { get; set; } /// /// 起运港口 diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs index 66800c8a..ef9dfb74 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs @@ -1,5 +1,4 @@ using Nest; -using SJZY.Expand.ABP.Common.Enums; using SJZY.Expand.ElasticSearch; using SJZY.Track.Domain.Consts; @@ -18,10 +17,20 @@ public class TrackPushRecordIndex : IdBaseIndex /// public Guid RequestId { get; set; } + /// + /// 信息 + /// + public string Message { get; set; } = null!; + /// /// 操作类型 /// - public OptionType OptionType { get; set; } + public string OptionType { get; set; } = null!; + + /// + /// 是否自动推送 + /// + public bool IsAuto { get; set; } /// /// 轨迹发生地 diff --git a/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs b/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs index c6b966e6..3dd85154 100644 --- a/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs +++ b/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace SJZY.Track.Domain.Dtos.Order +namespace SJZY.Track.Domain.Dtos.Order { public class GetPageTrackOrderInputVO : PageInfoInput { @@ -97,7 +91,7 @@ namespace SJZY.Track.Domain.Dtos.Order /// /// 客户id /// - public int CustomerId { get; set; } + public int CustomerId { get; set; } ///// ///// 订单明细(json) @@ -162,11 +156,11 @@ namespace SJZY.Track.Domain.Dtos.Order /// /// 问题描述(主数据枚举TrackProblemDescription) /// - public int ProblemDescription { get; set; } + public string? ProblemDescription { get; set; } /// /// 问题描述名称 /// public string? ProblemDescriptionName { get; set; } } -} +} \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Queries/TrackOrderQueries.cs b/src/SJZY.Track.Repository/Queries/TrackOrderQueries.cs index 73a566d0..108026b9 100644 --- a/src/SJZY.Track.Repository/Queries/TrackOrderQueries.cs +++ b/src/SJZY.Track.Repository/Queries/TrackOrderQueries.cs @@ -73,15 +73,6 @@ public class TrackOrderQueries : ISugarRepository, ITrackOrderQueries, 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,