diff --git a/TrackCenter.sln b/TrackCenter.sln index fde6097c..85473f2d 100644 --- a/TrackCenter.sln +++ b/TrackCenter.sln @@ -8,12 +8,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TrackCenter.Application", " EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{DAC93270-5A25-40E5-B851-E7CA398DBC31}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{0E2537C3-6EF3-4085-9BD2-CF923E53F82A}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TrackCenter.Repository", "src\TrackCenter.Repository\TrackCenter.Repository.csproj", "{D9CF5706-1972-414F-821E-AA32C13B8570}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SJZY.Track.Test", "test\SJZY.Track.Test\SJZY.Track.Test.csproj", "{3A53539C-4A85-4E5D-A071-7B4B193AB0E0}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TrackCenter.Domain", "src\TrackCenter.Domain\TrackCenter.Domain.csproj", "{073EB297-E752-49AC-BED8-B4AEBAB518F6}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution items", "solution items", "{086C7812-46F9-49FD-B490-A769E2C0729E}" @@ -43,10 +39,6 @@ Global {D9CF5706-1972-414F-821E-AA32C13B8570}.Debug|Any CPU.Build.0 = Debug|Any CPU {D9CF5706-1972-414F-821E-AA32C13B8570}.Release|Any CPU.ActiveCfg = Release|Any CPU {D9CF5706-1972-414F-821E-AA32C13B8570}.Release|Any CPU.Build.0 = Release|Any CPU - {3A53539C-4A85-4E5D-A071-7B4B193AB0E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3A53539C-4A85-4E5D-A071-7B4B193AB0E0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3A53539C-4A85-4E5D-A071-7B4B193AB0E0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3A53539C-4A85-4E5D-A071-7B4B193AB0E0}.Release|Any CPU.Build.0 = Release|Any CPU {073EB297-E752-49AC-BED8-B4AEBAB518F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {073EB297-E752-49AC-BED8-B4AEBAB518F6}.Debug|Any CPU.Build.0 = Debug|Any CPU {073EB297-E752-49AC-BED8-B4AEBAB518F6}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -59,7 +51,6 @@ Global {5F1A9619-A5A3-4F5F-AEFF-880707A251E1} = {DAC93270-5A25-40E5-B851-E7CA398DBC31} {E052AEB3-A86F-431E-A685-769D3E59CB8A} = {DAC93270-5A25-40E5-B851-E7CA398DBC31} {D9CF5706-1972-414F-821E-AA32C13B8570} = {DAC93270-5A25-40E5-B851-E7CA398DBC31} - {3A53539C-4A85-4E5D-A071-7B4B193AB0E0} = {0E2537C3-6EF3-4085-9BD2-CF923E53F82A} {073EB297-E752-49AC-BED8-B4AEBAB518F6} = {DAC93270-5A25-40E5-B851-E7CA398DBC31} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution diff --git a/src/TrackCenter.Api/TrackCenter.Api.csproj b/src/TrackCenter.Api/TrackCenter.Api.csproj index 9cb80144..1c211d7d 100644 --- a/src/TrackCenter.Api/TrackCenter.Api.csproj +++ b/src/TrackCenter.Api/TrackCenter.Api.csproj @@ -19,7 +19,7 @@ - + diff --git a/src/TrackCenter.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs b/src/TrackCenter.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs index 32aafd8b..eebcee8b 100644 --- a/src/TrackCenter.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs +++ b/src/TrackCenter.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs @@ -1,5 +1,4 @@ using DotNetCore.CAP; -using Fake.DependencyInjection; using TrackCenter.Application.Events; using TrackCenter.Application.Services.Warning.Handlers; using TrackCenter.Domain.Aggregates.OrderAggregate; diff --git a/src/TrackCenter.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/TrackCenter.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index 75efca83..5bb3a310 100644 --- a/src/TrackCenter.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/TrackCenter.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -1,7 +1,5 @@ using System.Collections.Immutable; using DotNetCore.CAP; -using Fake.Application; -using Fake.DependencyInjection; using InterfaceForward.Domain.Shared.Helpers; using TrackCenter.Application.Dtos.ProvideServices; using TrackCenter.Application.Events; diff --git a/src/TrackCenter.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/TrackCenter.Application/CAP/EventHandlers/TrackPushEventHandler.cs index e47958d5..efa8ca32 100644 --- a/src/TrackCenter.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/TrackCenter.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -1,8 +1,6 @@ using System.Collections.Immutable; using System.Text.Json; using DotNetCore.CAP; -using Fake.Application; -using Fake.DependencyInjection; using InterfaceForward.Domain.Shared.Helpers; using Microsoft.Extensions.Options; using Newtonsoft.Json; @@ -59,7 +57,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (pushConfigs == null || pushConfigs.Count == 0) return; if (pushConfigs.First().ServiceProviderCode.IsNullOrWhiteSpace()) { - throw new CapNoRetryException($"该客户{@event.CustomId}未关联服务商,无法推送"); + throw new BusinessException(GlobalConst.CapNoRetryErrorCode, $"该客户{@event.CustomId}未关联服务商,无法推送"); } _pushConfigs = pushConfigs; @@ -70,7 +68,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe .ToDictionary(x => x.Key, y => y.OrderBy(item => item.Sort).ToList()); // 查找所有订单 - var orderIds = @event.OrderIdEsIdVersionDict.Keys.ToHashSet(); + var orderIds = @event.OrderIdTrackMetadataDict.Keys.ToHashSet(); var orders = await _orderRepository.GetListAsync(x => orderIds.Contains(x.Id), x => new OrderEntity { @@ -130,20 +128,20 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { var asciiString = Base64Helper.SerializeObject(OptionType.新增.ToString()); var serviceProviderCode = _pushConfigs.First().ServiceProviderCode; - // var r = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( - // _options.CurrentValue.PushTrackInterfaceCode, - // serviceProviderCode, - // items.Cast().ToList(), - // GlobalConst.TrackPushCompletedSubscribe, - // attach: asciiString); - // - // if (r.Code != GlobalConst.SuccessCode) - // { - // TrackPushFailedPublicTopic($"轨迹中台调用接口通失败,RequestId: {r.RequestId}; Msg: {r.Msg}", @event, r.RequestId, - // items.Cast().ToList()); - // throw new BusinessException( - // message: $"requestId: {r.RequestId}; serviceProviderCode:{serviceProviderCode} Msg: {r.Msg}"); - // } + var r = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( + _options.CurrentValue.PushTrackInterfaceCode, + serviceProviderCode, + items.Cast().ToList(), + GlobalConst.TrackPushCompletedSubscribe, + attach: asciiString); + + if (r.Code != GlobalConst.SuccessCode) + { + TrackPushFailedPublicTopic($"轨迹中台调用接口通失败,RequestId: {r.RequestId}; Msg: {r.Msg}", @event, r.RequestId, + items.Cast().ToList()); + throw new BusinessException( + message: $"requestId: {r.RequestId}; serviceProviderCode:{serviceProviderCode} Msg: {r.Msg}"); + } } } @@ -179,7 +177,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe return; } - var esIdVersion = @event.OrderIdEsIdVersionDict[order.Id]; + var trackMetadata = @event.OrderIdTrackMetadataDict[order.Id]; var log = new TrackPushRecordIndex { // 订单信息 @@ -188,8 +186,9 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe SubSystemCode = @event.SubSystemCode, // 轨迹信息 - TrackEsId = esIdVersion.Key, - TrackVersion = esIdVersion.Value, + TrackEsId = trackMetadata.EsId, + TrackVersion = trackMetadata.Version, + TrackCreateTime = trackMetadata.TrackCreateTime, TrackStatusId = @event.SystemPushInfo.TrackStatusId, TrackStatus = @event.SystemPushInfo.TrackStatus, TrackContentId = @event.SystemPushInfo.TrackContentId, @@ -200,6 +199,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, CompareFields = @event.SystemPushInfo.CompareFields, Extra = @event.SystemPushInfo.Extra, + ServiceProviderCode = config.ServiceProviderCode, // 操作信息 OptionType = @event.OptionType.ToString(), @@ -258,7 +258,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe continue; } - var esIdVersion = @event.OrderIdEsIdVersionDict[order.Id]; + var trackMetadata = @event.OrderIdTrackMetadataDict[order.Id]; var log = new TrackPushRecordIndex { //订单信息 @@ -267,8 +267,9 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe SubSystemCode = @event.SubSystemCode, //轨迹信息 - TrackEsId = esIdVersion.Key, - TrackVersion = esIdVersion.Value, + TrackEsId = trackMetadata.EsId, + TrackVersion = trackMetadata.Version, + TrackCreateTime = trackMetadata.TrackCreateTime, TrackStatusId = @event.SystemPushInfo.TrackStatusId, TrackStatus = @event.SystemPushInfo.TrackStatus, TrackContentId = @event.SystemPushInfo.TrackContentId, @@ -279,6 +280,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, CompareFields = @event.SystemPushInfo.CompareFields, Extra = @event.SystemPushInfo.Extra, + ServiceProviderCode = config.ServiceProviderCode, //操作信息 OptionType = @event.OptionType.ToString(), @@ -314,7 +316,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe continue; } - var esIdVersion = @event.OrderIdEsIdVersionDict[order.Id]; + var trackMetadata = @event.OrderIdTrackMetadataDict[order.Id]; var log = new TrackPushRecordIndex { // 订单信息 @@ -323,8 +325,9 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe SubSystemCode = @event.SubSystemCode, // 轨迹信息 - TrackEsId = esIdVersion.Key, - TrackVersion = esIdVersion.Value, + TrackEsId = trackMetadata.EsId, + TrackVersion = trackMetadata.Version, + TrackCreateTime = trackMetadata.TrackCreateTime, TrackStatusId = @event.SystemPushInfo.TrackStatusId, TrackStatus = @event.SystemPushInfo.TrackStatus, TrackContentId = @event.SystemPushInfo.TrackContentId, @@ -335,6 +338,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, CompareFields = @event.SystemPushInfo.CompareFields, Extra = @event.SystemPushInfo.Extra, + ServiceProviderCode = config.ServiceProviderCode, //操作信息 OptionType = @event.OptionType.ToString(), @@ -352,20 +356,20 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { var asciiString = Base64Helper.SerializeObject(OptionType.修改.ToString()); var serviceProviderCode = _pushConfigs.First().ServiceProviderCode; - // var r = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( - // _options.CurrentValue.TrackUpdateInterfaceCode, - // serviceProviderCode, - // items.Cast().ToList(), - // GlobalConst.TrackPushCompletedSubscribe, - // attach: asciiString); - // - // if (r.Code != GlobalConst.SuccessCode) - // { - // TrackPushFailedPublicTopic($"轨迹中台调用接口通失败,RequestId: {r.RequestId}; Msg: {r.Msg}", @event, r.RequestId, - // items.Cast().ToList()); - // throw new BusinessException( - // message: $"requestId: {r.RequestId}; serviceProviderCode:{serviceProviderCode} Msg: {r.Msg}"); - // } + var r = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( + _options.CurrentValue.TrackUpdateInterfaceCode, + serviceProviderCode, + items.Cast().ToList(), + GlobalConst.TrackPushCompletedSubscribe, + attach: asciiString); + + if (r.Code != GlobalConst.SuccessCode) + { + TrackPushFailedPublicTopic($"轨迹中台调用接口通失败,RequestId: {r.RequestId}; Msg: {r.Msg}", @event, r.RequestId, + items.Cast().ToList()); + throw new BusinessException( + message: $"requestId: {r.RequestId}; serviceProviderCode:{serviceProviderCode} Msg: {r.Msg}"); + } } } diff --git a/src/TrackCenter.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/TrackCenter.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index 6a5bc0e1..5278ca1d 100644 --- a/src/TrackCenter.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/TrackCenter.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -1,5 +1,4 @@ using DotNetCore.CAP; -using Fake.DependencyInjection; using InterfaceForward.Domain.Shared.Helpers; using Microsoft.Extensions.Logging; using TrackCenter.Application.Events; @@ -58,11 +57,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe var canNextOrderIds = new List(); - var content = await HandleTrackAsync(@event, canNextOrderIds); - - // 处理广播事件 - if (content != null && (content.IsToMq || @event.IsToMq)) - _ = EnsureWriteAfterPublicTopicAsync(@event, content.IsExternal, content.SubSystemCode, content.TrackStatusCode); + await HandleTrackAsync(@event, canNextOrderIds); if (canNextOrderIds.Count == 0) return; // 根据订单关联关系异步向下刷(异步) @@ -147,32 +142,46 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe return true; } - private async Task HandleTrackAsync(TrackUpsertEvent @event, List canNextOrderIds) + private async Task HandleTrackAsync(TrackUpsertEvent @event, List canNextOrderIds) { + //#7001:未来潜在需求,当轨迹内容匹配预设,记录一个标记,保证下刷过程都是使用预设内容 var trackContent = await _provideQueries.GetTrackContentAsync(@event.SubSystemId, @event.TrackCode); if (trackContent == null) { // 找不到轨迹内容,直接结束 LogHelper.Warn($"找不到轨迹内容:{@event}", true); - return null; + return; } - //#7001:未来潜在需求,当轨迹内容匹配预设,记录一个标记,保证下刷过程都是使用预设内容 - //虽然在引发事件之前做了判断,引发之后并不一定立即处理,在此过程中轨迹内容仍然可能被修改,所以要二次进行判断。 - //通过来源指示是否为手动操作 + // 根据轨迹内容标识,确定操作权限 var manualOperation = @event.Source == (int) TrackSourceEnum.Artificial; - //轨迹内容标识不允许手动创建的 - if (manualOperation && @event.IsAdd && trackContent.IsAllowManuallyCreate == false) return trackContent; - //轨迹内容标识不允许手动更新的 - if (manualOperation && !@event.IsAdd && trackContent.IsAllowManuallyUpdate == false) return trackContent; + // 不允许手动创建 + if (manualOperation && @event.IsAdd && trackContent.IsAllowManuallyCreate == false) + { + PublicTopicAllFailed(@event, trackContent, "轨迹内容标识不允许手动创建"); + return; + } - // k:[orderId] v:[k:EsId,v:Version] - var orderIdEsIdVersionDict = new Dictionary>(); + // 不允许手动更新 + if (manualOperation && !@event.IsAdd && trackContent.IsAllowManuallyUpdate == false) + { + PublicTopicAllFailed(@event, trackContent, "轨迹标识内容不允许手动更新"); + return; + } - var insertTracks = await UpsertTrackAsync(@event, canNextOrderIds, trackContent, orderIdEsIdVersionDict); + // k:[orderId] v:{EsId,Version,TrackCreateTime} + var orderIdTrackMetadataDict = new Dictionary(); - if (canNextOrderIds.Count == 0) return trackContent; + var trackChangeEtos = new List(); + + var insertTracks = await UpsertTrackAsync(@event, canNextOrderIds, trackContent, orderIdTrackMetadataDict, trackChangeEtos); + + if (canNextOrderIds.Count == 0) + { + await TrackChangePublicTopicAsync(trackContent, trackChangeEtos); + return; + } if (insertTracks.Any()) { @@ -180,7 +189,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe await _trackDetailsEsRepository.AddManyAsync(insertTracks); // es新增后填充版本号字典 - insertTracks.ForEach(t => orderIdEsIdVersionDict.Add(t.OrderId, KeyValuePair.Create(t.Id, t.Version))); + insertTracks.ForEach(t => orderIdTrackMetadataDict.Add(t.OrderId, TrackMetadata.Build(t.Id, t.Version, t.CreateTime))); //批量写入订单操作日志 _ = _orderOperationRecordEsRepository.AddManyAsync(insertTracks.Select(t => BuildOrderOperationRecord(@event, t, new OrderIdentifier @@ -193,20 +202,24 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe await _orderRepository.UpdatePullStatusToSilenceAsync(insertTracks.Select(x => x.OrderId).ToList(), @event.TrackCode); - // todo:引发预警计算 改MQ批量+分流 - WarningCalc_AddedTrack(insertTracks); + // 发布预警信号,稍后将进行预警计算 + _warningSignalPublisher.PublishSignal(WarningSignalType.轨迹新增, insertTracks); - // 添加轨迹触发预警计算(异步)todo:弃用 - // await _capPublisher.PublishAsync(GlobalConst.TrackWarningCalcSubscribe, new TrackWarningCalcEvent - // { - // SubSystemId = @event.SubSystemId, - // CustomId = @event.CustomId, - // OrderIds = insertTracks.Select(x => x.OrderId).ToArray(), - // TrackStatusId = trackContent.TrackStatusId, - // TrackTime = @event.TrackTime, - // }); + // 如果存在轨迹标记,则触发订单pod拉取 + if (!string.IsNullOrWhiteSpace(trackContent.TrackFlagId)) + { + await _capPublisher.PublishAsync(GlobalConst.OrderPodPullSubscribe, new OrderPodPullEvent + { + SubSystemCode = trackContent.SubSystemCode, + OrderIdEsIdDict = insertTracks.ToDictionary(x => x.OrderId, y => y.Id), + TrackFlagIds = trackContent.TrackFlagId.Split(',').Select(int.Parse).ToHashSet() + }); + } } + // 触发轨迹变更广播 + await TrackChangePublicTopicAsync(trackContent, trackChangeEtos, true); + // 触发订单主表更新事件(异步) await _capPublisher.PublishAsync(GlobalConst.TrackChangeAfterUpdateOrderSubscribe, new TrackChangeAfterUpdateOrderEvent @@ -231,7 +244,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe SubSystemId = @event.SubSystemId, SubSystemCode = trackContent.SubSystemCode, CustomId = @event.CustomId, - OrderIdEsIdVersionDict = orderIdEsIdVersionDict, + OrderIdTrackMetadataDict = orderIdTrackMetadataDict, TrackCode = @event.TrackCode, SystemPushInfo = new SystemPushStruct { @@ -249,15 +262,14 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe IsToMq = (trackContent.IsToMq || @event.IsToMq) }; await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, trackPushEvent); - - return trackContent; } private async Task> UpsertTrackAsync( TrackUpsertEvent @event, List canNextOrderIds, TrackContentVO trackContent, - Dictionary> orderIdEsIdVersionDict + Dictionary orderIdTrackMetadataDict, + List trackChangeEtos ) { var orderIds = @event.OrderIdentifiers.Select(x => x.OrderId).ToArray(); @@ -280,7 +292,14 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe var trackById = tracks.FirstOrDefault(x => x.Id == @event.EsId); if (trackById != null) { - updateTracks.Add(BuiltUpdateTrack(@event, trackById, order, trackContent)); + var updateTrack = BuiltUpdateTrack(@event, trackById, order, trackContent); + updateTracks.Add(updateTrack); + AddTrackChangeEto(trackChangeEtos, @event, trackContent, order.OrderNo, updateTrack.Id); + } + else + { + var message = $"没有通过传入的EsId:[{@event.EsId}]查询到轨迹信息,更新失败"; + AddTrackChangeEto(trackChangeEtos, @event, trackContent, order.OrderNo, null, message); } continue; @@ -327,36 +346,42 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe { if (existTracks.Count > 0) { - _logger.LogInformation("订单已经存在不允许重复的轨迹,不允许重复添加:{@event}", @event); - traceLog.Add($"OrderNo-{order.OrderNo}", "订单已经存在不允许重复的轨迹,不允许重复添加"); + const string message = "订单已经存在不允许重复的轨迹,不允许重复添加"; + traceLog.Add($"OrderNo-{order.OrderNo}", message); + AddTrackChangeEto(trackChangeEtos, @event, trackContent, order.OrderNo, null, message); continue; } - insertTracks.Add(BuiltNewTrack(@event, order, trackContent)); + var addTrack = BuiltNewTrack(@event, order, trackContent); + insertTracks.Add(addTrack); + AddTrackChangeEto(trackChangeEtos, @event, trackContent, order.OrderNo, addTrack.Id); } else { // 不存在不让改 if (existTracks.Count == 0) { - _logger.LogInformation("订单不存在轨迹,不允许修改:{@event}", @event); - traceLog.Add($"OrderNo-{order.OrderNo}", "订单不存在轨迹,不允许修改"); + const string message = "订单不存在轨迹,不允许修改"; + traceLog.Add($"OrderNo-{order.OrderNo}", message); + AddTrackChangeEto(trackChangeEtos, @event, trackContent, order.OrderNo, null, message); continue; } if (existTracks.Count > 1) { - _logger.LogInformation("订单存在多条轨迹不允许修改:{@event}", @event); - traceLog.Add($"OrderNo-{order.OrderNo}", "订单存在多条轨迹不允许修改"); + const string message = "订单存在多条轨迹不允许修改"; + traceLog.Add($"OrderNo-{order.OrderNo}", message); + AddTrackChangeEto(trackChangeEtos, @event, trackContent, order.OrderNo, null, message); continue; } var track = existTracks.First(); - updateTracks.Add(BuiltUpdateTrack(@event, track, order, trackContent)); + var updateTrack = BuiltUpdateTrack(@event, track, order, trackContent); + updateTracks.Add(updateTrack); operationRecords.Add(BuildOrderOperationRecord(@event, track, order)); + AddTrackChangeEto(trackChangeEtos, @event, trackContent, order.OrderNo, updateTrack.Id); } - canNextOrderIds.Add(order.OrderId); } @@ -366,23 +391,21 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe { // 批量差异化更新轨迹 await _trackDetailsEsRepository.BulkUpdateAsync(updateTracks); - // 获取更新后的版本号 - updateTracks.ForEach(x => orderIdEsIdVersionDict.Add(x.OrderId, KeyValuePair.Create(x.Id, x.Version))); + // 填充轨迹元数据 + updateTracks.ForEach(x => orderIdTrackMetadataDict.Add(x.OrderId, TrackMetadata.Build(x.Id, x.Version, x.CreateTime))); // 批量写入操作日志 _ = _orderOperationRecordEsRepository.AddManyAsync(operationRecords); - - // todo:引发预警计算 改MQ批量+分流 - WarningCalc_UpdatedTrack(updateTracks); + // 发布预警信号稍后将进行预警计算 + _warningSignalPublisher.PublishSignal(WarningSignalType.轨迹更新, tracks); } return insertTracks; } - private static TrackDetailsIndex BuiltUpdateTrack(TrackUpsertEvent @event, TrackDetailsIndex track, OrderIdentifier order, - TrackContentVO trackContent) + private static TrackDetailsIndex BuiltUpdateTrack(TrackUpsertEvent @event, TrackDetailsIndex track, OrderIdentifier order, TrackContentVO trackContent) { - //外部轨迹,轨迹发生地,轨迹发生时间,轨迹发生时区,不允许更改 + // 非外部轨迹才允许修改 【发生地】【时间】【时区】 if (track.Source != (int) TrackSourceEnum.ExternalServiceProvide) { track.TrackPlace = @event.TrackPlace; @@ -390,24 +413,11 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe track.TrackTimeZone = @event.TrackTimeZone; } - track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 - ? track.TrackTime - : track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); - track.UpdateUser = @event.OperationMan ?? GlobalConst.SystemUser; - track.UpdateTime = DateTime.Now; - - //允许二次修改,在修改了轨迹内容后进行修改轨迹操作,如果输入的轨迹内容则以输入为准 - //跨子系统? + //允许二次修改轨迹内容 track.TrackContent = string.IsNullOrWhiteSpace(@event.Content) ? trackContent.TrackContent : @event.Content; track.TrackEnContent = string.IsNullOrWhiteSpace(@event.EnStatus) ? trackContent.TrackEnContent : @event.EnStatus; - //当传入的IsExternal为空,则使用轨迹内容中的IsExternal - track.IsExternal = @event.IsExternal ?? trackContent.IsExternal; - track.Remarks = @event.Remarks ?? GlobalConst.EmptyString; - track.Files = @event.Files?.Select(x => new FileItem - { - OssKey = x.OssKey, - FileName = x.FileName - }).ToList(); + + // 轨迹发生地的更多信息 track.TrackPlaceCity = @event.TrackPlaceCity ?? GlobalConst.EmptyString; track.TrackPlaceCityId = @event.TrackPlaceCityId ?? GlobalConst.NotExistId; track.TrackPlaceProvince = @event.TrackPlaceProvince ?? GlobalConst.EmptyString; @@ -415,9 +425,31 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe track.TrackPlaceNation = @event.TrackPlaceNation ?? GlobalConst.EmptyString; track.TrackPlaceNationId = @event.TrackPlaceNationId ?? GlobalConst.NotExistId; track.TrackPlacePostcode = @event.TrackPlacePostcode ?? GlobalConst.EmptyString; + + // 签收地时区,签收地时间 track.DestinationTimeZone = @event.DestinationTimeZone; track.EstimatedDeliveryDate = @event.EstimatedDeliveryDate; + + // 转换为utc0的时间 + track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 + ? track.TrackTime + : track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); + + // 轨迹标记ids,是否对外,备注,扩展信息,附件 + track.TrackFlagIds = trackContent.TrackFlagId; + track.IsExternal = @event.IsExternal ?? trackContent.IsExternal; + track.Remarks = @event.Remarks ?? GlobalConst.EmptyString; track.Extra = @event.NewExtra ?? @event.Extra; + track.Files = @event.Files?.Select(x => new FileItem + { + OssKey = x.OssKey, + FileName = x.FileName + }).ToList(); + + + // 审计属性 + track.UpdateUser = @event.OperationMan ?? GlobalConst.SystemUser; + track.UpdateTime = DateTime.Now; return track; } @@ -426,36 +458,30 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe { var track = new TrackDetailsIndex { + // 订单信息 SubSystemId = @event.SubSystemId, OrderId = order.OrderId, OrderNo = order.OrderNo, OrderType = order.OrderType, + + // 轨迹信息 TrackCode = @event.TrackCode, - TrackPlace = @event.TrackPlace, - TrackTime = @event.NewTrackTime ?? @event.TrackTime, - TrackTimeZone = @event.TrackTimeZone, - ServiceProviderCode = @event.TrackRefreshData.ServiceProviderCode ?? GlobalConst.EmptyString, - OriginTrackContent = @event.TrackRefreshData.OriginTrackContent ?? GlobalConst.EmptyString, - OriginTrackDataHash = @event.TrackRefreshData.OriginTrackDataHash ?? GlobalConst.EmptyString, - CreateUser = @event.OperationMan ?? GlobalConst.SystemUser, - CreateTime = DateTime.Now, - //来源轨迹内容,第一次新增的时候使用轨迹内容表提供的 - TrackStatusId = trackContent.TrackStatusId, - TrackStatus = trackContent.TrackStatus, - TrackStatusCode = trackContent.TrackStatusCode, - //跨子系统? TrackContentId = trackContent.TrackContentId, TrackContent = string.IsNullOrWhiteSpace(@event.Content) ? trackContent.TrackContent : @event.Content, TrackEnContent = string.IsNullOrWhiteSpace(@event.EnStatus) ? trackContent.TrackEnContent : @event.EnStatus, - //当传入的IsExternal为空,则使用轨迹内容中的IsExternal - IsExternal = @event.IsExternal ?? trackContent.IsExternal, - Source = @event.Source, - Remarks = @event.Remarks ?? GlobalConst.EmptyString, - Files = @event.Files?.Select(x => new FileItem - { - OssKey = x.OssKey, - FileName = x.FileName - }).ToList(), + TrackStatusId = trackContent.TrackStatusId, + TrackStatus = trackContent.TrackStatus, + TrackStatusCode = trackContent.TrackStatusCode, + TrackTime = @event.NewTrackTime ?? @event.TrackTime, + TrackTimeZone = @event.TrackTimeZone, + TrackPlace = @event.TrackPlace, + + // 服务商轨迹信息 + ServiceProviderCode = @event.TrackRefreshData.ServiceProviderCode ?? GlobalConst.EmptyString, + OriginTrackContent = @event.TrackRefreshData.OriginTrackContent ?? GlobalConst.EmptyString, + OriginTrackDataHash = @event.TrackRefreshData.OriginTrackDataHash ?? GlobalConst.EmptyString, + + // 轨迹发生地的更多描述 TrackPlaceCity = @event.TrackPlaceCity ?? GlobalConst.EmptyString, TrackPlaceCityId = @event.TrackPlaceCityId ?? GlobalConst.NotExistId, TrackPlaceProvince = @event.TrackPlaceProvince ?? GlobalConst.EmptyString, @@ -465,9 +491,25 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackPlacePostcode = @event.TrackPlacePostcode ?? GlobalConst.EmptyString, DestinationTimeZone = @event.DestinationTimeZone, EstimatedDeliveryDate = @event.EstimatedDeliveryDate, + + // 轨迹标记ids,轨迹来源,是否对外,备注,扩展信息,附件 + TrackFlagIds = trackContent.TrackFlagId, + Source = @event.Source, + IsExternal = @event.IsExternal ?? trackContent.IsExternal, + Remarks = @event.Remarks ?? GlobalConst.EmptyString, Extra = @event.NewExtra ?? @event.Extra, + Files = @event.Files?.Select(x => new FileItem + { + OssKey = x.OssKey, + FileName = x.FileName + }).ToList(), + + // 审计属性 + CreateUser = @event.OperationMan ?? GlobalConst.SystemUser, + CreateTime = DateTime.Now }; + // 转换为utc0的时间 track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 ? track.TrackTime : track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); @@ -489,26 +531,72 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe }; } - private async Task EnsureWriteAfterPublicTopicAsync(TrackUpsertEvent @event, bool contentIsExternal, string subSystemCode, string statusCode) + private async Task TrackChangePublicTopicAsync(TrackContentVO trackContent, List list, bool isDelay = false) { + if (list.Count == 0) return; //理想情况在写入之后1s会刷盘 https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-refresh.html //增加一个版本号来确定是否真的变更了 //没有刷盘成功事件回调 //方案1:!!【轮询等待静默刷盘】查出版本号确实发生了变更在发送广播 //方案2:考虑强制刷盘(对es压力大)后发送 //方案3:采用一个较大延时,不查询直接发 - await Task.Delay(1000); - _broadcastingService.TrackChangePublicTopic(@event, contentIsExternal, subSystemCode, statusCode); + if (isDelay) + await Task.Delay(1000); + + foreach (var eto in list) + _broadcastingService.TrackChangePublicTopic(eto, trackContent.SubSystemCode); } - private void WarningCalc_AddedTrack(List tracks) + private void PublicTopicAllFailed(TrackUpsertEvent @event, TrackContentVO trackContent, string failedReason) { - _warningSignalPublisher.PublishSignal(WarningSignalType.轨迹新增, tracks); + if (trackContent.IsToMq == false && @event.IsToMq == false) return; + foreach (var orderNo in @event.OrderIdentifiers.Select(x => x.OrderNo)) + { + var eto = BuildEto(@event, trackContent, orderNo, null, failedReason); + _broadcastingService.TrackChangePublicTopic(eto, trackContent.SubSystemCode); + } } - - private void WarningCalc_UpdatedTrack(List tracks) + private static void AddTrackChangeEto(List list, TrackUpsertEvent @event, TrackContentVO trackContent, string orderNo, string? trackEsId = null, string? failedReason = null) { - _warningSignalPublisher.PublishSignal(WarningSignalType.轨迹更新, tracks); + if (trackContent.IsToMq == false && @event.IsToMq == false) return; + list.Add(BuildEto(@event, trackContent, orderNo, trackEsId, failedReason)); + } + + private static TrackChangeEto BuildEto(TrackUpsertEvent @event, TrackContentVO trackContent, string orderNo, string? trackEsId = null, string? failedReason = null) + { + return new TrackChangeEto + { + TrackEsId = trackEsId, + Option = @event.IsAdd ? 1 : 3, + IsSuccess = string.IsNullOrWhiteSpace(failedReason), + FailedReason = failedReason, + EstimatedDeliveryDate = @event.EstimatedDeliveryDate, + DestinationTimeZone = @event.DestinationTimeZone, + TrackPlacePostcode = @event.TrackPlacePostcode, + TrackPlaceNation = @event.TrackPlaceNation, + TrackPlaceNationId = @event.TrackPlaceNationId, + TrackPlaceProvince = @event.TrackPlaceProvince, + TrackPlaceProvinceId = @event.TrackPlaceProvinceId, + TrackPlaceCity = @event.TrackPlaceCity, + TrackPlaceCityId = @event.TrackPlaceCityId, + Files = @event.Files, + Remarks = @event.Remarks, + Source = @event.Source, + IsExternal = @event.IsExternal ?? trackContent.IsExternal, + TrackTimeZone = @event.TrackTimeZone, + TrackTime = @event.NewTrackTime ?? @event.TrackTime, + TrackPlace = @event.TrackPlace, + TrackStatusCode = trackContent.TrackStatusCode, + OrderNo = orderNo, + EnStatus = @event.EnStatus, + Content = @event.Content, + TrackCode = @event.TrackCode, + OperationMan = @event.OperationMan, + OrderIdentifiers = @event.OrderIdentifiers, + CustomId = @event.CustomId, + SubSystemId = @event.SubSystemId, + Extra = @event.NewExtra ?? @event.Extra + }; } } diff --git a/src/TrackCenter.Application/Caching/TrackStatusNameDictCache.cs b/src/TrackCenter.Application/Caching/TrackStatusNameDictCache.cs index 5f5bf16a..e7930437 100644 --- a/src/TrackCenter.Application/Caching/TrackStatusNameDictCache.cs +++ b/src/TrackCenter.Application/Caching/TrackStatusNameDictCache.cs @@ -1,4 +1,3 @@ -using Fake.DependencyInjection; using TrackCenter.Domain.Aggregates.TrackStatusAggregate; using TrackCenter.Domain.Extensions; using TrackCenter.Repository.Redis; diff --git a/src/TrackCenter.Application/Dtos/ProvideServices/GetTrackOutput.cs b/src/TrackCenter.Application/Dtos/ProvideServices/GetTrackOutput.cs index 75b484db..b437c9ee 100644 --- a/src/TrackCenter.Application/Dtos/ProvideServices/GetTrackOutput.cs +++ b/src/TrackCenter.Application/Dtos/ProvideServices/GetTrackOutput.cs @@ -33,18 +33,6 @@ public class TrackDetail /// public float? TimeZone { get; set; } - /// - /// 是否对外 - /// - [Obsolete("废弃的,请使用IsExternal")] - public bool IsDisplay { get; set; } - - /// - /// 客户是否可见 - /// - [Obsolete("废弃的,请使用IsExternal")] - public bool IsVisibility { get; set; } - /// /// 是否对外 /// diff --git a/src/TrackCenter.Application/Events/OrderPodPullEvent.cs b/src/TrackCenter.Application/Events/OrderPodPullEvent.cs new file mode 100644 index 00000000..9318a393 --- /dev/null +++ b/src/TrackCenter.Application/Events/OrderPodPullEvent.cs @@ -0,0 +1,12 @@ +namespace TrackCenter.Application.Events; + +public class OrderPodPullEvent +{ + // 确定子系统 + public string SubSystemCode { get; set; } + + // 订单Id esId + public Dictionary OrderIdEsIdDict { get; set; } + + public HashSet TrackFlagIds { get; set; } +} diff --git a/src/TrackCenter.Application/Events/TrackChangeEto.cs b/src/TrackCenter.Application/Events/TrackChangeEto.cs index 0e439e03..f87a7070 100644 --- a/src/TrackCenter.Application/Events/TrackChangeEto.cs +++ b/src/TrackCenter.Application/Events/TrackChangeEto.cs @@ -4,11 +4,26 @@ namespace TrackCenter.Application.Events; public class TrackChangeEto { + /// + /// 轨迹唯一id,如果操作失败则为null + /// + public string? TrackEsId { get; set; } + /// /// 操作类型:1新增,2删除,3修改 /// public int Option { get; set; } + /// + /// 操作是否成功 + /// + public bool IsSuccess { get; set; } + + /// + /// 失败原因 + /// + public string? FailedReason { get; set; } + /// /// 子系统id /// diff --git a/src/TrackCenter.Application/Events/TrackDeleteEvent.cs b/src/TrackCenter.Application/Events/TrackDeleteEvent.cs index fa0c5c0b..b7e34486 100644 --- a/src/TrackCenter.Application/Events/TrackDeleteEvent.cs +++ b/src/TrackCenter.Application/Events/TrackDeleteEvent.cs @@ -54,6 +54,11 @@ public class TrackDeleteEvent /// public List Visited { get; set; } = new(); + /// + /// 标记是否广播 + /// + public bool IsToMq { get; set; } + public override string ToString() { return $"[TrackDelete by {OperationMan}] SubSystemId: {SubSystemId}, OrderIds: {string.Join(",", diff --git a/src/TrackCenter.Application/Events/TrackPushEvent.cs b/src/TrackCenter.Application/Events/TrackPushEvent.cs index 006a3e26..2e21cfa7 100644 --- a/src/TrackCenter.Application/Events/TrackPushEvent.cs +++ b/src/TrackCenter.Application/Events/TrackPushEvent.cs @@ -34,7 +34,7 @@ public class TrackPushEvent /// /// 订单id与EsId+Version的映射字典 /// - public Dictionary> OrderIdEsIdVersionDict { get; set; } + public Dictionary OrderIdTrackMetadataDict { get; set; } /// /// 轨迹代码(我们系统的) diff --git a/src/TrackCenter.Application/GlobalUsings.cs b/src/TrackCenter.Application/GlobalUsings.cs index 9f1172d9..a1928d33 100644 --- a/src/TrackCenter.Application/GlobalUsings.cs +++ b/src/TrackCenter.Application/GlobalUsings.cs @@ -1,3 +1,5 @@ +global using Fake.Application; +global using Fake.DependencyInjection; global using TrackCenter.Domain.Consts; global using Microsoft.AspNetCore.Mvc; global using Microsoft.Extensions.DependencyInjection; diff --git a/src/TrackCenter.Application/Hangfire/WarningNotifyAggregator.cs b/src/TrackCenter.Application/Hangfire/WarningNotifyAggregator.cs index 0abbfb2b..55421803 100644 --- a/src/TrackCenter.Application/Hangfire/WarningNotifyAggregator.cs +++ b/src/TrackCenter.Application/Hangfire/WarningNotifyAggregator.cs @@ -1,4 +1,3 @@ -using Fake.DependencyInjection; using Microsoft.Extensions.Options; using TrackCenter.Application.Dtos.Warning; using TrackCenter.Application.Options; diff --git a/src/TrackCenter.Application/Hangfire/WarningTaskScanner.cs b/src/TrackCenter.Application/Hangfire/WarningTaskScanner.cs index 355e43ce..758ae638 100644 --- a/src/TrackCenter.Application/Hangfire/WarningTaskScanner.cs +++ b/src/TrackCenter.Application/Hangfire/WarningTaskScanner.cs @@ -1,4 +1,3 @@ -using Fake.DependencyInjection; using Hangfire; using Microsoft.Extensions.Options; using TrackCenter.Application.Options; diff --git a/src/TrackCenter.Application/Hangfire/WarningTaskService.cs b/src/TrackCenter.Application/Hangfire/WarningTaskService.cs index 800cef27..ecbd97f8 100644 --- a/src/TrackCenter.Application/Hangfire/WarningTaskService.cs +++ b/src/TrackCenter.Application/Hangfire/WarningTaskService.cs @@ -1,5 +1,3 @@ -using Fake.Application; -using Fake.DependencyInjection; using FeishuNetSdk; using Hangfire; using Microsoft.Extensions.Options; diff --git a/src/TrackCenter.Application/Helpers/DateTimeHelper.cs b/src/TrackCenter.Application/Helpers/DateTimeHelper.cs index 329c2a8a..fa3544ce 100644 --- a/src/TrackCenter.Application/Helpers/DateTimeHelper.cs +++ b/src/TrackCenter.Application/Helpers/DateTimeHelper.cs @@ -111,21 +111,6 @@ public static class DateTimeHelper return str; } - /// - /// 如果 is true,按照过滤 - /// - /// 被过滤的enumerable - /// 过滤条件 - /// 过滤表达式 - /// - /// - public static IEnumerable WhereIf(this IEnumerable source, bool condition, Func predicate) - { - return condition - ? source.Where(predicate) - : source; - } - /// /// 转换为utc0时区的时间转化进行Compare /// diff --git a/src/TrackCenter.Application/Helpers/OSS/OSSHelper.cs b/src/TrackCenter.Application/Helpers/OSS/OSSHelper.cs new file mode 100644 index 00000000..be87c471 --- /dev/null +++ b/src/TrackCenter.Application/Helpers/OSS/OSSHelper.cs @@ -0,0 +1,263 @@ +using System.Security.Cryptography; +using Aliyun.OSS; + +namespace TrackCenter.Application.Helpers.OSS +{ + /// + /// 阿里云OSS帮助类 + /// + public static class OSSHelper + { + #region 初始化 + private static OSSOptions _OSSOptions; + internal static void Init(OSSOptions OSSOptions) + { + _OSSOptions = OSSOptions; + } + #endregion + + #region 获取client + private static OssClient GetClient() + { + string errorMessage = null; + if (string.IsNullOrEmpty(_OSSOptions?.Endpoint)) + { + errorMessage += $"未找到核心配置参数【{nameof(_OSSOptions.Endpoint)}】!"; + } + + if (string.IsNullOrEmpty(_OSSOptions?.AccessKeyId)) + { + errorMessage += $"未找到核心配置参数【{nameof(_OSSOptions.AccessKeyId)}】!"; + } + if (string.IsNullOrEmpty(_OSSOptions?.AccessKeySecret)) + { + errorMessage += $"未找到核心配置参数【{nameof(_OSSOptions.AccessKeySecret)}】!"; + } + + if (!string.IsNullOrEmpty(errorMessage)) + { + throw new Exception(errorMessage); + } + var client = new OssClient(_OSSOptions.Endpoint, _OSSOptions.AccessKeyId, _OSSOptions.AccessKeySecret); + return client; + } + #endregion + + #region 上传 + + /// + /// 上传文件 + /// + /// 文档流 + /// 文件名称 + /// 是否使用自定义ossKey,如果为true,会以fileName为key + /// + public static UploadResultDto Upload(Stream data, string fileName = "", bool usCustomKey = false, bool isPublicBucket = false) + { + if (data == null || data.Length == 0) + return new UploadResultDto(false); + + var result = Private_Upload(fileName, data, usCustomKey, isPublicBucket); + return result; + } + + private static UploadResultDto Private_Upload(string fileName, Stream data, bool usCustomKey = false, bool isPublicBucket = false) + { + var client = GetClient(); + + var ossKey = ""; + if (usCustomKey) + { + ossKey = fileName; + } + else + { + var md5 = ComputeDataMd5(data).ToUpper();// 计算文件MD5值 + var ext = Path.GetExtension(fileName); + ossKey = $"{md5}{ext}"; + } + + + // 文件已经存在直接返回 + var existingObject = client.DoesObjectExist(_OSSOptions.BucketName, ossKey); + if (existingObject) + { + var res = new UploadResultDto(true); + res.TempUrl = ossKey.GetUrlByKey(isPublicBucket); + res.Key = ossKey; + res.FileName = fileName; + + return res; + } + + // 上传文件 + bool putResult = false; + + using (var pubObj = client.PutObject(_OSSOptions.BucketName, ossKey, data)) + { + putResult = pubObj.HttpStatusCode == System.Net.HttpStatusCode.OK; + } + + + if (putResult)//上传成功 + { + var result = new UploadResultDto(true); + result.FileName = fileName; + result.TempUrl = ossKey.GetUrlByKey(isPublicBucket); + result.Key = ossKey; + return result; + } + else + { + // 上传失败 + var result = new UploadResultDto(false); + result.FileName = fileName; + return result; + } + } + public static string ComputeDataMd5(Stream data) + { + using (var md5 = MD5.Create()) + { + var hash = BitConverter.ToString(md5.ComputeHash(data)).Replace("-", "").Replace("=", "").ToLower(); + data.Position = 0; + return hash; + } + } + #endregion + + #region 下载 + + /// + /// 通过Key获取文件的URL - 同步 + /// + /// Key + /// 下载Url + public static string GetUrlByKey(this string key, bool isPublicBucket = false) + { + if (string.IsNullOrEmpty(key)) + { + throw new Exception($"指定的key不能为空"); + } + + try + { + var client = GetClient(); + Uri url = client.GeneratePresignedUri(_OSSOptions.BucketName, key); + + if (isPublicBucket) + { + var urlStr = url?.GetLeftPart(UriPartial.Path); + return (_OSSOptions.ReturnHttpsUrl && urlStr?.ToString()?.StartsWith("http://") == true) ? "https://" + urlStr.ToString().Substring(7) : urlStr.ToString(); + } + + + return (_OSSOptions.ReturnHttpsUrl && url?.ToString()?.StartsWith("http://") == true) ? "https://" + url.ToString().Substring(7) : url.ToString(); + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } + } + + + + /// + /// 根据一组key返回url + /// + /// + /// + /// + public static Dictionary GetUrlByKeys(params string[] keys) + { + var resDic = new Dictionary(); + if (keys == null || keys.Count() <= 0) + return resDic; + + + var returnHttps = _OSSOptions.ReturnHttpsUrl; + var client = GetClient(); + + foreach (var item in keys) + { + if (resDic.ContainsKey(item)) + continue; + + Uri url = client.GeneratePresignedUri(_OSSOptions.BucketName, item); + if (url == null) + continue; + + resDic.Add(item, returnHttps ? url.ToString().Replace("http", "https") : url.ToString()); + } + return resDic; + } + + + /// + /// 通过Key获取文件流 + /// + /// Key + /// + public static Stream GetStreamByKey(this string key) + { + if (string.IsNullOrEmpty(key)) + { + throw new Exception($"指定的key不能为空"); + } + + + try + { + var client = GetClient(); + var obj = client.GetObject(_OSSOptions.BucketName, key); + if (obj != null) + { + return obj.Content; + } + else + { + throw new Exception($"文件获取异常"); + } + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } + } + #endregion + + #region 删除 + /// + /// 删除文件 + /// + /// + /// + public static DeleteObjectsResult DeleteObjectsByKeys(params string[] keys) + { + if (keys == null || keys.Length <= 0) + return default(DeleteObjectsResult); + + var client = GetClient(); + var request = new DeleteObjectsRequest(_OSSOptions.BucketName, keys); + + return client.DeleteObjects(request); + } + #endregion + + #region 查看数据信息 + /// + /// 查看文档信息 + /// + /// + /// + public static ObjectMetadata GetObjectMetadata(string ossKey) + { + var client = GetClient().GetObjectMetadata(_OSSOptions.BucketName, ossKey); + return client; + } + #endregion + + + + } +} diff --git a/src/TrackCenter.Application/Helpers/OSS/OSSOptions.cs b/src/TrackCenter.Application/Helpers/OSS/OSSOptions.cs new file mode 100644 index 00000000..a2ecd307 --- /dev/null +++ b/src/TrackCenter.Application/Helpers/OSS/OSSOptions.cs @@ -0,0 +1,32 @@ +namespace TrackCenter.Application.Helpers.OSS; + +public class OSSOptions +{ + + /// + /// 秘钥Id(类似于公钥) + /// + public string AccessKeyId { get; set; } + + /// + /// 访问秘钥 + /// + public string AccessKeySecret { get; set; } + + /// + /// OSS端点 + /// + public string Endpoint { get; set; } + + /// + /// 存储空间名称 + /// 注意,如果有多个BucketName的话,可以直接使用代码的方式设置这个值 + /// + public string BucketName { get; set; } + + /// + /// 返回https的url,默认false返回http + /// 阿里OSS默认支持http,https,不需要额外配置 + /// + public bool ReturnHttpsUrl { get; set; } +} diff --git a/src/TrackCenter.Application/Helpers/OSS/UploadResultDto.cs b/src/TrackCenter.Application/Helpers/OSS/UploadResultDto.cs new file mode 100644 index 00000000..9359d503 --- /dev/null +++ b/src/TrackCenter.Application/Helpers/OSS/UploadResultDto.cs @@ -0,0 +1,30 @@ +namespace TrackCenter.Application.Helpers.OSS; + +public class UploadResultDto +{ + /// + /// 标识本次操作是否成功 + /// + public bool IsSuccess { get; set; } + + /// + /// 临时URL,过期时间15min + /// + public string TempUrl { get; set; } + + /// + /// 文件唯一标识Key,通常保存在数据 + /// 后期所有的文件操作都是通过这个Key + /// + public string Key { get; set; } + + /// + /// 文件原始名称 + /// + public string FileName { get; set; } + + public UploadResultDto(bool isSuccess) + { + IsSuccess = isSuccess; + } +} diff --git a/src/TrackCenter.Application/Kafka/WarningSignalPublisher.cs b/src/TrackCenter.Application/Kafka/WarningSignalPublisher.cs index b81c7050..a8ccac41 100644 --- a/src/TrackCenter.Application/Kafka/WarningSignalPublisher.cs +++ b/src/TrackCenter.Application/Kafka/WarningSignalPublisher.cs @@ -1,5 +1,4 @@ using Confluent.Kafka; -using Fake.DependencyInjection; using Microsoft.Extensions.Configuration; using TrackCenter.Application.Services.Warning.Signals; using TrackCenter.Domain.Aggregates.TrackDetailsAggregate; diff --git a/src/TrackCenter.Application/Queries/ProvideQueries.cs b/src/TrackCenter.Application/Queries/ProvideQueries.cs index 4d0e2790..739026ea 100644 --- a/src/TrackCenter.Application/Queries/ProvideQueries.cs +++ b/src/TrackCenter.Application/Queries/ProvideQueries.cs @@ -20,7 +20,7 @@ namespace TrackCenter.Application.Queries; public class ProvideQueries : SqlSugarRootlessRepository, ITransientDependency { public ISqlSugarClient Context => GetDbContextAsync().Result; - public async Task> MapTrackCodesAsync(int upSubSystemId, int subSystemId, params string[] trackCodes) + public async Task> MapTrackCodesAsync(int upSubSystemId, int subSystemId, params string[] trackCodes) { // 根据上游code得到下游code return await Context.Queryable() @@ -46,34 +46,41 @@ public class ProvideQueries : SqlSugarRootlessRepository, .ToListAsync(); } + /// public async Task> FindOrderWithServiceProviderAsync(int subSystemId, List orderNos) { return await Context.Queryable() .InnerJoin((a, b) => a.Id == b.OrderId) + .LeftJoin((a, b, c) => a.SubSystemId == c.Id) .WhereIF(subSystemId > 0, a => a.SubSystemId == subSystemId) .Where((a, b) => !a.IsCompleted && orderNos.Contains(a.OrderNo) && b.StartTime <= DateTime.Now && b.EndTime >= DateTime.Now) - .Select((a, b) => new OrderWithServiceProviderVO + .Select((a, b, c) => new OrderWithServiceProviderVO { //优先使用第三方的订单号,为空时才使用主单号 OrderNo = string.IsNullOrWhiteSpace(b.OrderNo) ? a.OrderNo : b.OrderNo, OrderType = a.OrderType, SubSystemId = a.SubSystemId, ServiceProviderCode = b.ServiceProviderCode, + SubSystemCode = c.Key }) .ToListAsync(); } public async Task> FindOrderWithServiceProviderAsync( string serviceProviderCode, + int subSystemId, int pageIndex, int pageSize = 1000) { return await Context.Queryable() .InnerJoin((a, b) => a.Id == b.OrderId) - .Where((a, b) => b.ServiceProviderCode == serviceProviderCode && !a.IsCompleted - && b.StartTime <= DateTime.Now && - b.EndTime >= DateTime.Now) + .Where((a, b) => b.ServiceProviderCode == serviceProviderCode + && a.SubSystemId == subSystemId + && !a.IsCompleted + && b.StartTime <= DateTime.Now + && b.EndTime >= DateTime.Now + ) .Select((a, b) => new OrderWithServiceProviderVO { //优先使用第三方的订单号,为空时才使用主单号 @@ -87,15 +94,18 @@ public class ProvideQueries : SqlSugarRootlessRepository, .ToListAsync(); } + /// public async Task GetTrackContentAsync(int subSystemId, string trackCode) { - return await Context.Queryable() + var content = await Context.Queryable() .LeftJoin((x, y) => x.TrackStatusId == y.Id) - .LeftJoin((x, y, k) => x.SubSystemId == k.SubSystemId && k.Code == x.Code) + .LeftJoin((x, y, z) => x.SubSystemId == z.Id) .Where(x => x.SubSystemId == subSystemId && x.Code == trackCode) - .Select((x, y, k) => new TrackContentVO + .Select((x, y, z) => new TrackContentVO { + Id = x.Id, SubSystemId = x.SubSystemId, + SubSystemCode = z.Key, TrackStatusId = x.TrackStatusId, TrackStatus = y.Status, TrackStatusCode = y.Code, @@ -108,20 +118,33 @@ public class ProvideQueries : SqlSugarRootlessRepository, IsExternal = x.IsExternal, IsAllowManuallyUpdate = x.IsAllowManuallyUpdate, IsAllowManuallyCreate = x.IsAllowManuallyCreate, - IsToMq = y.IsToMq || k.IsToMq, + IsToMq = y.IsToMq, + TrackFlagId = x.TrackFlagId }) .FirstAsync(); + + if (content == null) return null; + + // 填充轨迹标记 + await FillTrackContentFlagsAsync(new List(1) + { + content + }); + + return content; } public async Task> GetTrackContentsAsync(int[] subSystemIds, string[] trackCodes) { - return await Context.Queryable() + var contents = await Context.Queryable() .LeftJoin((x, y) => x.TrackStatusId == y.Id) - .LeftJoin((x, y, k) => x.SubSystemId == k.SubSystemId && k.Code == x.Code) + .LeftJoin((x, y, z) => x.SubSystemId == z.Id) .Where(x => subSystemIds.Contains(x.SubSystemId) && trackCodes.Contains(x.Code)) - .Select((x, y, k) => new TrackContentVO + .Select((x, y, z) => new TrackContentVO { + Id = x.Id, SubSystemId = x.SubSystemId, + SubSystemCode = z.Key, TrackStatusId = x.TrackStatusId, TrackStatus = y.Status, TrackStatusCode = y.Code, @@ -134,21 +157,110 @@ public class ProvideQueries : SqlSugarRootlessRepository, IsExternal = x.IsExternal, IsAllowManuallyUpdate = x.IsAllowManuallyUpdate, IsAllowManuallyCreate = x.IsAllowManuallyCreate, - IsToMq = y.IsToMq || k.IsToMq, + IsToMq = y.IsToMq, + TrackFlagId = x.TrackFlagId }) .ToListAsync(); + + // 填充轨迹标记 + await FillTrackContentFlagsAsync(contents); + + return contents; + } + + public async Task> GetTrackContentAsync(HashSet contentIds) + { + var contents = await Context.Queryable() + .Where(x => contentIds.Contains(x.Id)) + .LeftJoin((x, y) => x.TrackStatusId == y.Id) + .LeftJoin((x, y, z) => x.SubSystemId == z.Id) + .Select((x, y, z) => new TrackContentVO + { + Id = x.Id, + SubSystemId = x.SubSystemId, + SubSystemCode = z.Key, + TrackStatusId = x.TrackStatusId, + TrackStatus = y.Status, + TrackStatusCode = y.Code, + TrackContentCode = x.Code, + TrackContentId = x.Id, + TrackContent = x.Content, + TrackEnContent = x.EnContent, + IsCompleted = y.IsCompleted, + IsRepeatable = x.IsRepeatable, + IsExternal = x.IsExternal, + IsAllowManuallyUpdate = x.IsAllowManuallyUpdate, + IsAllowManuallyCreate = x.IsAllowManuallyCreate, + IsToMq = y.IsToMq, + TrackFlagId = x.TrackFlagId + }) + .ToListAsync(); + + // 在轨迹内容填充轨迹标记 + await FillTrackContentFlagsAsync(contents); + + return contents; + } + + private async Task FillTrackContentFlagsAsync(List contents) + { + // 1.构建轨迹内容和轨迹标记Ids的映射关系 + var contentFlagIdsDict = contents + .Where(x => !string.IsNullOrWhiteSpace(x.TrackFlagId)) + .ToDictionary(x => x, y => y.TrackFlagId!.Split(",").Select(int.Parse).ToHashSet()); + if (contentFlagIdsDict.Count == 0) return; + + // 2.查轨迹标记 + var flagIds = contentFlagIdsDict.SelectMany(x => x.Value).ToHashSet(); + var flags = await Context.Queryable() + .Where(x => flagIds.Contains(x.Id)) + .Select(x => new TrackFlagVO + { + Id = x.Id, + SubSystemId = x.SubSystemId, + Code = x.Code, + Name = x.Name, + IsToMq = x.IsToMq + }) + .ToListAsync(); + if (flags.Count == 0) return; + + // 3.填充轨迹标记 + var flagDict = flags.ToDictionary(x => x.Id); + foreach (var (content, flagsIds1) in contentFlagIdsDict) + { + content.TrackFlags = flagsIds1 + .Where(x => flagDict.ContainsKey(x)) + .Select(x => flagDict[x]) + .ToList(); + + // 轨迹状态为不广播,根据轨迹标记是否为广播 + if (!content.IsToMq) + content.IsToMq = content.TrackFlags.Any(x => x.IsToMq); + } } public async Task> GetAllPullConfigsAsync() { return await Context.Queryable() .LeftJoin((a, b) => a.ServiceProviderId == b.Id) - .Select((a, b) => new TrackPullConfigVo + .LeftJoin((a, b, c) => a.SubSystemId == c.Id) + .Select((a, b, c) => new TrackPullConfigVo { PullInterval = a.PullInterval, ServiceProviderId = a.ServiceProviderId, ServiceProviderCode = b.Code, + SubSystemCode = c.Key, + SubSystemId = c.Id }) .ToListAsync(); } + + public async Task SubSystemId2CodeAsync(int subSystemId) + { + return await Context.Queryable() + .Where(x => x.Id == subSystemId) + .Select(x => x.Key) + .FirstAsync(); + } } diff --git a/src/TrackCenter.Application/Rabbit/RabbitClient.cs b/src/TrackCenter.Application/Rabbit/RabbitClient.cs index 356e79ef..9381d5e2 100644 --- a/src/TrackCenter.Application/Rabbit/RabbitClient.cs +++ b/src/TrackCenter.Application/Rabbit/RabbitClient.cs @@ -1,6 +1,7 @@ -using Fake.DependencyInjection; using Fake.RabbitMQ; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using RabbitMQ.Client; using RabbitMQ.Client.Events; @@ -9,17 +10,18 @@ namespace TrackCenter.Application.Rabbit; public class RabbitClient( IRabbitMqChannelPool channelPool, IServiceScopeFactory serviceScopeFactory, - ILogger logger) : ISingletonDependency + ILogger logger, + IOptions options) : ISingletonDependency, IHostedService { public void Subscribe(ConsumeOptions consumeOptions) { using var channelAccessor = channelPool.Acquire(consumeOptions.Queue); if (!channelAccessor.IsNew) return; - var channel = channelAccessor.Channel; + var decl = new DefaultDeclaration(channel); - consumeOptions.Declaration.Invoke(channel); + consumeOptions.Declaration.Invoke(decl); if (consumeOptions.FetchCount > 0) { @@ -105,6 +107,7 @@ public class RabbitClient( var readOnlyMemory = (ReadOnlyMemory) data; model.BasicPublish(exchange, routingKey, basicProperties, readOnlyMemory); } + model.WaitForConfirmsOrDie(); } @@ -122,15 +125,28 @@ public class RabbitClient( channelPool.Release(queueName); } -} - -public class ConsumeOptions -{ - public string Queue { get; set; } - - public ushort FetchCount { get; set; } - - public bool FailedRequeue { get; set; } - - public Action Declaration { get; set; } + + public Task StartAsync(CancellationToken cancellationToken) + { + if (options.Value.Declarations.Count > 0) + { + using var channelAccessor = channelPool.Acquire(); + var channel = channelAccessor.Channel; + var decl = new DefaultDeclaration(channel); + options.Value.Declarations.ForEach(q => q.Invoke(decl)); + } + + foreach (var opt in options.Value.Consumes) + { + Subscribe(opt); + } + + return Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + channelPool.Dispose(); + return Task.CompletedTask; + } } diff --git a/src/TrackCenter.Application/Rabbit/RabbitOptions.cs b/src/TrackCenter.Application/Rabbit/RabbitOptions.cs new file mode 100644 index 00000000..0a113675 --- /dev/null +++ b/src/TrackCenter.Application/Rabbit/RabbitOptions.cs @@ -0,0 +1,86 @@ +using RabbitMQ.Client; + +namespace TrackCenter.Application.Rabbit; + +public class RabbitOptions +{ + public string ConnectionString { get; set; } + + public List Consumes { get; set; } = new(); + + public List> Declarations { get; set; } = new(); +} + +public class ConsumeOptions +{ + /// + /// 队列名 + /// + public string Queue { get; set; } + + /// + /// 并行度 + /// + public ushort FetchCount { get; set; } = 1; + + /// + /// handle发生异常,是否重回队列 + /// + public bool FailedRequeue { get; set; } + + public Action Declaration { get; set; } +} + +public interface IDeclaration +{ + void QueueDeclare(string queue, bool durable, bool autoDelete = false, bool exclusive = false, + IDictionary arguments = null); + + void ExchangeDeclare(string exchange, string type, bool durable, bool autoDelete = false, + IDictionary arguments = null); + + void QueueBind(string queue, string exchange, string routingKey, + IDictionary arguments = null); +} + +public class DefaultDeclaration : IDeclaration +{ + private readonly IModel _chnl; + + // ReSharper disable once ConvertToPrimaryConstructor + public DefaultDeclaration(IModel chnl) + { + _chnl = chnl; + } + + public void QueueDeclare(string queue, bool durable, bool autoDelete = false, bool exclusive = false, + IDictionary arguments = null) + { + _chnl.QueueDeclare( + queue: queue, + durable: durable, + autoDelete: autoDelete, + exclusive: exclusive, + arguments: arguments); + } + + public void ExchangeDeclare(string exchange, string type, bool durable, bool autoDelete = false, + IDictionary arguments = null) + { + _chnl.ExchangeDeclare( + exchange: exchange, + type: type, + durable: durable, + autoDelete: autoDelete, + arguments: arguments); + } + + public void QueueBind(string queue, string exchange, string routingKey, IDictionary arguments) + { + _chnl.QueueBind( + queue: queue, + exchange: exchange, + routingKey: routingKey, + arguments: arguments); + } +} diff --git a/src/TrackCenter.Application/Rabbit/TrackPushCompletedEventHandler.cs b/src/TrackCenter.Application/Rabbit/TrackPushCompletedEventHandler.cs index fbd02b20..04d9c14f 100644 --- a/src/TrackCenter.Application/Rabbit/TrackPushCompletedEventHandler.cs +++ b/src/TrackCenter.Application/Rabbit/TrackPushCompletedEventHandler.cs @@ -1,6 +1,4 @@ using System.Text; -using Fake.Application; -using Fake.DependencyInjection; using Newtonsoft.Json; using RabbitMQ.Client.Events; using TrackCenter.Application.Dtos.TrackPush; diff --git a/src/TrackCenter.Application/Rabbit/TrackRefreshEventHandler.cs b/src/TrackCenter.Application/Rabbit/TrackRefreshEventHandler.cs index 31508b43..96f5eee1 100644 --- a/src/TrackCenter.Application/Rabbit/TrackRefreshEventHandler.cs +++ b/src/TrackCenter.Application/Rabbit/TrackRefreshEventHandler.cs @@ -1,7 +1,6 @@ using System.Diagnostics; using System.Text; using DotNetCore.CAP; -using Fake.DependencyInjection; using InterfaceForward.Domain.Shared.Helpers; using Microsoft.Extensions.Logging; using Newtonsoft.Json; diff --git a/src/TrackCenter.Application/Services/ApplicationServiceBase.cs b/src/TrackCenter.Application/Services/ApplicationServiceBase.cs index f83dbc06..bd38b458 100644 --- a/src/TrackCenter.Application/Services/ApplicationServiceBase.cs +++ b/src/TrackCenter.Application/Services/ApplicationServiceBase.cs @@ -1,5 +1,3 @@ -using Fake.Application; - namespace TrackCenter.Application.Services; public class ApplicationServiceBase: ApplicationService diff --git a/src/TrackCenter.Application/Services/Broadcasting/BroadcastingService.cs b/src/TrackCenter.Application/Services/Broadcasting/BroadcastingService.cs index c4442021..487dd6d4 100644 --- a/src/TrackCenter.Application/Services/Broadcasting/BroadcastingService.cs +++ b/src/TrackCenter.Application/Services/Broadcasting/BroadcastingService.cs @@ -1,5 +1,4 @@ using System.Text; -using Fake.DependencyInjection; using InterfaceForward.Domain.Shared.Helpers; using TrackCenter.Application.Dtos.TrackPush; using TrackCenter.Application.Events; @@ -19,60 +18,14 @@ public class BroadcastingService : ITransientDependency _rabbitClient = rabbitClient; } - /// - /// 轨迹变更广播 - /// - /// - /// 轨迹内容中的是否对外 - /// 子系统代码 - /// 轨迹状态代码 - /// - public void TrackChangePublicTopic(TrackUpsertEvent eto, bool contentIsExternal, string subSystemCode, string trackStatusCode) + public void TrackChangePublicTopic(TrackChangeEto eto, string subSystemCode) { - var data = new TrackChangeEto - { - EstimatedDeliveryDate = eto.EstimatedDeliveryDate, - DestinationTimeZone = eto.DestinationTimeZone, - TrackPlacePostcode = eto.TrackPlacePostcode, - TrackPlaceNation = eto.TrackPlaceNation, - TrackPlaceNationId = eto.TrackPlaceNationId, - TrackPlaceProvince = eto.TrackPlaceProvince, - TrackPlaceProvinceId = eto.TrackPlaceProvinceId, - TrackPlaceCity = eto.TrackPlaceCity, - TrackPlaceCityId = eto.TrackPlaceCityId, - Files = eto.Files, - Remarks = eto.Remarks, - Source = eto.Source, - IsExternal = eto.IsExternal ?? contentIsExternal, - TrackTimeZone = eto.TrackTimeZone, - TrackTime = eto.NewTrackTime ?? eto.TrackTime, - TrackPlace = eto.TrackPlace, - TrackStatusCode = trackStatusCode, - OrderNo = eto.OrderIdentifiers.First().OrderNo, - EnStatus = eto.EnStatus, - Content = eto.Content, - TrackCode = eto.TrackCode, - OperationMan = eto.OperationMan, - OrderIdentifiers = eto.OrderIdentifiers, - CustomId = eto.CustomId, - SubSystemId = eto.SubSystemId, - Extra = eto.NewExtra ?? eto.Extra - }; - - if (eto.IsAdd) - data.Option = 1; - else - data.Option = 3; - - _rabbitClient.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{subSystemCode}", - Encoding.UTF8.GetBytes(data.ToJson()), prop => { prop.Persistent = true; }); - } - - public void TrackChangePublicTopic(TrackChangeEto eto, string subSystemCode) - { - eto.Option = 2; - _rabbitClient.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{subSystemCode}", - Encoding.UTF8.GetBytes(eto.ToJson()), prop => { prop.Persistent = true; }); + _rabbitClient.PublishByConfirmSelect( + GlobalConst.TrackChangeExchange, + $"TrackChange.{subSystemCode}", + Encoding.UTF8.GetBytes(eto.ToJson()), + prop => { prop.Persistent = true; } + ); } /// @@ -82,11 +35,16 @@ public class BroadcastingService : ITransientDependency /// public void TrackPushCompletedPublicTopic(List list) { - var datas = list + var data = list .Select(TrackPushRecordDtoToEvent) .Select(x => Encoding.UTF8.GetBytes(x.ToJson())); var log = list.First(); - _rabbitClient.Publish(GlobalConst.TrackPushExchange, $"TrackPush.{log.SubSystemCode}", datas, prop => { prop.Persistent = true; }); + _rabbitClient.PublishByConfirmSelect( + GlobalConst.TrackPushExchange, + $"TrackPush.{log.SubSystemCode}", + data, + prop => { prop.Persistent = true; } + ); } /// diff --git a/src/TrackCenter.Application/Services/ForewarningServices/KpiAreaCacheService.cs b/src/TrackCenter.Application/Services/ForewarningServices/KpiAreaCacheService.cs index 0d04931a..68e8c6e7 100644 --- a/src/TrackCenter.Application/Services/ForewarningServices/KpiAreaCacheService.cs +++ b/src/TrackCenter.Application/Services/ForewarningServices/KpiAreaCacheService.cs @@ -1,10 +1,8 @@ -using TrackCenter.Application.Services; using TrackCenter.Domain.Aggregates.KPIAreaAggregate; -using Volo.Abp.DependencyInjection; namespace TrackCenter.Application.Services.ForewarningServices; -public class KpiAreaCacheService : IKpiAreaCacheService, ITransientDependency +public class KpiAreaCacheService : ITransientDependency { const string GlobalKpiAreaLockKey = "KpiAreaCacheService_GlobalLock"; IKpiAreaRepository _kpiAreaRepository; diff --git a/src/TrackCenter.Application/Services/ForewarningServices/KpiAreaService.cs b/src/TrackCenter.Application/Services/ForewarningServices/KpiAreaService.cs index ef4ba4e8..2109f4c8 100644 --- a/src/TrackCenter.Application/Services/ForewarningServices/KpiAreaService.cs +++ b/src/TrackCenter.Application/Services/ForewarningServices/KpiAreaService.cs @@ -1,6 +1,4 @@ -using Fake.Application; using Fake.Application.Dtos; -using TrackCenter.Application.Services; using TrackCenter.Domain.Aggregates.KPIAreaAggregate; using TrackCenter.Domain.Dtos.Forewarning; @@ -11,9 +9,9 @@ namespace TrackCenter.Application.Services.ForewarningServices; public class KpiAreaService : ApplicationServiceBase { private readonly IKpiAreaRepository _ruleAreaRepository; - private readonly IKpiAreaCacheService _kpiAreaCacheService; + private readonly KpiAreaCacheService _kpiAreaCacheService; - public KpiAreaService(IKpiAreaRepository ruleAreaRepository, IKpiAreaCacheService kpiAreaCacheService) + public KpiAreaService(IKpiAreaRepository ruleAreaRepository, KpiAreaCacheService kpiAreaCacheService) { _ruleAreaRepository = ruleAreaRepository; _kpiAreaCacheService = kpiAreaCacheService; @@ -25,18 +23,21 @@ public class KpiAreaService : ApplicationServiceBase /// /// 分区id [HttpPost("KpiArea/CreateKpiArea")] - public async ValueTask CreateKpiArea(CreateRuleAreaRequest input) + public async ValueTask CreateKpiArea(CreateRuleAreaRequest input) { var ruleAreaEntity = ObjectMapper.Map(input); var hasSameName = await _ruleAreaRepository.IsAnyAsync(val => val.SubSystemId == input.SystemId && val.Name == input.Name); if (hasSameName) { - return new UnifyResultDto(false, "分区名称重复,请重新修改提交"); + throw new BusinessException("分区名称重复,请重新修改提交"); } var areaId = await _ruleAreaRepository.CreateAreaAsync(ruleAreaEntity); - return new UnifyResultDto(true, areaId, "创建成功"); + return new IdBaseDto + { + Id = areaId, + }; } /// @@ -45,12 +46,15 @@ public class KpiAreaService : ApplicationServiceBase /// /// 区域id [HttpPost("KpiArea/AddAreaInfo")] - public async ValueTask AddAreaInfoAsync(AddRuleAreaInfoRequest input) + public async ValueTask AddAreaInfoAsync(AddRuleAreaInfoRequest input) { var ruleAreaEntity = ObjectMapper.Map(input); var ruleInfoId = await _ruleAreaRepository.AddAreaInfoAsync(ruleAreaEntity); // todo: 删除 kpi区域缓存 - return new UnifyResultDto(true, ruleInfoId, "添加成功"); + return new IdBaseDto + { + Id = ruleInfoId, + }; } /// @@ -59,11 +63,10 @@ public class KpiAreaService : ApplicationServiceBase /// 分区id /// [HttpDelete("KpiArea/DeleteKpiArea")] - public async ValueTask DeleteKpiArea(int id) + public async ValueTask DeleteKpiArea(int id) { await _ruleAreaRepository.DeleteArea(id); // todo: 删除 kpi区域缓存 - return new UnifyResultDto(true, "删除成功"); } /// @@ -72,13 +75,12 @@ public class KpiAreaService : ApplicationServiceBase /// 分区信息id /// [HttpDelete("KpiArea/DeleteKpiAreaInfo")] - public async ValueTask DeleteKpiAreaInfo(int id) + public async ValueTask DeleteKpiAreaInfo(int id) { var info = await _ruleAreaRepository.GetAreaInfoById(id); - if (info == null) return new UnifyResultDto(false, "未找到该区域信息"); + if (info == null) throw new BusinessException("未找到该区域信息"); await _ruleAreaRepository.DeleteAreaInfo(id); // todo: 删除 kpi区域缓存 - return new UnifyResultDto(true, "删除成功"); } /// @@ -87,18 +89,17 @@ public class KpiAreaService : ApplicationServiceBase /// /// [HttpPost("KpiArea/ModifyKpiArea")] - public async Task ModifyKpiArea(UpdateRuleAreaRequest input) + public async Task ModifyKpiArea(UpdateRuleAreaRequest input) { if (input.Id <= 0) - return new UnifyResultDto(false, "id不能为空"); + throw new BusinessException("id不能为空"); var ruleArea = await _ruleAreaRepository.GetFirstAsync(val => val.Id == input.Id); if (ruleArea == null) - return new UnifyResultDto(false, "未找到该区域"); + throw new BusinessException("未找到该区域"); ruleArea.Name = input.Name; await _ruleAreaRepository.UpdateAsync(ruleArea); - return new UnifyResultDto(true, "更新成功"); } /// @@ -107,20 +108,19 @@ public class KpiAreaService : ApplicationServiceBase /// /// [HttpPost("KpiArea/ModifyKpiAreaInfo")] - public async Task ModifyKpiAreaInfo(UpdateRuleAreaInfoRequest input) + public async Task ModifyKpiAreaInfo(UpdateRuleAreaInfoRequest input) { if (input.Id <= 0) - return new UnifyResultDto(false, "id不能为空"); + throw new BusinessException("id不能为空"); var areaInfo = await _ruleAreaRepository.GetAreaInfoById(input.Id); if (areaInfo == null) - return new UnifyResultDto(false, "未找到该区域信息"); + throw new BusinessException("未找到该区域信息"); var ruleAreaEntity = ObjectMapper.Map(input, areaInfo); await _ruleAreaRepository.UpdateAreaInfoAsync(ruleAreaEntity); // todo: 删除 kpi区域缓存 - return new UnifyResultDto(true, "更新成功"); } /// diff --git a/src/TrackCenter.Application/Services/ProvideServices/OrderService.Link.cs b/src/TrackCenter.Application/Services/ProvideServices/OrderService.Link.cs index 23c1f836..110de42e 100644 --- a/src/TrackCenter.Application/Services/ProvideServices/OrderService.Link.cs +++ b/src/TrackCenter.Application/Services/ProvideServices/OrderService.Link.cs @@ -21,7 +21,7 @@ public partial class OrderService /// /// [HttpPost("Order/Link")] - public async Task LinkOrderAsync(LinkOrderInput input) + public async Task LinkOrderAsync(LinkOrderInput input) { var orderId = await _orderRepository.GetFirstAsync(x => x.SubSystemId == input.SubSystemId && x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, @@ -37,7 +37,7 @@ public partial class OrderService throw new BusinessException(message: "不能同级关联"); } - if (input.LinkOrderNos.Count < 1 || input.LinkOrderType == 0) return new UnifyResultDto(true); + if (input.LinkOrderNos.Count < 1 || input.LinkOrderType == 0) return; // 单号去重,去空,去自己 input.LinkOrderNos = input.LinkOrderNos @@ -54,8 +54,6 @@ public partial class OrderService // 关联订单 await DoLinkOrderAsync(input, orderId); } - - return new UnifyResultDto(true, true); } private async Task DoLinkOrderAsync(LinkOrderInput input, int orderId) diff --git a/src/TrackCenter.Application/Services/ProvideServices/OrderService.PullConfigs.cs b/src/TrackCenter.Application/Services/ProvideServices/OrderService.PullConfigs.cs index d877fa7f..6af16faf 100644 --- a/src/TrackCenter.Application/Services/ProvideServices/OrderService.PullConfigs.cs +++ b/src/TrackCenter.Application/Services/ProvideServices/OrderService.PullConfigs.cs @@ -1,8 +1,7 @@ -using SJZY.Expand.ABP.Core.Logger; -using SJZY.Expand.ABP.Core.PublicMethords; +using InterfaceForward.Domain.Shared.Helpers; using TrackCenter.Application.Dtos.ProvideServices; using TrackCenter.Domain.Dtos.Order; -using SJZY.UserCenter.HttpApi.Services; +using TrackCenter.Domain.Extensions; namespace TrackCenter.Application.Services.ProvideServices; @@ -14,21 +13,19 @@ public partial class OrderService /// /// [HttpPost("Order/UpdateOrderPullConfigs")] - public async Task UpdateOrderPullConfigsAsync(UpdateOrderPullConfigsInput input) + public async Task UpdateOrderPullConfigsAsync(UpdateOrderPullConfigsInput input) { - var orderIds = await _orderRepository.GetArrayAsync( + var orderIds = await _orderRepository.GetListAsync( x => x.SubSystemId == input.SubSystemId && x.OrderType == input.OrderType && input.OrderNos.Contains(x.OrderNo), x => x.Id); var inputVo = ObjectMapper .Map(input.Config); - inputVo.OrderIds = orderIds; + inputVo.OrderIds = orderIds.ToArray(); var cnt = await _orderRepository.UpdateOrderPullConfigForServiceProviderAsync(inputVo); LogHelper.Warn( - $"{CurrentUserRequest.CurrentUser.UserId}正在修改服务商拉取信息,本次共计影响了{orderIds.Length}个订单、{cnt}段拉取,请求参数是:{input.ToJson()}", + $"{CurrentUser.UserName}正在修改服务商拉取信息,本次共计影响了{orderIds.Count}个订单、{cnt}段拉取,请求参数是:{input.ToJson()}", true); - - return new UnifyResultDto(true); } } diff --git a/src/TrackCenter.Application/Services/ProvideServices/OrderService.cs b/src/TrackCenter.Application/Services/ProvideServices/OrderService.cs index 03036289..8b34d455 100644 --- a/src/TrackCenter.Application/Services/ProvideServices/OrderService.cs +++ b/src/TrackCenter.Application/Services/ProvideServices/OrderService.cs @@ -1,5 +1,4 @@ using DotNetCore.CAP; -using Fake.Application; using InterfaceForward.Domain.Shared.Helpers; using TrackCenter.Application.Dtos.ProvideServices; using TrackCenter.Domain.Aggregates.OrderAggregate; diff --git a/src/TrackCenter.Application/Services/ProvideServices/TrackContentService.cs b/src/TrackCenter.Application/Services/ProvideServices/TrackContentService.cs index ea294546..051015a3 100644 --- a/src/TrackCenter.Application/Services/ProvideServices/TrackContentService.cs +++ b/src/TrackCenter.Application/Services/ProvideServices/TrackContentService.cs @@ -10,7 +10,7 @@ namespace TrackCenter.Application.Services.ProvideServices; /// [ApiExplorerSettings(GroupName = "提供接口")] [Route("/ProviderService")] -public class TrackContentService : ApplicationServiceBase, ITrackContentService +public class TrackContentService : ApplicationServiceBase { private readonly ITrackContentRepository _trackContentRepository; @@ -25,10 +25,10 @@ public class TrackContentService : ApplicationServiceBase, ITrackContentService /// /// [HttpPost("Track/GetTrackContents")] - public async Task>> GetTrackContentsAsync(int subSystemId) + public async Task> GetTrackContentsAsync(int subSystemId) { var res = await _trackContentRepository.GetTrackContentBySyetemIdAsync(subSystemId); var result = ObjectMapper.Map, List>(res); - return new UnifyResultDto>(true, result); + return result; } } diff --git a/src/TrackCenter.Application/Services/ProvideServices/TrackPullService.cs b/src/TrackCenter.Application/Services/ProvideServices/TrackPullService.cs index 2001239d..ac032655 100644 --- a/src/TrackCenter.Application/Services/ProvideServices/TrackPullService.cs +++ b/src/TrackCenter.Application/Services/ProvideServices/TrackPullService.cs @@ -1,17 +1,13 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Options; -using SJZY.Expand.ABP.Core.Logger; -using SJZY.Expand.ABP.Core.PublicMethords; -using SJZY.InterfaceRelay.Application.Contracts; using TrackCenter.Application.Dtos.ProvideServices; using TrackCenter.Application.Dtos.TrackPull; -using TrackCenter.Application.Services.ProvideServices; using TrackCenter.Application.Helpers; using TrackCenter.Application.Options; +using TrackCenter.Application.Queries; using TrackCenter.Application.Rabbit; using TrackCenter.Application.Track2InterfaceRelay; -using TrackCenter.Domain.Queries; -using Volo.Abp.Http.Client.DynamicProxying; +using TrackCenter.Domain.Extensions; namespace TrackCenter.Application.Services.ProvideServices; @@ -20,13 +16,13 @@ namespace TrackCenter.Application.Services.ProvideServices; /// [ApiExplorerSettings(GroupName = "提供接口")] [Route("/ProviderService")] -public class TrackPullService : ApplicationServiceBase, ITrackPullService +public class TrackPullService : ApplicationServiceBase { private readonly IHttpClientProxy _httpClientProxy; private readonly IOptionsMonitor _options; - private readonly IProvideQueries _provideQueries; + private readonly ProvideQueries _provideQueries; - public TrackPullService(IProvideQueries provideQueries, + public TrackPullService(ProvideQueries provideQueries, IHttpClientProxy httpClientProxy, IOptionsMonitor options) { diff --git a/src/TrackCenter.Application/Services/ProvideServices/TrackPushConfigService.cs b/src/TrackCenter.Application/Services/ProvideServices/TrackPushConfigService.cs index 4cd6c140..6ee2295b 100644 --- a/src/TrackCenter.Application/Services/ProvideServices/TrackPushConfigService.cs +++ b/src/TrackCenter.Application/Services/ProvideServices/TrackPushConfigService.cs @@ -10,7 +10,7 @@ namespace TrackCenter.Application.Services.ProvideServices; /// [ApiExplorerSettings(GroupName = "提供接口")] [Route("/ProviderService")] -public class TrackPushConfigService : ApplicationServiceBase, ITrackPushConfigService +public class TrackPushConfigService : ApplicationServiceBase { private readonly ITrackPushConfigRepository _trackPushConfigRepository; @@ -25,13 +25,13 @@ public class TrackPushConfigService : ApplicationServiceBase, ITrackPushConfigSe /// /// [HttpPost("Track/QueryTrackPullMappings")] - public async Task>> QueryTrackPullMappingsAsync( + public async Task> QueryTrackPullMappingsAsync( QueryTrackPullMappingsInput input) { var vo = ObjectMapper.Map(input); var result = await _trackPushConfigRepository.QueryTrackPullMappingsAsync(vo); var output = ObjectMapper.Map, List>(result); - return new UnifyResultDto>(true, output, "操作成功"); + return output; } } diff --git a/src/TrackCenter.Application/Services/ProvideServices/TrackPushService.cs b/src/TrackCenter.Application/Services/ProvideServices/TrackPushService.cs index 47d4e1b7..0375358c 100644 --- a/src/TrackCenter.Application/Services/ProvideServices/TrackPushService.cs +++ b/src/TrackCenter.Application/Services/ProvideServices/TrackPushService.cs @@ -136,7 +136,7 @@ public class TrackPushService : ApplicationServiceBase, ITrackPushService SubSystemId = input.SubSystemId, SubSystemCode = subSystemCode, CustomId = order.CustomId, - OrderIdEsIdVersionDict = new Dictionary> + OrderIdTrackMetadataDict = new Dictionary> { [order.Id] = KeyValuePair.Create(track.Id, track.Version) }, diff --git a/src/TrackCenter.Application/Services/ProvideServices/TrackService.Query.cs b/src/TrackCenter.Application/Services/ProvideServices/TrackService.Query.cs index 3413d6f4..18dd3a2d 100644 --- a/src/TrackCenter.Application/Services/ProvideServices/TrackService.Query.cs +++ b/src/TrackCenter.Application/Services/ProvideServices/TrackService.Query.cs @@ -1,11 +1,10 @@ using Microsoft.AspNetCore.Http; -using SJZY.Expand.AliyunOSS; using TrackCenter.Application.Dtos.ProvideServices; using TrackCenter.Application.Helpers; +using TrackCenter.Application.Helpers.OSS; using TrackCenter.Domain.Aggregates.TrackDetailsAggregate; using TrackCenter.Domain.Aggregates.TrackTemplateAggregate; using TrackCenter.Domain.Dtos.TrackTemplate; -using TrackCenter.Domain.Queries; namespace TrackCenter.Application.Services.ProvideServices; @@ -17,7 +16,6 @@ public partial class TrackService private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; private readonly ITrackTemplateRepository _trackTemplateRepository; private readonly IHttpContextAccessor _contextAccessor; - private readonly IVSystemQueries _vSystemQueries; /// /// 查询轨迹(时区补正) @@ -26,7 +24,7 @@ public partial class TrackService /// /// [HttpPost("Track/Query")] - public async Task>> QueryAsync(GetTrackInput input) + public async Task> QueryAsync(GetTrackInput input) { var res = new List(); input.OrderNos = input.OrderNos.Where(x => !x.IsNullOrWhiteSpace()).Distinct().ToList(); // 单号去重、去空 @@ -68,8 +66,6 @@ public partial class TrackService TimeZone = Math.Abs(x.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 ? null : input.TimeZone ?? 8, - IsDisplay = x.IsExternal, - IsVisibility = x.IsVisibility, IsExternal = x.IsExternal, Source = x.Source, Remarks = x.Remarks, @@ -99,7 +95,7 @@ public partial class TrackService // 排序 var sortedList = await TracksOrdered(res, input, input.SortMethod); - return new UnifyResultDto>(true, sortedList, "操作成功"); + return sortedList; } @@ -109,7 +105,7 @@ public partial class TrackService /// /// [HttpPost("Track/QueryV2")] - public async Task>> QueryV2Async(GetTrackInputV2 input) + public async Task> QueryV2Async(GetTrackInputV2 input) { var res = new List(); input.OrderNos = input.OrderNos.Where(x => !x.IsNullOrWhiteSpace()).Distinct().ToList(); // 单号去重、去空 @@ -132,10 +128,8 @@ public partial class TrackService var trackDetails = group .WhereIf(isFilterExternal, x => x.IsExternal) .ToList(); - if (trackDetails.Count == 0) - continue; + if (trackDetails.Count == 0) continue; item.OrderNo = trackDetails.First().OrderNo; - item.TrackDetails = trackDetails.Select(x => new TrackDetail { EsId = x.Id, @@ -145,10 +139,12 @@ public partial class TrackService EnContent = x.TrackEnContent, OriginContent = x.OriginTrackContent, Location = x.TrackPlace, - Time = x.TrackTime, - TimeZone = x.TrackTimeZone, - IsDisplay = x.IsExternal, - IsVisibility = x.IsVisibility, + Time = Math.Abs(x.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 + ? x.TrackTime + : x.ZeroTrackTime.AddHours(input.TimeZone ?? 8), + TimeZone = Math.Abs(x.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 + ? null + : input.TimeZone ?? 8, IsExternal = x.IsExternal, Source = x.Source, Remarks = x.Remarks, @@ -168,7 +164,10 @@ public partial class TrackService DestinationTimeZone = x.DestinationTimeZone, EstimatedDeliveryDate = x.EstimatedDeliveryDate, Extra = x.Extra, + CreateUser = x.CreateUser, CreateTime = x.CreateTime, + PodFileUrls = x.PodFileUrls?.Split(",").ToList() ?? Empty.List, + TrackFlags = BuildTrackFlags(trackFlagIdsDict, flagDict, x) }).ToList(); res.Add(item); diff --git a/src/TrackCenter.Application/Services/ProvideServices/TrackService.cs b/src/TrackCenter.Application/Services/ProvideServices/TrackService.cs index 1d54e385..b2720e07 100644 --- a/src/TrackCenter.Application/Services/ProvideServices/TrackService.cs +++ b/src/TrackCenter.Application/Services/ProvideServices/TrackService.cs @@ -1,23 +1,16 @@ using DotNetCore.CAP; -using Fake.Application; using InterfaceForward.Domain.Shared.Helpers; using Microsoft.AspNetCore.Http; -using SJZY.Expand.ABP.Core.PublicMethords; using TrackCenter.Application.Dtos.ProvideServices; using TrackCenter.Application.Events; -using TrackCenter.Application.Services.ProvideServices; using TrackCenter.Domain.Aggregates.OrderAggregate; using TrackCenter.Domain.Aggregates.TrackContentAggregate; using TrackCenter.Domain.Aggregates.TrackDetailsAggregate; using TrackCenter.Domain.Aggregates.TrackTemplateAggregate; using TrackCenter.Domain.Enums; using TrackCenter.Domain.Extensions; -using TrackCenter.Domain.Queries; -using SJZY.UserCenter.HttpApi.Services; -using SJZY.UserCenter.HttpApi.Services.User; using TrackCenter.Application.Helpers; using TrackCenter.Repository.Otel; -using Volo.Abp.Http.Client.DynamicProxying; namespace TrackCenter.Application.Services.ProvideServices; @@ -26,7 +19,7 @@ namespace TrackCenter.Application.Services.ProvideServices; /// [ApiExplorerSettings(GroupName = "提供接口")] [Route("/ProviderService")] -public partial class TrackService : ApplicationServiceBase, ITrackService +public partial class TrackService : ApplicationServiceBase { private readonly ICapPublisher _capPublisher; private readonly IOrderRepository _orderRepository; @@ -37,14 +30,12 @@ public partial class TrackService : ApplicationServiceBase, ITrackService ICapPublisher capPublisher, ITrackDetailsEsRepository trackDetailsEsRepository, ITrackContentRepository trackContentRepository, - ITrackTemplateRepository trackTemplateRepository, - IHttpContextAccessor contextAccessor, + ITrackTemplateRepository trackTemplateRepository ) { _orderRepository = orderRepository; _capPublisher = capPublisher; _trackContentRepository = trackContentRepository; - _contextAccessor = contextAccessor; _trackTemplateRepository = trackTemplateRepository; _trackDetailsEsRepository = trackDetailsEsRepository; } @@ -123,10 +114,8 @@ public partial class TrackService : ApplicationServiceBase, ITrackService CompareValue = input.CompareValue, Source = input.Source, TrackIdentifiers = input.TrackIdentifiers, - OperationMan = userInfo.Data.UserName + OperationMan = CurrentUser.UserName }); - - return new UnifyResultDto(true, true); } /// @@ -135,43 +124,30 @@ public partial class TrackService : ApplicationServiceBase, ITrackService /// /// [HttpPost("Track/BatchDeleteByEsId")] - public async Task BatchDeleteTrackByEsIdAsync(BatchDeleteTrackByEsIdInput input) + public async Task BatchDeleteTrackByEsIdAsync(BatchDeleteTrackByEsIdInput input) { var esIds = input.TrackContentEsIds.ToArray(); var tracks = await _trackDetailsEsRepository.GetDataByIds(esIds); if (tracks.Count == 0) - return new UnifyResultDto(false, "未找到指定id下的轨迹内容"); + throw new BusinessException("未找到指定id下的轨迹内容"); if (tracks.Any(m => m.Source == TrackSourceEnum.ExternalServiceProvide.GetHashCode())) - return new UnifyResultDto(false, "存在来源于外部服务商的轨迹,不允许删除"); + throw new BusinessException("存在来源于外部服务商的轨迹,不允许删除"); if (tracks.GroupBy(m => m.SubSystemId).Count() > 1) - return new UnifyResultDto(false, "暂不支持跨子系统批量删除"); + throw new BusinessException("暂不支持跨子系统批量删除"); - // 获取用户name - var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(); - if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) - { - throw new BusinessException(message: $"调用用户中心,获取用户信息失败:{userInfo.Msg}"); - } // 删除轨迹 - var currentUser = CurrentUserRequest.CurrentUser; - var userName = userInfo.Data.UserName; - if (string.IsNullOrEmpty(userName)) - userName = (await _orderRepository.GetUserById(currentUser.UserId))?.Name; - var @event = new TrackDeleteEvent { EsIds = esIds, SubSystemId = tracks.First().SubSystemId, Source = input.Source, - OperationMan = userName, - OperationManId = currentUser.UserId + OperationMan = CurrentUser.UserName, + OperationManId = CurrentUser.Id?? Guid.Empty, }; await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, @event); - - return new UnifyResultDto(true); } /// @@ -181,7 +157,7 @@ public partial class TrackService : ApplicationServiceBase, ITrackService /// /// [HttpPost("Track/BatchDelete")] - public async Task BatchDeleteTrackAsync(BatchDeleteTrackInput input) + public async Task BatchDeleteTrackAsync(BatchDeleteTrackInput input) { input.OrderNos = input.OrderNos.Where(x => !x.IsNullOrWhiteSpace()).Distinct().ToList(); // 单号去重、去空 var orderIds = await _orderRepository.GetListAsync(x => @@ -222,13 +198,6 @@ public partial class TrackService : ApplicationServiceBase, ITrackService throw new BusinessException(message: "存在来源于外部服务商的轨迹,不允许删除"); } - // 获取用户name - var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(); - if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) - { - throw new BusinessException(message: $"调用用户中心,获取用户信息失败:{userInfo.Msg}"); - } - // 删除轨迹 var @event = new TrackDeleteEvent { @@ -238,11 +207,9 @@ public partial class TrackService : ApplicationServiceBase, ITrackService CompareFields = input.CompareFields, CompareValue = input.CompareValue, SubSystemId = input.SubSystemId, - OperationMan = userInfo.Data.UserName, + OperationMan = CurrentUser.UserName }; await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, @event); - - return new UnifyResultDto(true, true); } /// @@ -252,7 +219,7 @@ public partial class TrackService : ApplicationServiceBase, ITrackService /// /// [HttpPost("Track/Upsert")] - public async Task UpsertTrackAsync(UpsertTrackInput input) + public async Task UpsertTrackAsync(UpsertTrackInput input) { using var activity = ActivityHelper.CreateSpanActivity("UpsertTrack"); activity.SetTag("UpsertTrackInput", input.ToJson()); @@ -290,18 +257,6 @@ public partial class TrackService : ApplicationServiceBase, ITrackService input.NewExtra, input.CompareFields); - var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(); - if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) - { - //todo:保留之前的方式(FBA在用) 后续可能去除 - userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(input.OptionUserId); - - if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) - throw new BusinessException(message: $"调用用户中心,获取用户信息失败:{userInfo.Msg}"); - } - - var name = userInfo.Data.UserName; - // 新增/更新轨迹 input.TrackTimeZone ??= GlobalConst.NoneTrackTimeZone; //时区为空使用一个特殊值填充 var @event = ObjectMapper.Map(input); @@ -316,9 +271,8 @@ public partial class TrackService : ApplicationServiceBase, ITrackService OrderType = input.OrderType, } }; - @event.OperationMan = name; + @event.OperationMan = CurrentUser.UserName; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); - return new UnifyResultDto(true, true); } /// @@ -328,7 +282,7 @@ public partial class TrackService : ApplicationServiceBase, ITrackService /// /// [HttpPost("Track/BatchUpsert")] - public async Task BatchUpsertTrackAsync(BatchUpsertTrackInput input) + public async Task BatchUpsertTrackAsync(BatchUpsertTrackInput input) { using var activity = ActivityHelper.CreateSpanActivity("BatchUpsert"); activity.SetTag("BatchUpsertTrackInput", input.ToJson()); @@ -373,13 +327,6 @@ public partial class TrackService : ApplicationServiceBase, ITrackService input.NewExtra, input.CompareFields); - // 获取用户name - var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(); - if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) - { - throw new BusinessException(message: $"调用用户中心,获取用户信息失败:{userInfo.Msg}"); - } - // 按客户新增/更新轨迹(为了推送轨迹时方便) foreach (var group in orders.GroupBy(x => x.CustomId)) { @@ -399,9 +346,8 @@ public partial class TrackService : ApplicationServiceBase, ITrackService TrackTime = input.TrackTime, NewTrackTime = input.NewTrackTime, TrackTimeZone = input.TrackTimeZone ?? GlobalConst.NoneTrackTimeZone, //时区为空使用一个特殊值填充 - OperationMan = userInfo.Data.UserName, - OperationManId = userInfo.Data.UserId, - IsVisibility = input.IsVisibility, + OperationMan = CurrentUser.UserName, + OperationManId = CurrentUser.Id?? Guid.Empty, IsExternal = input.IsExternal, Source = input.Source, Remarks = input.Remarks, @@ -425,8 +371,6 @@ public partial class TrackService : ApplicationServiceBase, ITrackService }; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); } - - return new UnifyResultDto(true, true); } //在轨迹更新主流程之前的前置检查 diff --git a/src/TrackCenter.Application/Services/ProvideServices/TrackTemplateService.cs b/src/TrackCenter.Application/Services/ProvideServices/TrackTemplateService.cs index ed3eff19..e5cfcce5 100644 --- a/src/TrackCenter.Application/Services/ProvideServices/TrackTemplateService.cs +++ b/src/TrackCenter.Application/Services/ProvideServices/TrackTemplateService.cs @@ -1,3 +1,4 @@ +using Fake.Application.Dtos; using TrackCenter.Application.Dtos.ProvideServices; using TrackCenter.Application.Services.ProvideServices; using TrackCenter.Domain.Aggregates.TrackTemplateAggregate; @@ -10,7 +11,7 @@ namespace TrackCenter.Application.Services.ProvideServices; /// [ApiExplorerSettings(GroupName = "提供接口")] [Route("/ProviderService")] -public class TrackTemplateService : ApplicationServiceBase, ITrackTemplateService +public class TrackTemplateService : ApplicationServiceBase { private readonly ITrackTemplateRepository _trackTemplateRepository; diff --git a/src/TrackCenter.Application/Services/TimerTaskss/TrackButtomUpScanTask.cs b/src/TrackCenter.Application/Services/TimerTaskss/TrackButtomUpScanTask.cs index 2b47dfb7..dae7046a 100644 --- a/src/TrackCenter.Application/Services/TimerTaskss/TrackButtomUpScanTask.cs +++ b/src/TrackCenter.Application/Services/TimerTaskss/TrackButtomUpScanTask.cs @@ -1,17 +1,14 @@ using System.Linq.Expressions; -using Fake.Application; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Options; using Newtonsoft.Json.Linq; -using SJZY.Expand.ABP.Core; -using SJZY.Expand.ABP.Core.Logger; using TrackCenter.Application.Dtos.TrackPull; using TrackCenter.Application.Helpers; using TrackCenter.Application.Options; using TrackCenter.Domain.Aggregates.OrderAggregate; using TrackCenter.Domain.Enums; using TrackCenter.Domain.Extensions; -using TrackCenter.Domain.Queries; +using TrackCenter.Repository.Queries; using TrackCenter.Repository.Redis; namespace TrackCenter.Application.Services.TimerTaskss; @@ -24,10 +21,10 @@ public class TrackButtomUpScanTask : ApplicationServiceBase { private readonly IOptionsSnapshot _options; private readonly IOrderRepository _orderRepository; - private readonly ITimezoneQueries _timezoneQueries; + private readonly TimezoneQueries _timezoneQueries; public TrackButtomUpScanTask(IOptionsSnapshot options, IOrderRepository orderRepository, - ITimezoneQueries timezoneQueries) + TimezoneQueries timezoneQueries) { _options = options; _orderRepository = orderRepository; diff --git a/src/TrackCenter.Application/Services/TrackNode/TrackNodeService.cs b/src/TrackCenter.Application/Services/TrackNode/TrackNodeService.cs index cf4f8abb..bbfeada3 100644 --- a/src/TrackCenter.Application/Services/TrackNode/TrackNodeService.cs +++ b/src/TrackCenter.Application/Services/TrackNode/TrackNodeService.cs @@ -1,10 +1,10 @@ +using Fake.Application.Dtos; using TrackCenter.Application.Dtos.TrackNode; using TrackCenter.Application.Dtos.TrackStatus; using TrackCenter.Application.Helpers; using TrackCenter.Domain.Aggregates.TrackNodeAggregate; using TrackCenter.Domain.Aggregates.TrackStatusAggregate; using TrackCenter.Domain.Dtos.TrackNode; -using Volo.Abp.DependencyInjection; namespace TrackCenter.Application.Services.TrackNode; @@ -13,7 +13,7 @@ namespace TrackCenter.Application.Services.TrackNode; /// [ApiExplorerSettings(GroupName = "轨迹节点")] [Route("/Track/Node")] -public class TrackNodeService : ApplicationServiceBase, ITransientDependency +public class TrackNodeService : ApplicationServiceBase { private readonly ITrackNodeRepository _trackNodeRepository; private readonly ITrackStatusRepository _trackStatusRepository; @@ -30,15 +30,24 @@ public class TrackNodeService : ApplicationServiceBase, ITransientDependency /// /// [HttpPost("Edit")] - public async Task EditAsync(EditTrackNodeInput input) + public async Task EditAsync(EditTrackNodeInput input) { - return input.Options switch + switch (input.Options) { - OptionType.新增 => await AddAsync(input), - OptionType.修改 => await UpdateAsync(input), - OptionType.删除 => await DeleteAsync(input), - _ => throw new BusinessException(message: "当前操作动作不合法") - }; + case OptionType.无: + break; + case OptionType.新增: + await AddAsync(input); + break; + case OptionType.删除: + await DeleteAsync(input); + break; + case OptionType.修改: + await UpdateAsync(input); + break; + default: + throw new BusinessException(message: "当前操作动作不合法"); + } } /// @@ -60,10 +69,10 @@ public class TrackNodeService : ApplicationServiceBase, ITransientDependency /// 节点id /// [HttpPost("GetDetail")] - public async Task GetDetail(int nodeid) + public async Task GetDetail(int nodeid) { var resultDto = await _trackNodeRepository.GetDetail(nodeid); - return new UnifyResultDto(true, resultDto); + return resultDto; } /// @@ -81,14 +90,14 @@ public class TrackNodeService : ApplicationServiceBase, ITransientDependency #region 私有方法 - private async Task AddAsync(EditTrackNodeInput input) + private async Task AddAsync(EditTrackNodeInput input) { #region 业务校验 if (string.IsNullOrEmpty(input.NodeName) || string.IsNullOrEmpty(input.NodeEnName) || !input.SubSystemId.HasValue) { - return new UnifyResultDto(GlobalConst.SuccessCode, "NodeName,NodeEnName,SubSystemId 必填", false); + throw new BusinessException("NodeName,NodeEnName,SubSystemId 必填"); } var trackNodesEntitys = await _trackNodeRepository.GetListAsync(a => @@ -113,44 +122,40 @@ public class TrackNodeService : ApplicationServiceBase, ITransientDependency if (!StringHelper.IsValidEnglishString(input.NodeEnName)) { - return new UnifyResultDto(GlobalConst.SuccessCode, "节点英文名称必须是英文和常用英文符号", false); + throw new BusinessException("节点英文名称必须是英文和常用英文符号"); } var entity = ObjectMapper.Map(input); - var isTrue = await _trackNodeRepository.InsertAsync(entity); - - return new UnifyResultDto(GlobalConst.SuccessCode, "新增成功", isTrue); + await _trackNodeRepository.InsertAsync(entity); } - private async Task UpdateAsync(EditTrackNodeInput input) + private async Task UpdateAsync(EditTrackNodeInput input) { #region 业务校验 if (string.IsNullOrEmpty(input.NodeName) || string.IsNullOrEmpty(input.NodeEnName)) { - return new UnifyResultDto(GlobalConst.SuccessCode, "NodeName,NodeEnName 必填", false); + throw new BusinessException("NodeName,NodeEnName 必填"); } var trackNodesEntitys = await _trackNodeRepository.GetFirstAsync(a => a.Id == input.Id); if (trackNodesEntitys == null) { - return new UnifyResultDto(GlobalConst.SuccessCode, "没有找到数据,更新失败", false); + throw new BusinessException("没有找到数据,更新失败"); } #endregion trackNodesEntitys.NodeEnName = input.NodeEnName; trackNodesEntitys.NodeName = input.NodeName; - var isTrue = await _trackNodeRepository.UpdateAsync(trackNodesEntitys); - - return new UnifyResultDto(GlobalConst.SuccessCode, "修改成功", isTrue); + await _trackNodeRepository.UpdateAsync(trackNodesEntitys); } - private async Task DeleteAsync(EditTrackNodeInput input) + private async Task DeleteAsync(EditTrackNodeInput input) { if (input.Id <= 0 || !input.SubSystemId.HasValue) { - return new UnifyResultDto(GlobalConst.SuccessCode, "SubSystemId 必填", false); + throw new BusinessException("SubSystemId 必填"); } var trackStatus = @@ -158,11 +163,10 @@ public class TrackNodeService : ApplicationServiceBase, ITransientDependency val.Node == input.Id && val.SubSystemId == input.SubSystemId); if (trackStatus != null) { - return new UnifyResultDto(GlobalConst.SuccessCode, "删除失败,该节点已被使用", false); + throw new BusinessException("删除失败,该节点已被使用"); } - var rows = await _trackNodeRepository.DeleteById(input.Id); - return new UnifyResultDto(GlobalConst.SuccessCode, "删除成功", rows > 0); + await _trackNodeRepository.DeleteById(input.Id); } #endregion diff --git a/src/TrackCenter.Application/Services/TrackTemplates/TrackTemplateService.cs b/src/TrackCenter.Application/Services/TrackTemplates/TrackTemplateService.cs deleted file mode 100644 index 61b1c675..00000000 --- a/src/TrackCenter.Application/Services/TrackTemplates/TrackTemplateService.cs +++ /dev/null @@ -1,281 +0,0 @@ -using System.Linq.Expressions; -using Microsoft.Extensions.Localization; -using SJZY.Expand.ABP.Core.Localization; -using SJZY.Expand.ABP.Core.PublicMethords; -using TrackCenter.Application.Dtos.TrackTemplates; -using TrackCenter.Application.Localization; -using TrackCenter.Domain.Aggregates.TrackTemplateAggregate; -using TrackCenter.Domain.Dtos.TrackTemplate; - -namespace TrackCenter.Application.Services.TrackTemplates; - -/// -/// 轨迹模版 -/// -[ApiExplorerSettings(GroupName = "轨迹模版")] -[Route("/Track/Template")] -public class TrackTemplateService : ApplicationServiceBase -{ - private readonly IStringLocalizer _stringLocalizer; - private readonly ITrackTemplateRepository _trackTemplateRepository; - - /// - public TrackTemplateService( - IStringLocalizer stringLocalizer, - ITrackTemplateRepository trackTemplateRepository - ) - { - _stringLocalizer = stringLocalizer; - _trackTemplateRepository = trackTemplateRepository; - } - - /// - /// 轨迹模版编辑 - /// - /// - [HttpPost("Edit")] - public async Task EditAsync(EditTrackTemplateInput input) - { - return input.Options switch - { - OptionType.新增 => await AddAsync(input), - OptionType.修改 => await UpdateAsync(input), - OptionType.删除 => await DeleteAsync(input), - _ => throw new BusinessException(message: "当前操作动作不合法") - }; - } - - /// - /// 根据模版id获取轨迹模版 - /// - /// - /// - [HttpGet("GetDetail")] - public async Task GetDetailAsync(int id) - { - return await _trackTemplateRepository.GetDetailAsync(id); - } - - /// - /// 获取分页轨迹模版 - /// - /// - /// - [HttpPost("GetList")] - public async Task> GetPageTrackTemplate(GetPageTrackTemplateInput input) - { - var vo = ObjectMapper.Map(input); - var resultDto = await _trackTemplateRepository.GetPageTrackTemplate(vo); - var pageResultDto = - ObjectMapper.Map, PagedResult>( - resultDto); - - return pageResultDto; - } - - /// - /// 轨迹模板内容列表 - /// - /// - /// - [HttpPost("GetContentPage")] - public async Task> GetContentPageAsync( - [FromBody] GetTrackTemplateContentPageInputVO input) - { - return await _trackTemplateRepository.GetContentPageAsync(input); - } - - /// - /// 轨迹模板内容详情 - /// - /// - /// - [HttpGet("GetContentDetail")] - public async Task GetContentDetailAsync(int id) - { - return await _trackTemplateRepository.GetContentDetailAsync(id); - } - - /// - /// 轨迹模板内容编辑 - /// - /// - /// - [HttpPost("EditContent")] - public async Task EditContentAsync([FromBody] EditTrackTemplateContentInput input) - { - if (input.Options != OptionTypeNoNull.删除) - { - Expression> isContentAnyExp = x => - x.TrackTemplateId == input.TrackTemplateId && x.TrackContentId == input.TrackContentId; - if (input.Options == OptionTypeNoNull.修改) isContentAnyExp = isContentAnyExp.And(x => x.Id != input.Id); - - if (await _trackTemplateRepository.IsContentAnyAsync(isContentAnyExp)) - throw new BusinessException(message: _stringLocalizer["IsTrackTemplateContentAny"]); - } - - switch (input.Options) - { - case OptionTypeNoNull.新增: - { - int maxSort = await _trackTemplateRepository.ContentMaxAsync(x => x.Sort, - x => x.TrackTemplateId == input.TrackTemplateId); - - var entity = ObjectMapper.Map(input); - entity.Sort = maxSort + 1; - - await _trackTemplateRepository.InsertContentAsync(entity); - - break; - } - - case OptionTypeNoNull.修改: - { - var entity = await _trackTemplateRepository.GetContentByIdAsync(input.Id!.Value) ?? - throw new BusinessException(message: _stringLocalizer["NotFindData"]); - - ObjectMapper.Map(input, entity); - - await _trackTemplateRepository.UpdateContentAsync(entity); - - break; - } - - case OptionTypeNoNull.删除: - { - var entity = await _trackTemplateRepository.GetContentByIdAsync(input.Id!.Value) ?? - throw new BusinessException(message: _stringLocalizer["NotFindData"]); - - using var ts = TransactionScopeHelper.Create(); - await _trackTemplateRepository.SoftDeleteContentAsync(input.Id!.Value); - - await _trackTemplateRepository.UpdateContentAsync(x => x.Sort == x.Sort - 1, - x => x.TrackTemplateId == entity.TrackTemplateId && x.Sort > entity.Sort); - - ts.Complete(); - - break; - } - - default: - throw new BusinessException(message: _stringLocalizer[SjzyBasicLocalization.Validation_IsInEnum, - nameof(EditTrackTemplateContentInput.Options)]); - } - - return true; - } - - /// - /// 轨迹模板内容排序 - /// - /// - /// - [HttpPost("SortContent")] - public async Task SortContentAsync([FromBody] SortTrackTemplateContentInput input) - { - List ids = input.SortInfo.Select(x => int.Parse(x.Key)).ToList(); - - var trackTemplateContentEntities = await _trackTemplateRepository.GetContentListAsync(x => ids.Contains(x.Id)); - - trackTemplateContentEntities.ForEach(item => - { - item.Sort = input.SortInfo.Single(x => x.Key == item.Id.ToString()).Value; - }); - - await _trackTemplateRepository.UpdateContentRangeAsync(trackTemplateContentEntities); - - return true; - } - - #region 私有方法 - - private async Task AddAsync(EditTrackTemplateInput input) - { - #region 业务校验 - - if (await _trackTemplateRepository.IsAnyAsync(a => - a.SubSystemId == input.SubSystemId && a.Code == input.Code && a.Name == input.Name && - a.CategoryId == input.CategoryId && a.CustomerId == input.CustomerId)) - { - throw new BusinessException(message: "该子系统下该分类的客户模版已存在"); - } - - //校验模版代码唯一性 - var templateEntitys = await _trackTemplateRepository.GetListAsync(a => - a.SubSystemId == input.SubSystemId && (a.Code == input.Code || a.Name == input.Name)); - if (templateEntitys.Any()) - { - var trackTemplateCode = templateEntitys.FirstOrDefault(t => t.Code == input.Code); - if (trackTemplateCode != null) - { - throw new BusinessException(message: "该子系统下模板代码已存在"); - } - - var trackTemplateName = templateEntitys.FirstOrDefault(t => t.Name == input.Name); - if (trackTemplateName != null) - { - throw new BusinessException(message: "该子系统下模板名称已存在"); - } - } - - #endregion 业务校验 - - var entity = ObjectMapper.Map(input); - var isTrue = await _trackTemplateRepository.InsertAsync(entity); - - return new UnifyResultDto(GlobalConst.SuccessCode, "新增成功", isTrue); - } - - private async Task UpdateAsync(EditTrackTemplateInput input) - { - #region 业务校验 - - if (await _trackTemplateRepository.IsAnyAsync(a => - a.Id != input.Id && - a.SubSystemId == input.SubSystemId && a.Code == input.Code && a.Name == input.Name && - a.CategoryId == input.CategoryId && a.CustomerId == input.CustomerId)) - { - throw new BusinessException(message: "该子系统下该分类的客户模版已存在"); - } - - var templateEntitys = await _trackTemplateRepository.GetListAsync(a => - a.Id != input.Id && a.SubSystemId == input.SubSystemId && (a.Code == input.Code || a.Name == input.Name)); - if (templateEntitys.Any()) - { - //throw new BusinessException(message: "模板代码已存在于当前选择的子系统下"); - var trackTemplateCode = templateEntitys.FirstOrDefault(t => t.Code == input.Code); - if (trackTemplateCode != null) - { - throw new BusinessException(message: "该子系统下模板代码已存在"); - } - - var trackTemplateName = templateEntitys.FirstOrDefault(t => t.Name == input.Name); - if (trackTemplateName != null) - { - throw new BusinessException(message: "该子系统下模板名称已存在"); - } - } - - #endregion 业务校验 - - var templateEntity = await _trackTemplateRepository.GetFirstAsync(a => a.Id == input.Id); - if (templateEntity == null) - { - throw new BusinessException(message: "模版不存在"); - } - - ObjectMapper.Map(input, templateEntity); - var isTrue = await _trackTemplateRepository.UpdateAsync(templateEntity); - - return new UnifyResultDto(GlobalConst.SuccessCode, "修改成功", isTrue); - } - - private async Task DeleteAsync(EditTrackTemplateInput input) - { - var isTrue = await _trackTemplateRepository.SoftDeleteAsync(x => x.Id == input.Id); - - return new UnifyResultDto(GlobalConst.SuccessCode, "删除成功", isTrue); - } - - #endregion 私有方法 -} diff --git a/src/TrackCenter.Application/Services/Warning/CompleteWarningService.cs b/src/TrackCenter.Application/Services/Warning/CompleteWarningService.cs index e0de7533..671a2702 100644 --- a/src/TrackCenter.Application/Services/Warning/CompleteWarningService.cs +++ b/src/TrackCenter.Application/Services/Warning/CompleteWarningService.cs @@ -1,4 +1,3 @@ -using Fake.Application; using Fake.Application.Dtos; using InterfaceForward.Domain.Shared.Helpers; using SJZY.Expand.ABP.Core.PublicMethords; diff --git a/src/TrackCenter.Application/Services/Warning/Handlers/CompleteWarningHandler.cs b/src/TrackCenter.Application/Services/Warning/Handlers/CompleteWarningHandler.cs index af7b9967..ac8cf8c9 100644 --- a/src/TrackCenter.Application/Services/Warning/Handlers/CompleteWarningHandler.cs +++ b/src/TrackCenter.Application/Services/Warning/Handlers/CompleteWarningHandler.cs @@ -1,4 +1,3 @@ -using Fake.DependencyInjection; using TrackCenter.Application.Services.Warning.Model; using TrackCenter.Application.Services.Warning.Signals; using TrackCenter.Domain.Aggregates.OrderAggregate; diff --git a/src/TrackCenter.Application/Services/Warning/ReturnWarningService.cs b/src/TrackCenter.Application/Services/Warning/ReturnWarningService.cs index 5c27efce..1b31221d 100644 --- a/src/TrackCenter.Application/Services/Warning/ReturnWarningService.cs +++ b/src/TrackCenter.Application/Services/Warning/ReturnWarningService.cs @@ -300,7 +300,7 @@ public class ReturnWarningService : ApplicationServiceBase SubSystemId = detail.SubSystemId, SubSystemCode = subSystemCodeDict.GetValueOrDefault(detail.SubSystemId, $"系统代码{detail.SubSystemId}不存在"), CustomId = detail.CustomId, - OrderIdEsIdVersionDict = new Dictionary> + OrderIdTrackMetadataDict = new Dictionary> { [detail.OrderId] = KeyValuePair.Create(detail.TrackEsId, detail.TrackVersion) }, diff --git a/src/TrackCenter.Application/Track2InterfaceRelay/Track2InterfaceRelayHttpMessageHandler.cs b/src/TrackCenter.Application/Track2InterfaceRelay/Track2InterfaceRelayHttpMessageHandler.cs index d41f4c8a..8f63e032 100644 --- a/src/TrackCenter.Application/Track2InterfaceRelay/Track2InterfaceRelayHttpMessageHandler.cs +++ b/src/TrackCenter.Application/Track2InterfaceRelay/Track2InterfaceRelayHttpMessageHandler.cs @@ -1,5 +1,3 @@ -using Fake.Application; -using Fake.DependencyInjection; using Microsoft.Extensions.Options; using TrackCenter.Application.Helpers; diff --git a/src/TrackCenter.Application/Track2InterfaceRelay/Track2InterfaceRelaySubSystemContext.cs b/src/TrackCenter.Application/Track2InterfaceRelay/Track2InterfaceRelaySubSystemContext.cs index 298237cc..e4c34efe 100644 --- a/src/TrackCenter.Application/Track2InterfaceRelay/Track2InterfaceRelaySubSystemContext.cs +++ b/src/TrackCenter.Application/Track2InterfaceRelay/Track2InterfaceRelaySubSystemContext.cs @@ -1,5 +1,4 @@ using Fake; -using Fake.Application; namespace TrackCenter.Application.Track2InterfaceRelay; diff --git a/src/TrackCenter.Application/TrackCenter.Application.csproj b/src/TrackCenter.Application/TrackCenter.Application.csproj index 5085a5a4..ee341c98 100644 --- a/src/TrackCenter.Application/TrackCenter.Application.csproj +++ b/src/TrackCenter.Application/TrackCenter.Application.csproj @@ -8,10 +8,11 @@ - - - + + + + diff --git a/src/TrackCenter.Application/TrackCenterApplicationModule.cs b/src/TrackCenter.Application/TrackCenterApplicationModule.cs index 40d73529..9dbbabef 100644 --- a/src/TrackCenter.Application/TrackCenterApplicationModule.cs +++ b/src/TrackCenter.Application/TrackCenterApplicationModule.cs @@ -16,6 +16,7 @@ using TrackCenter.Application.Kafka; using TrackCenter.Application.CAP; using TrackCenter.Application.Hangfire; using TrackCenter.Application.Options; +using TrackCenter.Application.Rabbit; using TrackCenter.Domain.Extensions; namespace TrackCenter.Application; @@ -91,11 +92,11 @@ public class TrackCenterApplicationModule : FakeModule Console.WriteLine("-- 当前为VS本地环境,用内存存储和内存队列"); } - Action action = options => + context.Services.AddHostedService(); + context.Services.Configure(options => { options.ConnectionString = $"amqp://{configuration["RabbitMQ:UserName"]}:{configuration["RabbitMQ:Password"]}@{configuration["RabbitMQ:HostName"]}:{configuration["RabbitMQ:Port"]}"; - options.PoolSize = configuration.GetValue("RabbitMQ:PoolSize"); options.Declarations = new List>() { o => o.ExchangeDeclare(GlobalConst.TrackChangeExchange, ExchangeType.Topic, true), @@ -130,24 +131,21 @@ public class TrackCenterApplicationModule : FakeModule } } }; - }; - - context.Services.Configure(action); - context.Services.AddRabbitBoot(action, typeof(TrackCenterApplicationModule).Assembly); + }); context.Services.Configure(configuration.GetSection("TrackApp")); context.Services.Configure( configuration.GetSection("InterfaceRelayParamsConfig")); - //注册阿里云OSS服务 - context.Services.AddAliOSS(option => - { - option.AccessKeyId = configuration["OSS:AccessKeyId"]; - option.AccessKeySecret = configuration["OSS:AccessKeySecret"]; - option.Endpoint = configuration["OSS:Endpoint"]; - option.BucketName = configuration["OSS:BucketName"]; - option.ReturnHttpsUrl = true; - }); + // //注册阿里云OSS服务 + // context.Services.AddAliOSS(option => + // { + // option.AccessKeyId = configuration["OSS:AccessKeyId"]; + // option.AccessKeySecret = configuration["OSS:AccessKeySecret"]; + // option.Endpoint = configuration["OSS:Endpoint"]; + // option.BucketName = configuration["OSS:BucketName"]; + // option.ReturnHttpsUrl = true; + // }); var connectionString = $"{configuration["Redis:Host"]}" + $",password={configuration["Redis:Password"]}" + @@ -192,14 +190,14 @@ public class TrackCenterApplicationModule : FakeModule public override void PreConfigureServices(ServiceConfigurationContext context) { - PreConfigure(options => - { - options.ProxyClientActions.Add((_, _, httpClient) => - { - //如果设置Token,前端需要传入Token 否则引发异常 - httpClient.SetTokenHeader(); - httpClient.Timeout = TimeSpan.FromMinutes(3); - }); - }); + // PreConfigure(options => + // { + // options.ProxyClientActions.Add((_, _, httpClient) => + // { + // //如果设置Token,前端需要传入Token 否则引发异常 + // httpClient.SetTokenHeader(); + // httpClient.Timeout = TimeSpan.FromMinutes(3); + // }); + // }); } } diff --git a/src/TrackCenter.Domain/Aggregates/OrderAggregate/IOrderRepository.cs b/src/TrackCenter.Domain/Aggregates/OrderAggregate/IOrderRepository.cs index d9da9053..69ed99c9 100644 --- a/src/TrackCenter.Domain/Aggregates/OrderAggregate/IOrderRepository.cs +++ b/src/TrackCenter.Domain/Aggregates/OrderAggregate/IOrderRepository.cs @@ -1,6 +1,5 @@ using Fake.Application.Dtos; using TrackCenter.Domain.Dtos.Order; -using TrackCenter.Domain.VEntities; namespace TrackCenter.Domain.Aggregates.OrderAggregate; @@ -183,18 +182,4 @@ public interface IOrderRepository : IBasicRepository Task UpdateOrderPullConfigForServiceProviderAsync(UpdateOrderPullConfigsInputVo inputVo); #endregion - - /// - /// 根据id获取子系统信息 - /// - /// - /// - Task GetSystemInfoById(int id); - - /// - /// 根据id获取员工姓名 - /// - /// - /// - Task GetUserById(int id); } diff --git a/src/TrackCenter.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/TrackCenter.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs index 9f09ac3c..fc858176 100644 --- a/src/TrackCenter.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs +++ b/src/TrackCenter.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs @@ -110,7 +110,7 @@ public class TrackDetailsIndex : IdVersionIndex /// /// 创建时间 /// - public DateTime CreateTime { get; set; } + public DateTime CreateTime { get; set; } = DateTime.Now; /// /// 修改人 @@ -192,6 +192,16 @@ public class TrackDetailsIndex : IdVersionIndex /// public string? Extra { get; set; } + /// + /// 轨迹内容标记Ids(逗号分割) + /// + public string? TrackFlagIds { get; set; } + + /// + /// Pod文件地址(逗号分割) + /// + public string? PodFileUrls { get; set; } + /// /// 如果时区为空,则兜底为utc+8 /// diff --git a/src/TrackCenter.Domain/Consts/GlobalConst.MQ.cs b/src/TrackCenter.Domain/Consts/GlobalConst.MQ.cs index 70c2f6d2..c32e9baa 100644 --- a/src/TrackCenter.Domain/Consts/GlobalConst.MQ.cs +++ b/src/TrackCenter.Domain/Consts/GlobalConst.MQ.cs @@ -22,6 +22,11 @@ public partial class GlobalConst /// public const string TrackRefreshSubscribe = "TrackCenter.TrackRefresh"; + /// + /// 订单POD拉取 + /// + public const string OrderPodPullSubscribe = "TrackCenter.OrderPodPull"; + /// /// 轨迹推送 /// @@ -35,7 +40,7 @@ public partial class GlobalConst /// /// 接口通交换机 /// - public const string InterfaceRelayExchange = "sjzy.interface.relay.direct"; + public const string InterfaceRelayExchange = "interface.relay.direct"; /// /// 轨迹推送完成(接口通回调) @@ -50,31 +55,31 @@ public partial class GlobalConst /// /// 轨迹变更通知交换机 /// - public const string TrackChangeExchange = "sjzy.track.on_track_change_ex"; + public const string TrackChangeExchange = "track.on_track_change_ex"; /// /// 轨迹推送通知交换机 /// - public const string TrackPushExchange = "sjzy.track.on_track_push_ex"; + public const string TrackPushExchange = "track.on_track_push_ex"; // todo:以下需要在kafka创建主题 /// /// 预警信号kafka 主题 /// - public const string WarningKafkaTopic = "sjzy_trackapi_warning"; + public const string WarningKafkaTopic = "trackapi_warning"; /// /// 预警信号消费组 /// - public const string WarningKafkaGroup = "sjzy_trackapi_warning_group"; + public const string WarningKafkaGroup = "trackapi_warning_group"; /// /// 预警信号 DLX kafka 主题 /// - public const string WarningDLXKafkaTopic = "sjzy_trackapi_warning_dlx"; + public const string WarningDLXKafkaTopic = "trackapi_warning_dlx"; /// /// 预警信号 DLX kafka消费组 /// - public const string WarningDLXKafkaGroup = "sjzy_trackapi_warning_dlx_group"; + public const string WarningDLXKafkaGroup = "trackapi_warning_dlx_group"; } diff --git a/src/TrackCenter.Domain/Dtos/Common/TrackMetadata.cs b/src/TrackCenter.Domain/Dtos/Common/TrackMetadata.cs new file mode 100644 index 00000000..0f8ed098 --- /dev/null +++ b/src/TrackCenter.Domain/Dtos/Common/TrackMetadata.cs @@ -0,0 +1,34 @@ +namespace TrackCenter.Domain.Dtos.Common; + +public class TrackMetadata +{ + /// + /// 轨迹esId + /// + public string EsId { get; set; } + + /// + /// 轨迹es 文档版本 + /// + public long Version { get; set; } + + /// + /// 轨迹创建时间 + /// + public DateTime TrackCreateTime { get; set; } + + + public static TrackMetadata Build(string esId, long version, DateTime trackCreateTime) + { + return new TrackMetadata + { + EsId = esId, + Version = version, + TrackCreateTime = trackCreateTime + }; + } + + public TrackMetadata() + { + } +} diff --git a/src/TrackCenter.Domain/Dtos/TrackContents/TrackContentVO.cs b/src/TrackCenter.Domain/Dtos/TrackContents/TrackContentVO.cs index 946bb5d4..41cd5e41 100644 --- a/src/TrackCenter.Domain/Dtos/TrackContents/TrackContentVO.cs +++ b/src/TrackCenter.Domain/Dtos/TrackContents/TrackContentVO.cs @@ -1,7 +1,14 @@ +using TrackCenter.Domain.Extensions; + namespace TrackCenter.Domain.Dtos.TrackContents; public class TrackContentVO { + /// + /// 轨迹内容Id + /// + public int Id { get; set; } + /// /// 子系统Id /// @@ -62,6 +69,16 @@ public class TrackContentVO /// public bool IsAllowManuallyCreate { get; set; } + /// + /// 轨迹标记id,多个逗号分隔 + /// + public string? TrackFlagId { get; set; } + + /// + /// 轨迹标记 + /// + public List TrackFlags { get; set; } = Empty.List; + /// /// 是否广播 /// @@ -77,3 +94,32 @@ public class TrackContentVO /// public string TrackContentCode { get; set; } } + + +public class TrackFlagVO +{ + /// + /// 自增主键 + /// + public int Id { get; set; } + + /// + /// 标记代码 + /// + public string Code { get; set; } + + /// + /// 标记名称 + /// + public string Name { get; set; } + + /// + /// 子系统id + /// + public int SubSystemId { get; set; } + + /// + /// 是否广播 + /// + public bool IsToMq { get; set; } +} diff --git a/src/TrackCenter.Domain/Dtos/TrackNode/TrackNodeDto.cs b/src/TrackCenter.Domain/Dtos/TrackNode/TrackNodeDto.cs index fbf3709e..cb89e4df 100644 --- a/src/TrackCenter.Domain/Dtos/TrackNode/TrackNodeDto.cs +++ b/src/TrackCenter.Domain/Dtos/TrackNode/TrackNodeDto.cs @@ -30,26 +30,11 @@ public class TrackNodeDto /// public string? NodeEnName { get; set; } - /// - /// 是否删除 - /// - public bool IsDeleted { get; set; } - - /// - /// 创建人id - /// - public int CreateUserId { get; set; } - /// /// 创建时间 /// public DateTime CreateTime { get; set; } - /// - /// 更新人 - /// - public int? UpdateUserId { get; set; } - /// /// 更新时间 /// diff --git a/src/TrackCenter.Domain/TrackCenter.Domain.csproj b/src/TrackCenter.Domain/TrackCenter.Domain.csproj index 134ceee4..0e6e4ff8 100644 --- a/src/TrackCenter.Domain/TrackCenter.Domain.csproj +++ b/src/TrackCenter.Domain/TrackCenter.Domain.csproj @@ -9,11 +9,11 @@ - + - + diff --git a/src/TrackCenter.Repository/Repositories/OrderRepository.cs b/src/TrackCenter.Repository/Repositories/OrderRepository.cs index d10e09ad..d545306e 100644 --- a/src/TrackCenter.Repository/Repositories/OrderRepository.cs +++ b/src/TrackCenter.Repository/Repositories/OrderRepository.cs @@ -290,14 +290,11 @@ public class OrderRepository : BasicRepository, IOrderRepository, I exp.Or(x => x.OrderType == order.OrderType && x.SubSystemId == order.SubSystemId && x.OrderNo == order.OrderNo); // 查出id - var queryOrders = await Context.Queryable() - .WhereIF(exp != null, exp!.ToExpression()) - .Select(x => new - { - x.Id, - x.OrderNo - }) - .ToListAsync(); + var queryOrders = await GetListAsync(exp.ToExpression(), x => new + { + x.Id, + x.OrderNo + }); // 填充订单关联数据中的OrderId orderNoIdDict = queryOrders.ToDictionary(x => x.OrderNo, x => x.Id); @@ -480,16 +477,6 @@ public class OrderRepository : BasicRepository, IOrderRepository, I .ToListAsync(); } - public Task GetSystemInfoById(int id) - { - return Context.Queryable().FirstAsync(m => m.IsDeleted == false && m.Id == id); - } - - public Task GetUserById(int id) - { - return Context.Queryable().FirstAsync(m => m.IsDeleted == false && m.Id == id); - } - private int UpdateOrderQuestionType(int questionType, IEnumerable ids) { var idsString = string.Join(",", ids); diff --git a/src/TrackCenter.Repository/Repositories/TrackContentRepository.cs b/src/TrackCenter.Repository/Repositories/TrackContentRepository.cs index b132531e..e4fed4ae 100644 --- a/src/TrackCenter.Repository/Repositories/TrackContentRepository.cs +++ b/src/TrackCenter.Repository/Repositories/TrackContentRepository.cs @@ -1,10 +1,11 @@ using System.Linq.Expressions; +using Fake.Domain.Entities.Auditing; using TrackCenter.Domain.Aggregates.TrackContentAggregate; using TrackCenter.Domain.Aggregates.TrackFlagAggregate; using TrackCenter.Domain.Aggregates.TrackStatusAggregate; using TrackCenter.Domain.Aggregates.TrackTemplateAggregate; using TrackCenter.Domain.Dtos.TrackContents; -using TrackCenter.Repository.VEntities; +using TrackCenter.Domain.VEntities; namespace TrackCenter.Repository.Repositories; @@ -211,7 +212,7 @@ public class TrackContentRepository : BasicRepository, ITrac { return await Context.Updateable() .Where(whereExpression) - .SetColumns(nameof(ISoftDeleteBasicEntity.IsDeleted), true) + .SetColumns(nameof(ISoftDelete.IsDeleted), true) .ExecuteCommandHasChangeAsync(); } diff --git a/src/TrackCenter.Repository/Repositories/TrackDetailsEsRepository.cs b/src/TrackCenter.Repository/Repositories/TrackDetailsEsRepository.cs index 055bea66..9d3884c1 100644 --- a/src/TrackCenter.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/TrackCenter.Repository/Repositories/TrackDetailsEsRepository.cs @@ -1,6 +1,5 @@ +using InterfaceForward.Domain.Shared.Helpers; using Nest; -using SJZY.Expand.ABP.Core.PublicMethords; -using SJZY.Expand.ElasticSearch.Services; using TrackCenter.Domain.Aggregates.OrderAggregate; using TrackCenter.Domain.Aggregates.TrackDetailsAggregate; using TrackCenter.Domain.Aggregates.TrackPushAggregate; @@ -8,9 +7,7 @@ using TrackCenter.Domain.Consts; using TrackCenter.Domain.Dtos.TrackDetails; using TrackCenter.Domain.Enums; using TrackCenter.Domain.Extensions; -using TrackCenter.Repository.Aggregates.OrderAggregate; using TrackCenter.Repository.ES; -using ListWrapperFactory = TrackCenter.Repository.ES.ListWrapperFactory; namespace TrackCenter.Repository.Repositories; @@ -379,7 +376,6 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract, ITrackFlagRepository, IScopedDependency { - public TrackFlagRepository() - { - } - /// /// 获取轨迹标记明细 /// diff --git a/src/TrackCenter.Repository/Repositories/TrackNodeRepository.cs b/src/TrackCenter.Repository/Repositories/TrackNodeRepository.cs index e03d68ce..ac0d5c32 100644 --- a/src/TrackCenter.Repository/Repositories/TrackNodeRepository.cs +++ b/src/TrackCenter.Repository/Repositories/TrackNodeRepository.cs @@ -1,6 +1,6 @@ using TrackCenter.Domain.Aggregates.TrackNodeAggregate; using TrackCenter.Domain.Dtos.TrackNode; -using TrackCenter.Repository.VEntities; +using TrackCenter.Domain.VEntities; namespace TrackCenter.Repository.Repositories; @@ -24,7 +24,6 @@ public class TrackNodeRepository : BasicRepository, ITrackNodeR SubSystemId = t.SubSystemId, UpdateTime = t.UpdateTime, CreateTime = t.CreateTime, - UpdateUserId = t.UpdateUserId, UpdateUserName = u2.Name, CreateUserName = u1.Name, SystemName = u3.CnName @@ -71,7 +70,6 @@ public class TrackNodeRepository : BasicRepository, ITrackNodeR SubSystemId = t.SubSystemId, UpdateTime = t.UpdateTime, CreateTime = t.CreateTime, - UpdateUserId = t.UpdateUserId, UpdateUserName = u2.Name, CreateUserName = u1.Name, SystemName = u3.CnName diff --git a/src/TrackCenter.Repository/Repositories/TrackPullConfigRepository.cs b/src/TrackCenter.Repository/Repositories/TrackPullConfigRepository.cs index eb50d391..0984ceac 100644 --- a/src/TrackCenter.Repository/Repositories/TrackPullConfigRepository.cs +++ b/src/TrackCenter.Repository/Repositories/TrackPullConfigRepository.cs @@ -1,12 +1,13 @@ using System.Linq.Expressions; -using SJZY.Expand.ABP.Core.PublicMethords; +using Fake.Domain.Entities.Auditing; +using InterfaceForward.Domain.Shared.Helpers; using TrackCenter.Domain.Aggregates.TrackContentAggregate; using TrackCenter.Domain.Aggregates.TrackPullAggregate; using TrackCenter.Domain.Aggregates.TrackStatusAggregate; using TrackCenter.Domain.Dtos.Common; using TrackCenter.Domain.Dtos.TrackPull; using TrackCenter.Domain.Enums; -using TrackCenter.Repository.VEntities; +using TrackCenter.Domain.VEntities; namespace TrackCenter.Repository.Repositories; @@ -136,7 +137,7 @@ public class TrackPullConfigRepository : BasicRepository, { return await Context.Updateable() .Where(whereExpression) - .SetColumns(nameof(ISoftDeleteBasicEntity.IsDeleted), true) + .SetColumns(nameof(ISoftDelete.IsDeleted), true) .ExecuteCommandHasChangeAsync(); } diff --git a/src/TrackCenter.Repository/Repositories/TrackPushConfigRepository.cs b/src/TrackCenter.Repository/Repositories/TrackPushConfigRepository.cs index 00e2144b..df518c29 100644 --- a/src/TrackCenter.Repository/Repositories/TrackPushConfigRepository.cs +++ b/src/TrackCenter.Repository/Repositories/TrackPushConfigRepository.cs @@ -1,11 +1,12 @@ using System.Linq.Expressions; -using SJZY.Expand.ABP.Core.PublicMethords; +using Fake.Domain.Entities.Auditing; +using InterfaceForward.Domain.Shared.Helpers; using TrackCenter.Domain.Aggregates.TrackContentAggregate; using TrackCenter.Domain.Aggregates.TrackPushAggregate; using TrackCenter.Domain.Dtos.Common; using TrackCenter.Domain.Dtos.TrackPush; using TrackCenter.Domain.Enums; -using TrackCenter.Repository.VEntities; +using TrackCenter.Domain.VEntities; namespace TrackCenter.Repository.Repositories; @@ -98,7 +99,7 @@ public class TrackPushConfigRepository : BasicRepository, { return await Context.Updateable() .Where(whereExpression) - .SetColumns(nameof(ISoftDeleteBasicEntity.IsDeleted), true) + .SetColumns(nameof(ISoftDelete.IsDeleted), true) .ExecuteCommandHasChangeAsync(); } diff --git a/src/TrackCenter.Repository/Repositories/TrackPushRecordEsRepository.cs b/src/TrackCenter.Repository/Repositories/TrackPushRecordEsRepository.cs index 89161bc5..fdfed74d 100644 --- a/src/TrackCenter.Repository/Repositories/TrackPushRecordEsRepository.cs +++ b/src/TrackCenter.Repository/Repositories/TrackPushRecordEsRepository.cs @@ -1,11 +1,8 @@ using Nest; -using SJZY.Expand.ABP.Core.Logger; -using SJZY.Expand.ElasticSearch.Services; using TrackCenter.Domain.Aggregates.TrackPushAggregate; using TrackCenter.Domain.Consts; using TrackCenter.Domain.Extensions; using TrackCenter.Repository.ES; -using ListWrapperFactory = TrackCenter.Repository.ES.ListWrapperFactory; namespace TrackCenter.Repository.Repositories; diff --git a/test/SJZY.Track.Test/SJZY - Backup.Track.Test.csproj b/test/SJZY.Track.Test/SJZY - Backup.Track.Test.csproj deleted file mode 100644 index c2b5048f..00000000 --- a/test/SJZY.Track.Test/SJZY - Backup.Track.Test.csproj +++ /dev/null @@ -1,45 +0,0 @@ - - - - net7.0 - enable - enable - - false - - - - - - - - - PreserveNewest - true - PreserveNewest - - - - - - - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - diff --git a/test/SJZY.Track.Test/SJZY.Track.Test.csproj b/test/SJZY.Track.Test/SJZY.Track.Test.csproj deleted file mode 100644 index e1102396..00000000 --- a/test/SJZY.Track.Test/SJZY.Track.Test.csproj +++ /dev/null @@ -1,45 +0,0 @@ - - - - net8 - enable - enable - - false - - - - - - - - - PreserveNewest - true - PreserveNewest - - - - - - - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - diff --git a/test/SJZY.Track.Test/Startup.cs b/test/SJZY.Track.Test/Startup.cs deleted file mode 100644 index 2a827811..00000000 --- a/test/SJZY.Track.Test/Startup.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace TrackCenter.Test; - -public class Startup -{ - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) - { - app.InitializeApplication(); - } -} diff --git a/test/SJZY.Track.Test/TestModule.cs b/test/SJZY.Track.Test/TestModule.cs deleted file mode 100644 index cbc669b0..00000000 --- a/test/SJZY.Track.Test/TestModule.cs +++ /dev/null @@ -1,63 +0,0 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; -using TrackCenter.Repository; -using TrackCenter.Api; -using Volo.Abp; -using Volo.Abp.AspNetCore.TestBase; -using Volo.Abp.Authorization; -using Volo.Abp.Autofac; -using Volo.Abp.Data; -using Volo.Abp.Http.Client; -using Volo.Abp.Modularity; -using Volo.Abp.Threading; - -[assembly: HostingStartup(typeof(SJZY.Expand.ABP.Core.HostingStartup))] - -namespace TrackCenter.Test; - -[DependsOn( - typeof(AbpAspNetCoreTestBaseModule), - typeof(AbpAutofacModule), - typeof(AbpAuthorizationModule), - typeof(SjzyTrackRepositoryModule), - typeof(SjzyTrackApplicationModule), - typeof(TrackCenterApiModule), - typeof(AbpHttpClientModule) //添加abp的http代理模块 -)] -[assembly: HostingStartup(typeof(Expand.ABP.Core.HostingStartup))] -public class TestModule : FakeModule -{ - public override void ConfigureServices(ServiceConfigurationContext context) - { - context.Services.AddAlwaysAllowAuthorization(); - //添加内网服务 - //context.Services.AddHttpClientProxies(typeof(LoggerCenterHttpApiModule).Assembly, "LoggerCenter", false); - } - - public override void OnApplicationInitialization(ApplicationInitializationContext context) - { - SeedTestData(context); - } - - public override void OnApplicationShutdown(ApplicationShutdownContext context) - { - //根据业务场景决定,是否需要删除测试数据 - } - - /// - /// 生成种子测试数据 - /// - /// - private static void SeedTestData(ApplicationInitializationContext context) - { - AsyncHelper.RunSync(async () => - { - using (var scope = context.ServiceProvider.CreateScope()) - { - await scope.ServiceProvider - .GetRequiredService() - .SeedAsync(); - } - }); - } -} diff --git a/test/SJZY.Track.Test/TestModuleTestBase.cs b/test/SJZY.Track.Test/TestModuleTestBase.cs deleted file mode 100644 index 86ab1b04..00000000 --- a/test/SJZY.Track.Test/TestModuleTestBase.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Volo.Abp.AspNetCore.TestBase; - -namespace TrackCenter.Test; - -public class TestModuleTestBase : AbpAspNetCoreIntegratedTestBase -{ - protected override void ConfigureServices(HostBuilderContext context, IServiceCollection services) - { - base.ConfigureServices(context, services); - } -} diff --git a/test/SJZY.Track.Test/Usings.cs b/test/SJZY.Track.Test/Usings.cs deleted file mode 100644 index c802f448..00000000 --- a/test/SJZY.Track.Test/Usings.cs +++ /dev/null @@ -1 +0,0 @@ -global using Xunit; diff --git a/test/SJZY.Track.Test/appsettings.json b/test/SJZY.Track.Test/appsettings.json deleted file mode 100644 index 3a46aee6..00000000 --- a/test/SJZY.Track.Test/appsettings.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "Environment": "Dev", - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "ConnectionStrings": { - "DefaultConnection": "server=192.168.80.81;Database=sjzy_package_setting;Uid=root;Pwd=10c1fb814e7c1552;SslMode=None;Charset=utf8mb4;", - "DataCenter": "server=192.168.80.81;Database=sjzy_data_center;Uid=root;Pwd=10c1fb814e7c1552;SslMode=None;Charset=utf8mb4;" - }, - "Redis": { - "ConnectionString": "192.168.80.56:6379,abortConnect=false", - "PassWord": "sjzyadmin", - "DefaultDatabaseIndex": 8, - "Prefix": "" - }, - "Consul": { - "ServiceName": "Package.Setting", - "ServiceIP": "192.168.80.55", - "ServicePort": 5047, - "ServiceHealthCheck": "http://192.168.80.55:5047/HealthCheck", - "ConsulAddress": "http://192.168.80.56:8500" - }, - "CorsPolicy": [ - "" - ], - "Swagger": { - "IsEnable": true, - "ServiceUrl": "", - "JsonUrlPrefix": "", //转发目录前缀,部署服务器时需要配置 /kingmall - "ScanPrefix": [ "SJZY" ] //全局扫描程序集或xml文件时只加载以 SJZY 开头的内容 - }, - "RabbitMQ": { - "UserName": "sjzy", - "Password": "sjzyadmin", - "HostName": "192.168.80.56", - "Port": 5672 - }, - "Custome": { - "Setting1": 12, - "Setting2": 22 - }, - "Serilog": { - "MinimumLevel": { - "Default": "Information", - "Override": { - "System": "Warning", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information", - "Microsoft.EntityFrameworkCore": "Information" - } - }, - "Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId" ], - "WriteTo": [ - { - "Name": "Console", - "Args": { - //"theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, SystemConsoleTheme.Literate", - "outputTemplate": "{NewLine}[{Timestamp:yyyy-MM-dd HH:mm:ss fff} {Level:u3}] {Message:lj}" - } - }, - { - "Name": "File", - "Args": { - "path": "logs/.log", - "rollingInterval": "Day", - "outputTemplate": "{NewLine}[{Timestamp:yyyy-MM-dd HH:mm:ss,fff} {Level:u3}] {Message:lj}" - } - }, - { - "Name": "Elasticsearch", - "Args": { - "nodeUris": "http://192.168.80.97:9200", - "indexFormat": "log_package_setting_{0:yyyy.MM.dd}", - "autoRegisterTemplate": true, - "autoRegisterTemplateVersion": "ESv7", - "connectionGlobalHeaders": "Authorization=Basic ZWxhc3RpYzpzanp5YWRtaW4=;" - } - } - ] - }, - "OSS": { - "AccessKeyId": "LTAI5tJWyx1kgQfk221QFknu", - "AccessKeySecret": "0AvP3vyBdwT1pwvLXeqeJ448US8QL8", - "Endpoint": "http://oss-cn-shenzhen.aliyuncs.com/", - "BucketName": "cams3", - "ReturnHttpsUrl": true - } -}