From 9494ca2cb79111b6e47498aec7f885fa4425c05d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E5=96=9C=E6=97=BA?= Date: Fri, 26 Jul 2024 21:04:19 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=20=E8=BD=A8=E8=BF=B9=E6=98=A0?= =?UTF-8?q?=E5=B0=84-=E6=96=B0=E5=A2=9E=E6=8B=89=E5=8F=96=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E5=A2=9E=E5=8A=A0=E5=AD=97=E6=AE=B5=EF=BC=9A=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E6=8B=89=E5=8F=96=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackPull/TrackPullParamConfigDto.cs | 5 +++ .../Events/OrderIdentifier.cs | 2 + .../TrackChangeAfterUpdateOrderEvent.cs | 5 +++ ...ChangeBottomLineUpdateOrderEventHandler.cs | 5 ++- ...TrackChangeAfterUpdateOrderEventHandler.cs | 7 ++++ .../EventHandlers/TrackUpsertEventHandler.cs | 40 +++++++++++++++++-- .../Aggregates/OrderAggregate/OrderEntity.cs | 8 +++- .../TrackPushPullParamsConfigEntity.cs | 6 +++ .../Dtos/Order/OrderTransportDto.cs | 10 +++++ .../GetTrackPullConfigDetailOutputVO.cs | 5 +++ .../Queries/IProvideQueries.cs | 7 ++++ .../Queries/ProvideQueries.cs | 16 +++++++- .../Repositories/OrderRepository.cs | 5 ++- .../Repositories/TrackPullConfigRepository.cs | 3 +- 14 files changed, 115 insertions(+), 9 deletions(-) create mode 100644 src/SJZY.Track.Domain/Dtos/Order/OrderTransportDto.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullParamConfigDto.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullParamConfigDto.cs index 79af5185..c4f65d0b 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullParamConfigDto.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullParamConfigDto.cs @@ -46,4 +46,9 @@ public class TrackPullParamConfigDto /// 轨迹明细数组路径 /// public string TrackDetailsPath { get; set; } = null!; + + /// + /// 轨迹内容代码 + /// + public string? TrackContentCode { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Events/OrderIdentifier.cs b/src/SJZY.Track.Application.Contract/Events/OrderIdentifier.cs index 158e64b1..48186952 100644 --- a/src/SJZY.Track.Application.Contract/Events/OrderIdentifier.cs +++ b/src/SJZY.Track.Application.Contract/Events/OrderIdentifier.cs @@ -7,4 +7,6 @@ public struct OrderIdentifier public int OrderType { get; set; } public int CustomId { get; set; } + + public bool IsTrigger { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs index b52a95a3..526febd8 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs @@ -41,4 +41,9 @@ public class TrackChangeAfterUpdateOrderEvent /// 轨迹时区 /// public float TrackTimeZone { get; set; } + + /// + /// 根据配置规则,标记拉取时需要的订单Id + /// + public int[] TriggerPullOrderIds { get; set; } = Array.Empty(); } \ No newline at end of file diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/PullChangeBottomLineUpdateOrderEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/PullChangeBottomLineUpdateOrderEventHandler.cs index 0365727d..cccaf7eb 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/PullChangeBottomLineUpdateOrderEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/PullChangeBottomLineUpdateOrderEventHandler.cs @@ -6,6 +6,9 @@ using Volo.Abp.DependencyInjection; namespace SJZY.Track.Application.CAP.EventHandlers; +/// +/// 拉去轨迹后,执行了兜底操作还是失败的标记操作 +/// public class PullChangeBottomLineUpdateOrderEventHandler :ITransientDependency, ICapSubscribe { private readonly IOrderRepository _orderRepository; @@ -18,6 +21,6 @@ public class PullChangeBottomLineUpdateOrderEventHandler :ITransientDependency, [CapSubscribe(GlobalConst.PullChangeBottomLineUpdateOrderSubscribe)] public async Task ConsumerAsync(PullChangeBottomLineUpdateOrderEvent @event) { - await _orderRepository.UpdateBatchIdsAsync(@event.OrderIds, @event.DeficiencyTagValue); + var rows =await _orderRepository.UpdateBatchIdsAsync(@event.OrderIds, @event.DeficiencyTagValue); } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs index 859fb666..f5766880 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs @@ -28,6 +28,7 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa if (orders.Count == 0) return; var updateOrders = new List(); + foreach (var order in orders) { if (order.LatestTrackContent != @event.TrackContent) @@ -45,6 +46,12 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa order.IsCompleted = @event.IsCompleted; } + // 触发拉取节点 + if (@event.TriggerPullOrderIds.Contains(order.Id)) + { + order.IsTriggerPull = 1; + } + order.LatestTrackContent = @event.TrackContent; order.LatestTrackEnContent = @event.TrackEnContent; order.LatestTrackPlace = @event.TrackPlace; diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index baa3d8b3..cee1dc82 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -2,11 +2,14 @@ using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Track.Application.Contract.Events; +using SJZY.Track.Application.Contract.Services; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Consts; +using SJZY.Track.Domain.Dtos.Order; using SJZY.Track.Domain.Queries; using Volo.Abp.DependencyInjection; +using OrderIdentifier = SJZY.Track.Application.Contract.Events.OrderIdentifier; namespace SJZY.Track.Application.CAP.EventHandlers; @@ -16,14 +19,16 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe private readonly IProvideQueries _provideQueries; private readonly ITrackDetailsRepository _trackDetailsRepository; private readonly ICapPublisher _capPublisher; + private readonly ITrackPullCacheService _trackPullCacheService; public TrackUpsertEventHandler(IOrderRepository orderRepository, ICapPublisher capPublisher, - IProvideQueries provideQueries, ITrackDetailsRepository trackDetailsRepository) + IProvideQueries provideQueries, ITrackDetailsRepository trackDetailsRepository, ITrackPullCacheService trackPullCacheService) { _orderRepository = orderRepository; _capPublisher = capPublisher; _provideQueries = provideQueries; _trackDetailsRepository = trackDetailsRepository; + _trackPullCacheService = trackPullCacheService; } [CapSubscribe(GlobalConst.TrackUpsertSubscribe, Group = GlobalConst.TrackUpsertSubscribe)] @@ -100,7 +105,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe } } } - + private async Task HandleTrackAsync(TrackUpsertEvent @event, List canNextOrderIds) { var content = await _provideQueries.GetTrackContentAsync(@event.SubSystemId, @event.TrackCode); @@ -114,7 +119,9 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe var trackContents = await _provideQueries.MatchTrackContentAsync(newOrderIds, @event.TrackCode); var insertTracks = new List(); + var triggerPullOrder = new List(); + var providerDic=await GetProviderDic(orderIds); foreach (var order in @event.OrderIdentifiers) { var track = tracks.FirstOrDefault(x => x.OrderId == order.OrderId); @@ -170,13 +177,24 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe } canNextOrderIds.Add(order.OrderId); + + if(!providerDic.TryGetValue(order.OrderId,out var provider)) + continue; + + var config = + await _trackPullCacheService.GetPullParamWithContentConfigAsync(provider.SubSystemId, + provider.ServiceProviderId); + if (config!=null && config.ParamConfig!=null && config.ParamConfig.TrackContentCode == @event.TrackCode) + { + triggerPullOrder.Add(order.OrderId); + } } if (canNextOrderIds.Count == 0) return; // 批量add to es await _trackDetailsRepository.AddManyAsync(insertTracks); - + // 触发订单主表更新事件(异步) await _capPublisher.PublishAsync(GlobalConst.TrackChangeAfterUpdateOrderSubscribe, new TrackChangeAfterUpdateOrderEvent @@ -188,7 +206,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackStatusId = content.TrackStatusId, TrackPlace = @event.TrackPlace, TrackTime = @event.TrackTime, - TrackTimeZone = @event.TrackTimeZone + TrackTimeZone = @event.TrackTimeZone, + TriggerPullOrderIds = triggerPullOrder.ToArray() }); // 触发轨迹推送事件(异步) @@ -215,4 +234,17 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, trackPushEvent); } } + + /// + /// 获取服务商字典 + /// + /// + /// + private async Task> GetProviderDic(int[] orderIds) + { + var providerList = await _provideQueries.FindOrderWithServiceProviderAsync(orderIds); + return providerList.GroupBy(val => val.OrderId) + .ToDictionary(val => val.Key, val => val.First()); + } + } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs index 4aefeac6..51e8d0e6 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs @@ -167,7 +167,13 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot /// [SugarColumn(ColumnName = "ArrivalProvince")] public string? ArrivalProvince { get; set; } - + + /// + /// 是否触发拉取,1表示触发 + /// + [SugarColumn(ColumnName = "IsTriggerPull")] + public short? IsTriggerPull { get; set; } + [SugarColumn(IsIgnore = true)] public List OrderFlights { get; set; } [SugarColumn(IsIgnore = true)] public List OrderTemplates { get; set; } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPullAggregate/TrackPushPullParamsConfigEntity.cs b/src/SJZY.Track.Domain/Aggregates/TrackPullAggregate/TrackPushPullParamsConfigEntity.cs index 59ea07e1..9687307f 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPullAggregate/TrackPushPullParamsConfigEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPullAggregate/TrackPushPullParamsConfigEntity.cs @@ -89,4 +89,10 @@ public class TrackPushPullParamsConfigEntity : IFullAuditedBasicEntitys, IEntity /// [SugarColumn(ColumnName = "ExpandFieldsName")] public string? ExpandFieldsName { get; set; } + + /// + /// 轨迹内容代码 + /// + [SugarColumn(ColumnName = "TrackContentCode")] + public string? TrackContentCode { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Order/OrderTransportDto.cs b/src/SJZY.Track.Domain/Dtos/Order/OrderTransportDto.cs new file mode 100644 index 00000000..d7d03691 --- /dev/null +++ b/src/SJZY.Track.Domain/Dtos/Order/OrderTransportDto.cs @@ -0,0 +1,10 @@ +namespace SJZY.Track.Domain.Dtos.Order; + +public class OrderTransportDto +{ + public int OrderId { get; set; } + + public int ServiceProviderId { get; set; } + + public int SubSystemId { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/TrackPull/GetTrackPullConfigDetailOutputVO.cs b/src/SJZY.Track.Domain/Dtos/TrackPull/GetTrackPullConfigDetailOutputVO.cs index c52c081b..dbe0b308 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackPull/GetTrackPullConfigDetailOutputVO.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackPull/GetTrackPullConfigDetailOutputVO.cs @@ -78,4 +78,9 @@ public class GetTrackPullConfigDetailOutputVO /// 轨迹明细路径 /// public string TrackDetailsPath { get; set; } + + /// + /// 轨迹内容代码 + /// + public string? TrackContentCode { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Queries/IProvideQueries.cs b/src/SJZY.Track.Domain/Queries/IProvideQueries.cs index e01e5a50..6392d05e 100644 --- a/src/SJZY.Track.Domain/Queries/IProvideQueries.cs +++ b/src/SJZY.Track.Domain/Queries/IProvideQueries.cs @@ -68,4 +68,11 @@ public interface IProvideQueries int pageSize = 1000); Task GetTrackContentAsync(int subSystemId, string trackCode); + + /// + /// 查找订单和服务商信息 + /// + /// 订单id + /// 订单和服务商信息 + Task> FindOrderWithServiceProviderAsync(int[] orderIds); } \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs index 5ffffe7a..60043689 100644 --- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs +++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs @@ -122,7 +122,7 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, return await Context.Queryable() .RightJoin((a, b) => a.Id == b.OrderId) .LeftJoin((a, b, c) => b.ServiceProviderId == c.Id) - .Where((a, b) => b.ServiceProviderId == serviceProvider && !a.IsCompleted) + .Where((a, b) => b.ServiceProviderId == serviceProvider && !a.IsCompleted && a.IsTriggerPull==1) .Select((a, b, c) => new OrderWithServiceProviderVO { OrderNo = a.OrderNo, @@ -136,6 +136,20 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, .Take(pageSize) .ToListAsync(); } + + public async Task> FindOrderWithServiceProviderAsync(int[] orderIds) + { + return await Context.Queryable() + .InnerJoin((a, b) => a.Id == b.OrderId) + .Where((a, b) => orderIds.Contains( a.Id) && !a.IsCompleted) + .Select((a, b) => new OrderTransportDto + { + OrderId = a.Id, + ServiceProviderId = b.ServiceProviderId, + SubSystemId = a.SubSystemId + }) + .ToListAsync(); + } public async Task GetTrackContentAsync(int subSystemId, string trackCode) { diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index aa825973..6f2130ae 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -1,5 +1,6 @@ using SJZY.Track.Domain; using SJZY.Track.Domain.Aggregates.OrderAggregate; +using SJZY.Track.Domain.Consts; using SJZY.Track.Domain.Dtos.Order; namespace SJZY.Track.Repository.Repositories; @@ -21,7 +22,9 @@ public class OrderRepository : BasicRepository, IOrderRepository, I public Task UpdateBatchIdsAsync(List ids, int newValue) { - return Context.Ado.ExecuteCommandAsync("UPDATE `t_order` SET `DeficiencyTag` = @newValue WHERE `Id` IN @ids", new { ids, newValue }); + var idsString = string.Join(",", ids); + return Context.Ado.ExecuteCommandAsync( + $"UPDATE `t_order` SET `DeficiencyTag` = @newValue ,UpdateTime= current_timestamp WHERE `Id` IN ({idsString})", new { newValue }); } public async Task UpdateOrderAsync(OrderEntity order) diff --git a/src/SJZY.Track.Repository/Repositories/TrackPullConfigRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackPullConfigRepository.cs index b3267e8a..41d9053b 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackPullConfigRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackPullConfigRepository.cs @@ -72,7 +72,8 @@ public class TrackPullConfigRepository : BasicRepository, { Id = trackPull.Id, SubSystem = system.CnName, - ServiceProvider = service.Name + ServiceProvider = service.Name, + TrackContentCode = paramsConfig.TrackContentCode }, true) .SingleAsync(); } From 3df894d20b45ebd5717b5013be5e5468709fb714 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E5=96=9C=E6=97=BA?= Date: Sat, 27 Jul 2024 09:39:02 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20=E8=8A=82=E7=82=B9=E8=A1=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=AD=90=E7=B3=BB=E7=BB=9F=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TrackNodeService.cs | 12 ++++++++ .../ITrackNodeRepository.cs | 7 +++++ .../Dtos/TrackNode/TrackNodeDto.cs | 5 ++++ .../Repositories/TrackNodeRepository.cs | 29 +++++++++++++++++-- 4 files changed, 51 insertions(+), 2 deletions(-) rename src/SJZY.Track.Application/Services/{TrackNodeServices => TrackNode}/TrackNodeService.cs (92%) diff --git a/src/SJZY.Track.Application/Services/TrackNodeServices/TrackNodeService.cs b/src/SJZY.Track.Application/Services/TrackNode/TrackNodeService.cs similarity index 92% rename from src/SJZY.Track.Application/Services/TrackNodeServices/TrackNodeService.cs rename to src/SJZY.Track.Application/Services/TrackNode/TrackNodeService.cs index 7b8f3d3a..76506271 100644 --- a/src/SJZY.Track.Application/Services/TrackNodeServices/TrackNodeService.cs +++ b/src/SJZY.Track.Application/Services/TrackNode/TrackNodeService.cs @@ -54,6 +54,18 @@ namespace SJZY.Track.Application.Services.TrackNodeServices var resultDto = await _trackNodeRepository.GetPageList(queryParam); return resultDto; } + + /// + /// 获取详情 + /// + /// 节点id + /// + [HttpPost("GetDetail")] + public async Task GetDetail(int nodeid) + { + var resultDto = await _trackNodeRepository.GetDetail(nodeid); + return new UnifyResultDto(true,resultDto); + } /// /// 获取分页轨迹字典,下拉框用的 diff --git a/src/SJZY.Track.Domain/Aggregates/TrackNodeAggregate/ITrackNodeRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackNodeAggregate/ITrackNodeRepository.cs index 10d1cb70..6ab6f473 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackNodeAggregate/ITrackNodeRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackNodeAggregate/ITrackNodeRepository.cs @@ -24,4 +24,11 @@ public interface ITrackNodeRepository:IBasicRepository /// /// Task DeleteById(long inputId); + + /// + /// 获取详情 + /// + /// + /// + Task GetDetail(long id); } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/TrackNode/TrackNodeDto.cs b/src/SJZY.Track.Domain/Dtos/TrackNode/TrackNodeDto.cs index 185f432f..401ec773 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackNode/TrackNodeDto.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackNode/TrackNodeDto.cs @@ -14,6 +14,11 @@ public class TrackNodeDto /// 子系统id /// public int SubSystemId { get; set; } + + /// + /// 系统名称 + /// + public string? SystemName { get; set; } /// /// 节点名称 diff --git a/src/SJZY.Track.Repository/Repositories/TrackNodeRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackNodeRepository.cs index be340230..9f767780 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackNodeRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackNodeRepository.cs @@ -11,10 +11,11 @@ public class TrackNodeRepository: BasicRepository,ITrackNodeRep var result = await Context.Queryable() .LeftJoin((t,u1)=>t.CreateUserId==u1.Id) .LeftJoin((t,u1,u2)=>t.UpdateUserId==u2.Id) + .LeftJoin((t,u1,u2,u3)=>t.SubSystemId==u3.Id) .Where((t,u1,u2)=>!t.IsDeleted&&!u1.IsDeleted&&!u2.IsDeleted) .WhereIF(!string.IsNullOrEmpty(queryParam.KeyWord), (t,u1,u2)=>t.NodeName!.Contains(queryParam.KeyWord)||t.NodeEnName!.Contains(queryParam.KeyWord)) .WhereIF(queryParam.SystemId.HasValue,(t,u1,u2)=>t.SubSystemId == queryParam.SystemId.Value) - .Select((t, u1, u2) =>new TrackNodeDto() + .Select((t, u1, u2,u3) =>new TrackNodeDto() { Id = t.Id, NodeName = t.NodeName, @@ -24,7 +25,8 @@ public class TrackNodeRepository: BasicRepository,ITrackNodeRep CreateTime = t.CreateTime, UpdateUserId = t.UpdateUserId, UpdateUserName = u2.Name, - CreateUserName = u1.Name + CreateUserName = u1.Name, + SystemName = u3.CnName }).ToPagedListAsync(queryParam.PageIndex, queryParam.PageSize); return result; @@ -50,4 +52,27 @@ public class TrackNodeRepository: BasicRepository,ITrackNodeRep { return Context.Deleteable().Where(val=>val.Id==inputId).ExecuteCommandAsync(); } + + public async Task GetDetail(long id) + { + var result = await Context.Queryable() + .LeftJoin((t, u1) => t.CreateUserId == u1.Id) + .LeftJoin((t, u1, u2) => t.UpdateUserId == u2.Id) + .LeftJoin((t, u1, u2, u3) => t.SubSystemId == u3.Id) + .Where((t, u1, u2) => !t.IsDeleted && !u1.IsDeleted && !u2.IsDeleted) + .Select((t, u1, u2, u3) => new TrackNodeDto() + { + Id = t.Id, + NodeName = t.NodeName, + NodeEnName = t.NodeEnName, + SubSystemId = t.SubSystemId, + UpdateTime = t.UpdateTime, + CreateTime = t.CreateTime, + UpdateUserId = t.UpdateUserId, + UpdateUserName = u2.Name, + CreateUserName = u1.Name, + SystemName = u3.CnName + }).FirstAsync(); + return result; + } } \ No newline at end of file From e3127924723960f2bf23a6bdb5dd7a40346b3862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E5=96=9C=E6=97=BA?= Date: Sat, 27 Jul 2024 10:11:29 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4dto=E6=98=A0?= =?UTF-8?q?=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackNode/TrackNodeInput.cs | 6 +++--- .../AutoMapper/TrackNodeMapperProfile.cs | 6 +++--- .../Services/TrackNode/TrackNodeService.cs | 12 ++++++------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackNode/TrackNodeInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackNode/TrackNodeInput.cs index 8e313589..d487c033 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackNode/TrackNodeInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackNode/TrackNodeInput.cs @@ -15,15 +15,15 @@ public class EditTrackNodeInput /// /// 系统id /// - public int SystemId { get; set; } + public int? SubSystemId { get; set; } /// /// 节点名称 /// - public string Name { get; set; } + public string? NodeName { get; set; } /// /// 节点英文名称 /// - public string EnName { get; set; } + public string? NodeEnName { get; set; } } diff --git a/src/SJZY.Track.Application/AutoMapper/TrackNodeMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/TrackNodeMapperProfile.cs index af8699e0..b2226591 100644 --- a/src/SJZY.Track.Application/AutoMapper/TrackNodeMapperProfile.cs +++ b/src/SJZY.Track.Application/AutoMapper/TrackNodeMapperProfile.cs @@ -12,9 +12,9 @@ public class TrackNodeMapperProfile :Profile { CreateMap(); CreateMap(MemberList.None) - .ForMember(val => val.NodeName, opt => opt.MapFrom(src => src.Name)) - .ForMember(val => val.NodeEnName, opt => opt.MapFrom(src => src.EnName)) - .ForMember(val => val.SubSystemId, opt => opt.MapFrom(src => src.SystemId)); + .ForMember(val => val.NodeName, opt => opt.MapFrom(src => src.NodeName)) + .ForMember(val => val.NodeEnName, opt => opt.MapFrom(src => src.NodeEnName)) + .ForMember(val => val.SubSystemId, opt => opt.MapFrom(src => src.SubSystemId)); } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/TrackNode/TrackNodeService.cs b/src/SJZY.Track.Application/Services/TrackNode/TrackNodeService.cs index 76506271..c69ed6fd 100644 --- a/src/SJZY.Track.Application/Services/TrackNode/TrackNodeService.cs +++ b/src/SJZY.Track.Application/Services/TrackNode/TrackNodeService.cs @@ -86,15 +86,15 @@ namespace SJZY.Track.Application.Services.TrackNodeServices { #region 业务校验 var trackNodesEntitys = await _trackNodeRepository.GetListAsync(a => - a.SubSystemId == input.SystemId && (a.NodeName == input.Name || a.NodeEnName == input.EnName)); + a.SubSystemId == input.SubSystemId && (a.NodeName == input.NodeName || a.NodeEnName == input.NodeEnName)); if (trackNodesEntitys.Any()) { - var trackNodeName = trackNodesEntitys.FirstOrDefault(a => a.NodeName == input.Name); + var trackNodeName = trackNodesEntitys.FirstOrDefault(a => a.NodeName == input.NodeName); if (trackNodeName != null) { throw new BusinessException(message: "该子系统下节点名称已存在"); } - var trackNodeEnName = trackNodesEntitys.FirstOrDefault(a => a.NodeEnName == input.EnName); + var trackNodeEnName = trackNodesEntitys.FirstOrDefault(a => a.NodeEnName == input.NodeEnName); if (trackNodeEnName != null) { throw new BusinessException(message: "该子系统下节点英文名称已存在"); @@ -120,8 +120,8 @@ namespace SJZY.Track.Application.Services.TrackNodeServices #endregion - trackNodesEntitys.NodeEnName = input.EnName; - trackNodesEntitys.NodeName = input.Name; + trackNodesEntitys.NodeEnName = input.NodeEnName; + trackNodesEntitys.NodeName = input.NodeName; var isTrue = await _trackNodeRepository.UpdateAsync(trackNodesEntitys); return new UnifyResultDto("200", "修改成功", isTrue); @@ -129,7 +129,7 @@ namespace SJZY.Track.Application.Services.TrackNodeServices private async Task DeleteAsync(EditTrackNodeInput input) { - var trackStatus = await _trackStatusRepository.GetFirstAsync(val => val.Node == input.Id && val.SubSystemId == input.SystemId); + var trackStatus = await _trackStatusRepository.GetFirstAsync(val => val.Node == input.Id && val.SubSystemId == input.SubSystemId); if(trackStatus!=null) { return new UnifyResultDto("200", "删除失败,该节点已被使用", false); From 64acaffb5bbd1ea03a24759fd7daf733dcba87b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E5=96=9C=E6=97=BA?= Date: Sat, 27 Jul 2024 11:18:44 +0800 Subject: [PATCH 4/4] fix: add a validation --- .../Services/TrackNode/TrackNodeService.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application/Services/TrackNode/TrackNodeService.cs b/src/SJZY.Track.Application/Services/TrackNode/TrackNodeService.cs index c69ed6fd..851d3055 100644 --- a/src/SJZY.Track.Application/Services/TrackNode/TrackNodeService.cs +++ b/src/SJZY.Track.Application/Services/TrackNode/TrackNodeService.cs @@ -85,6 +85,11 @@ namespace SJZY.Track.Application.Services.TrackNodeServices private async Task AddAsync(EditTrackNodeInput input) { #region 业务校验 + if(string.IsNullOrEmpty(input.NodeName)|| string.IsNullOrEmpty(input.NodeEnName) || !input.SubSystemId.HasValue) + { + return new UnifyResultDto("200", "NodeName,NodeEnName,SubSystemId 必填", false); + } + var trackNodesEntitys = await _trackNodeRepository.GetListAsync(a => a.SubSystemId == input.SubSystemId && (a.NodeName == input.NodeName || a.NodeEnName == input.NodeEnName)); if (trackNodesEntitys.Any()) @@ -111,7 +116,11 @@ namespace SJZY.Track.Application.Services.TrackNodeServices private async Task UpdateAsync(EditTrackNodeInput input) { #region 业务校验 - + if(string.IsNullOrEmpty(input.NodeName)|| string.IsNullOrEmpty(input.NodeEnName) ) + { + return new UnifyResultDto("200", "NodeName,NodeEnName 必填", false); + } + var trackNodesEntitys = await _trackNodeRepository.GetFirstAsync(a => a.Id == input.Id); if (trackNodesEntitys == null) { @@ -129,6 +138,11 @@ namespace SJZY.Track.Application.Services.TrackNodeServices private async Task DeleteAsync(EditTrackNodeInput input) { + if(input.Id <=0 || !input.SubSystemId.HasValue) + { + return new UnifyResultDto("200", "SubSystemId 必填", false); + } + var trackStatus = await _trackStatusRepository.GetFirstAsync(val => val.Node == input.Id && val.SubSystemId == input.SubSystemId); if(trackStatus!=null) {