diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackTemplateListInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackTemplateListInput.cs new file mode 100644 index 00000000..d193eb8e --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackTemplateListInput.cs @@ -0,0 +1,24 @@ +namespace SJZY.Track.Application.Contract.Dtos.ProvideServices; + +public class GetPageTrackTemplateListInput : PageInfoInput +{ + /// + /// 子系统id + /// + public int SubSystemId { get; set; } + + /// + /// 客户id + /// + public int? CustomerId { get; set; } + + /// + /// 模版分类 + /// + public int? TemplateType { get; set; } + + /// + /// 模板code + /// + public string? TemplateCode { get; set; } +} diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackTemplateListInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackTemplateListInput.cs index 269a1a0e..e1c04282 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackTemplateListInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackTemplateListInput.cs @@ -16,4 +16,9 @@ public class GetTrackTemplateListInput /// 模版分类 /// public int? TemplateType { get; set; } + + /// + /// 模板code + /// + public string? TemplateCode { get; set; } } diff --git a/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs index f1a32d4d..0ec4b79a 100644 --- a/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs +++ b/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs @@ -21,11 +21,7 @@ public class OrderAutoMapperProfile : Profile CreateMap(MemberList.None); CreateMap(MemberList.None); - CreateMap(MemberList.None) - .ForMember(dest => dest.OrderTypeName, - opt => opt.MapFrom(source => GetEnumDescription(2, source.OrderType))) - .ForMember(dest => dest.QuestionTypeName, - opt => opt.MapFrom(source => GetEnumDescription(1, source.QuestionType))); + CreateMap(MemberList.None); CreateMap, UnifyPageResultDto>(MemberList.None); CreateMap(MemberList.None).Ignore(dest => dest.TrackTimeZone) diff --git a/src/SJZY.Track.Application/AutoMapper/TrackTemplateAutoMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/TrackTemplateAutoMapperProfile.cs index 850ff421..f6e6b53b 100644 --- a/src/SJZY.Track.Application/AutoMapper/TrackTemplateAutoMapperProfile.cs +++ b/src/SJZY.Track.Application/AutoMapper/TrackTemplateAutoMapperProfile.cs @@ -20,6 +20,8 @@ public class TrackTemplateAutoMapperProfile : Profile CreateMap(MemberList.None); CreateMap, UnifyPageResultDto>(MemberList .None); + CreateMap(MemberList.None); + CreateMap, UnifyPageResultDto>(MemberList.None); CreateMap(MemberList.None); CreateMap(MemberList.None); diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index 08e079d6..e9db1cfa 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -175,23 +175,27 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe { List orderIds; List tracks; + List deleteTracks; if (@event.EsIds != null && @event.EsIds.Any()) //根据明确的esid进行删除 { - tracks = await _trackDetailsEsRepository.GetDataByIds(@event.EsIds); - orderIds = tracks.Select(m => m.OrderId).Distinct().ToList(); + deleteTracks = await _trackDetailsEsRepository.GetDataByIds(@event.EsIds); + orderIds = deleteTracks.Select(m => m.OrderId).Distinct().ToList(); @event.OrderIds = orderIds.ToArray(); - @event.TrackIdentifiers = tracks.Select(x => new TrackIdentifierDto + @event.TrackIdentifiers = deleteTracks.Select(x => new TrackIdentifierDto { TrackCode = x.TrackCode, TrackTime = x.TrackTime }).ToList(); // 外部api获取的轨迹不允许删除 - if (tracks.Any(m => m.Source == TrackSourceEnum.ExternalServiceProvide.GetHashCode())) - return tracks; + if (deleteTracks.Any(m => m.Source == TrackSourceEnum.ExternalServiceProvide.GetHashCode())) + return deleteTracks; + + //查出订单下的所有轨迹,以供后面回退使用 + tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds); // 删除轨迹 - foreach (var item in tracks) + foreach (var item in deleteTracks) { await _trackDetailsEsRepository.DeleteTrackByIdAsync(item.Id, item.IndexName); } @@ -205,9 +209,9 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds); //构建标识符集合 - var ids = @event.TrackIdentifiers.Select(x => $"{x.TrackCode}{x.TrackTime}").ToList(); + var ids = @event.TrackIdentifiers.Select(x => $"{x.TrackCode}{x.TrackTime:G}").ToList(); //根据标识符选出要删除的轨迹明细 - var deleteTracks = tracks.Where(x => ids.Contains($"{x.TrackCode}{x.TrackTime}")).ToList(); + deleteTracks = tracks.Where(x => ids.Contains($"{x.TrackCode}{x.TrackTime:G}")).ToList(); if (deleteTracks.Count == 0) return deleteTracks; @@ -218,10 +222,10 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe //从被删除轨迹寻找订单id,稍后会更新订单主表 orderIds = deleteTracks.Select(m => m.OrderId).Distinct().ToList(); - //排除掉已经删除的轨迹 - tracks = tracks.Except(deleteTracks).ToList(); } + //排除掉已经删除的轨迹 + tracks = tracks.Except(deleteTracks).ToList(); var orders = await _orderRepository.GetListAsync(x => orderIds.Contains(x.Id), x => new OrderEntity @@ -232,13 +236,15 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe LatestTrackPlace = x.LatestTrackPlace, LatestTrackTime = x.LatestTrackTime, LatestTrackTimeZone = x.LatestTrackTimeZone, + EstimatedDeliveryDate = x.EstimatedDeliveryDate, + DestinationTimeZone = x.DestinationTimeZone }); if (orders.Count == 0) return tracks; foreach (var order in orders) { //找到最新的轨迹数据 - var track = tracks?.OrderByDescending(x=>x.TrackTime) + var track = tracks?.OrderByDescending(x => x.TrackTime) .FirstOrDefault(x => x.OrderId == order.Id); // 删除全部轨迹导致的重置行为 @@ -258,6 +264,8 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe order.LatestTrackPlace = track.TrackPlace; order.LatestTrackTime = track.TrackTime; order.LatestTrackTimeZone = track.TrackTimeZone; + order.EstimatedDeliveryDate = track.EstimatedDeliveryDate; + order.DestinationTimeZone = track.DestinationTimeZone; } @@ -267,7 +275,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe OrderId = order.Id, OrderNo = order.OrderNo, OptionType = OrderOperationType.删除轨迹.ToString(), - Content = tracks?.Where(m => m.OrderId == order.Id).ToList().ToJson(), + Content = deleteTracks?.Where(m => m.OrderId == order.Id).ToList().ToJson(), CreateUserId = @event.OperationManId, CreateUserName = @event.OperationMan ?? "", CreateTime = DateTime.Now @@ -281,9 +289,11 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe x.LatestTrackEnContent, x.LatestTrackPlace, x.LatestTrackTime, - x.LatestTrackTimeZone + x.LatestTrackTimeZone, + x.EstimatedDeliveryDate, + x.DestinationTimeZone }); - return tracks; + return deleteTracks; } } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index c26118a3..d2c39cd4 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -241,7 +241,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackContent = trackContent.TrackContent, TrackEnContent = trackContent.TrackEnContent, TrackPlace = @event.TrackPlace, - TrackTime = @event.TrackTime, + TrackTime = @event.NewTrackTime ?? @event.TrackTime, TrackTimeZone = @event.TrackTimeZone, DestinationTimeZone = @event.DestinationTimeZone, EstimatedDeliveryDate = @event.EstimatedDeliveryDate @@ -261,7 +261,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackStatus = trackContent.TrackStatus, TrackContent = trackContent.TrackContent, TrackPlace = @event.TrackPlace, - TrackTime = @event.TrackTime, + TrackTime = @event.NewTrackTime ?? @event.TrackTime, TrackTimeZone = @event.TrackTimeZone } }; diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index b1afaa30..4e90f379 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -62,7 +62,7 @@ public partial class TrackService : ApplicationService, ITrackService //要求时间在当前时间的前后100年之间内 bool ValidateTrackTime(DateTime? d) => (d != null && d < DateTime.Now.AddYears(-100) || d > DateTime.Now.AddYears(100)); - if (ValidateTrackTime(input.TrackTime) || ValidateTrackTime(input.NewTrackTime)) + if (ValidateTrackTime(input.TrackTime) || ValidateTrackTime(input.NewTrackTime) || ValidateTrackTime(input.EstimatedDeliveryDate)) { throw new BusinessException(message: "轨迹时间不合法"); } @@ -330,7 +330,7 @@ public partial class TrackService : ApplicationService, ITrackService //要求时间在当前时间的前后100年之间内 bool ValidateTrackTime(DateTime? d) => (d != null && d < DateTime.Now.AddYears(-100) || d > DateTime.Now.AddYears(100)); - if (ValidateTrackTime(input.TrackTime) || ValidateTrackTime(input.NewTrackTime)) + if (ValidateTrackTime(input.TrackTime) || ValidateTrackTime(input.NewTrackTime) || ValidateTrackTime(input.EstimatedDeliveryDate)) { throw new BusinessException(message: "轨迹时间不合法"); } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackTemplateService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackTemplateService.cs index 838f0397..ae02e06e 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackTemplateService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackTemplateService.cs @@ -33,4 +33,18 @@ public class TrackTemplateService : ApplicationService, ITrackTemplateService var res = ObjectMapper.Map, List>(templates); return res; } + + /// + /// 分页获取轨迹模版列表 + /// + /// + /// + [HttpPost("Template/GetTrackTemplateListByPage")] + public async Task> GetTrackTemplateListByPageAsync(GetPageTrackTemplateListInput input) + { + var inputVo = ObjectMapper.Map(input); + var templates = await _trackTemplateRepository.GetPageTrackTemplateListAsync(inputVo); + var res = ObjectMapper.Map, UnifyPageResultDto>(templates); + return res; + } } diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index 3f3aa542..53bfc8c3 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -127,13 +127,13 @@ public class TrackOrderService : ApplicationService if (whereExpression == default) throw new BusinessException(message: "请求参数异常"); - var subSystemId = await _orderRepository.GetFirstAsync(whereExpression, x => x.SubSystemId); - if (subSystemId == default) + var order = await _orderRepository.GetFirstAsync(whereExpression); + if (order == default) { throw new BusinessException(message: "订单不存在"); } - var trackDetails = await _trackDetailsEsRepository.GetListAsync(orderId ?? 0); + var trackDetails = await _trackDetailsEsRepository.GetListAsync(order.Id); if (trackDetails.IsNullOrEmpty()) { return new List(); @@ -150,7 +150,7 @@ public class TrackOrderService : ApplicationService if (!trackCodes.IsNullOrEmpty()) { var trackContents = await _trackContentRepository.GetListAsync(x => - x.SubSystemId == subSystemId && trackCodes.Contains(x.Code), x => new + x.SubSystemId == order.SubSystemId && trackCodes.Contains(x.Code), x => new { x.Code, x.IsExternal diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs index 762c1324..eaf3ca71 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs @@ -201,5 +201,7 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot LatestTrackTime = null; LatestTrackPlace = null; LatestTrackTimeZone = null; + EstimatedDeliveryDate = null; + DestinationTimeZone = null; } } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs index db202083..efae67b2 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs @@ -45,5 +45,6 @@ public interface ITrackTemplateRepository : IBasicRepository> whereExpression); Task> GetTrackTemplateListAsync(GetTrackTemplateListInputVo input); + Task> GetPageTrackTemplateListAsync(GetPageTrackTemplateListInputVo input); Task> GetContentByTemplateCodes(string[] codes, int systemId); } diff --git a/src/SJZY.Track.Domain/Consts/GlobalConst.cs b/src/SJZY.Track.Domain/Consts/GlobalConst.cs index d8064f12..c6416b1d 100644 --- a/src/SJZY.Track.Domain/Consts/GlobalConst.cs +++ b/src/SJZY.Track.Domain/Consts/GlobalConst.cs @@ -2,6 +2,8 @@ namespace SJZY.Track.Domain.Consts; public partial class GlobalConst { + public const string MainDataKey_OrderType = "TrackOrderType"; + public const string MainDataKey_TrackQuestionType = "TrackQuestionType"; public const string SystemUser = "系统"; public const string EmptyString = "--"; public const int ChunkSize = 100; diff --git a/src/SJZY.Track.Domain/Dtos/TrackTemplate/GetPageTrackTemplateListInputVo.cs b/src/SJZY.Track.Domain/Dtos/TrackTemplate/GetPageTrackTemplateListInputVo.cs new file mode 100644 index 00000000..b6e253a0 --- /dev/null +++ b/src/SJZY.Track.Domain/Dtos/TrackTemplate/GetPageTrackTemplateListInputVo.cs @@ -0,0 +1,24 @@ +namespace SJZY.Track.Domain.Dtos.TrackTemplate; + +public class GetPageTrackTemplateListInputVo :PageInfoInput +{ + /// + /// 子系统id + /// + public int SubSystemId { get; set; } + + /// + /// 客户id + /// + public int? CustomerId { get; set; } + + /// + /// 模版分类 + /// + public int? TemplateType { get; set; } + + /// + /// 模板code + /// + public string? TemplateCode { get; set; } +} diff --git a/src/SJZY.Track.Domain/Dtos/TrackTemplate/GetTrackTemplateListInputVo.cs b/src/SJZY.Track.Domain/Dtos/TrackTemplate/GetTrackTemplateListInputVo.cs index 7e0abd82..a2f111a7 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackTemplate/GetTrackTemplateListInputVo.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackTemplate/GetTrackTemplateListInputVo.cs @@ -16,4 +16,9 @@ public class GetTrackTemplateListInputVo /// 模版分类 /// public int? TemplateType { get; set; } + + /// + /// 模板code + /// + public string? TemplateCode { get; set; } } diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index ec5f18fe..413097c8 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -1,3 +1,4 @@ +using NUglify.Helpers; using SJZY.Expand.ABP.Core.Logger; using SJZY.Track.Domain; using SJZY.Track.Domain.Aggregates.OrderAggregate; @@ -55,6 +56,45 @@ public class OrderRepository : BasicRepository, IOrderRepository, I }) .ToPagedListAsync(input.PageIndex, input.PageSize); + //查询订单类型描述 + var orderTypes = pageList.List.Select(x => x.OrderType).Distinct().ToList(); + var questTypes = pageList.List.Select(x => x.QuestionType).Distinct().ToList(); + //从主数据中心查询类型描述 + var typeDispDict = (await Context.Queryable() + .Where(x => + (x.Property == GlobalConst.MainDataKey_OrderType && orderTypes.Contains(x.Enumkey)) + || (x.Property == GlobalConst.MainDataKey_TrackQuestionType && questTypes.Contains(x.Enumkey)) + ) + .Select(x => new + { + x.Property, + x.Enumkey, + x.Disp + }) + .ToListAsync() + ) + .GroupBy(x => x.Property) + .ToDictionary( + g => g.Key, + y => y.ToDictionary(x => x.Enumkey, x => x.Disp) + ); + + //填充数描述信息 + pageList.List.ForEach(x => + { + x.OrderTypeName = typeDispDict.TryGetValue(GlobalConst.MainDataKey_OrderType, out var orderTypeDisplayDict) + ? orderTypeDisplayDict.TryGetValue(x.OrderType, out var orderTypeDisplay) + ? orderTypeDisplay + : $"未在主数据中心找到Property:[{GlobalConst.MainDataKey_OrderType}] Enumkey:[{x.OrderType}]" + : $"未在主数据中心找到Property:[{GlobalConst.MainDataKey_OrderType}]"; + + x.QuestionTypeName = typeDispDict.TryGetValue(GlobalConst.MainDataKey_TrackQuestionType, out var questDisplayDict) + ? questDisplayDict.TryGetValue(x.QuestionType, out var questDisplay) + ? questDisplay + : $"未在主数据中心找到Property:[{GlobalConst.MainDataKey_OrderType}] Enumkey:[{x.OrderType}]" + : $"未在主数据中心找到Property:[{GlobalConst.MainDataKey_TrackQuestionType}]"; + }); + return pageList; } diff --git a/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs index 9f28d8fc..c7f7c2c4 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs @@ -191,6 +191,7 @@ public class TrackTemplateRepository : BasicRepository, ITr .Where(x => x.SubSystemId == input.SubSystemId) .WhereIF(input.CustomerId.HasValue, x => x.CustomerId == input.CustomerId) .WhereIF(input.TemplateType.HasValue, x => x.CategoryId == input.TemplateType) + .WhereIF(!input.TemplateCode.IsNullOrWhiteSpace(), x => x.Code == input.TemplateCode) .Select(x => new TrackTemplateOutputVo { Id = x.Id, @@ -227,9 +228,44 @@ public class TrackTemplateRepository : BasicRepository, ITr return templates; } + public async Task> GetPageTrackTemplateListAsync(GetPageTrackTemplateListInputVo input) + { + var templates = await Context.Queryable() + .Where(x => x.SubSystemId == input.SubSystemId) + .WhereIF(input.CustomerId.HasValue, x => x.CustomerId == input.CustomerId) + .WhereIF(input.TemplateType.HasValue, x => x.CategoryId == input.TemplateType) + .WhereIF(!input.TemplateCode.IsNullOrWhiteSpace(), x => x.Code == input.TemplateCode) + .Select(x => new TrackTemplateOutputVo + { + Id = x.Id, + TemplateName = x.Name, + TemplateCode = x.Code, + }) + .ToListAsync(); + + if (templates == default) return new UnifyPageResultDto(); + var templateIds = templates.Select(x => x.Id).ToArray(); + var contents = await Context.Queryable() + .LeftJoin((a, b) => a.TrackContentId == b.Id) + .LeftJoin((a, b, c) => b.TrackStatusId == c.Id) + .LeftJoin((a, b, c, d) => c.Node == d.Id) + .Where(a => templateIds.Contains(a.TrackTemplateId)) + .Select((a, b, c, d) => new TemplateContentDtoVo + { + TemplateId = a.TrackTemplateId, + Code = b.Code, + ContentCn = b.Content, + ContentEn = b.EnContent, + Status = c.Status, + Node = d.NodeName + }) + .ToPagedListAsync(input.PageIndex, input.PageSize); + + return contents; + } + public async Task> GetContentByTemplateCodes(string[] codes, int systemId) { - var sql = @$" select distinct @@ -244,7 +280,10 @@ public class TrackTemplateRepository : BasicRepository, ITr "; - var list = Context.Ado.SqlQuery(sql, new {codes = codes}).ToList(); + var list = Context.Ado.SqlQuery(sql, new + { + codes = codes + }).ToList(); return list; }