From 74190018450b9c58fd469240fbd79e64e330fdf7 Mon Sep 17 00:00:00 2001 From: eli Date: Sat, 23 Nov 2024 17:15:45 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/ProvideServices/UpsertOrderInput.cs | 10 + .../Dtos/ProvideServices/UpsertTrackInput.cs | 5 + .../TrackContents/GetContentDetailInput.cs | 29 +++ .../TrackContents/GetContentDetailOutput.cs | 192 ++++++++++++++++++ .../TrackContentAutoMapperProfile.cs | 5 + .../Services/ProvideServices/OrderService.cs | 3 +- .../Services/ProvideServices/TrackService.cs | 2 +- .../TrackContents/TrackContentService.cs | 65 +++++- .../Aggregates/OrderAggregate/OrderEntity.cs | 6 + .../ITrackDetailsEsRepository.cs | 1 + .../ITrackTemplateRepository.cs | 1 + .../Repositories/TrackDetailsEsRepository.cs | 35 ++++ .../Repositories/TrackTemplateRepository.cs | 23 +++ 13 files changed, 371 insertions(+), 6 deletions(-) create mode 100644 src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailInput.cs create mode 100644 src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailOutput.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertOrderInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertOrderInput.cs index 4bd7b0b7..cfdbe0ac 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertOrderInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertOrderInput.cs @@ -10,6 +10,16 @@ public class UpsertOrderInput : UpdateOrderInput [Required] [Range(1, int.MaxValue)] public int CustomId { get; set; } + + /// + /// 模板code + /// + public List TemplateCodes { get; set; } + + /// + /// 当前操作人 + /// + public int OptionUserId { get; set; } } public class OrderFlightInfo diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs index b4cf72ae..2ba86e87 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs @@ -118,4 +118,9 @@ public class UpsertTrackInput : OrderNoInfo /// [Range(-12, 12)] public float? DestinationTimeZone { get; set; } + + /// + /// 当前操作人 + /// + public int OptionUserId { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailInput.cs new file mode 100644 index 00000000..d61d19bb --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailInput.cs @@ -0,0 +1,29 @@ +namespace SJZY.Track.Application.Contract.Dtos.TrackContents; + +public class GetContentDetailInput +{ + /// + /// 子系统编号 + /// + public int SystemId { get; set; } + + /// + /// 订单号 + /// + public string OrderNumber { get; set; } + + /// + /// 订单类型 + /// + public int OrderType { get; set; } + + /// + /// 轨迹code + /// + public string TrackCode { get; set; } + + /// + /// 轨迹发生时间 + /// + public DateTime TrackTime { get; set; } +} diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailOutput.cs new file mode 100644 index 00000000..ea58971c --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailOutput.cs @@ -0,0 +1,192 @@ +namespace SJZY.Track.Application.Contract.Dtos.TrackContents; + +public class GetContentDetailOutput +{ + /// + /// 子系统 + /// + public int SubSystemId { get; set; } + + /// + /// 订单Id + /// + public int OrderId { get; set; } + + /// + /// 订单号 + /// + public string OrderNo { get; set; } = null!; + + /// + /// 索引名称 + /// + public string IndexName { get; set; } = null!; + + /// + /// 订单类型(主数据枚举TrackOrderType) + /// + public int OrderType { get; set; } + + /// + /// 轨迹状态 + /// + public string TrackStatus { get; set; } + + /// + /// 轨迹状态code + /// + public string TrackStatusCode { get; set; } + + /// + /// 轨迹内容代码 + /// + public string TrackCode { get; set; } + + /// + /// 轨迹内容 + /// + public string TrackContent { get; set; } + + /// + /// 轨迹内容英文 + /// + public string TrackEnContent { get; set; } + + /// + /// 服务商code + /// + public string ServiceProviderCode { get; set; } + + /// + /// 原轨迹内容 + /// + public string? OriginTrackContent { get; set; } + + /// + /// 原轨迹报文hash(刷新轨迹重复性校验使用) + /// + public string OriginTrackDataHash { get; set; } = null!; + + /// + /// 轨迹发生地 + /// + public string TrackPlace { get; set; } + + /// + /// 轨迹发生时间 + /// + public DateTime TrackTime { get; set; } + + /// + /// 轨迹发生时区 + /// + public float TrackTimeZone { get; set; } + + /// + /// 转化后的轨迹发生时间 + /// + public DateTime ZeroTrackTime { get; set; } + + /// + /// 创建人 + /// + public string CreateUser { get; set; } + + /// + /// 创建时间 + /// + public DateTime CreateTime { get; set; } + + /// + /// 修改人 + /// + public string UpdateUser { get; set; } + + /// + /// 修改时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 客户是否可见 + /// + public bool IsVisibility { get; set; } + + /// + /// 数据来源:1外部服务商创建,2内部系统创建,3人工创建 + /// + public int Source { get; set; } + + /// + /// 备注 + /// + public string? Remarks { get; set; } + + /// + /// 附件集合 + /// + public List? Files { get; set; } + + /// + /// 轨迹发生地(城市) + /// + public string? TrackPlaceCity { get; set; } + + /// + /// 轨迹发生地(城市)Id + /// + public int? TrackPlaceCityId { get; set; } + + /// + /// 轨迹发生地(省/州) + /// + public string? TrackPlaceProvince { get; set; } + + /// + ///轨迹发生地(省/州)Id + /// + public int? TrackPlaceProvinceId { get; set; } + + /// + /// 轨迹发生地(国家/地区) + /// + public string? TrackPlaceNation { get; set; } + + /// + /// 轨迹发生地(国家/地区)Id + /// + public int? TrackPlaceNationId { get; set; } + + /// + /// 轨迹发生地邮编 + /// + public string? TrackPlacePostcode { get; set; } + + /// + /// 预计签收时间 + /// + public DateTime? EstimatedDeliveryDate { get; set; } + + /// + /// 签收地时区 + /// + public float? DestinationTimeZone { get; set; } +} + +public class FileItem +{ + /// + /// 文件osskey + /// + public string OssKey { get; set; } + + /// + /// 文件名称 + /// + public string FileName { get; set; } + + /// + /// 路径 + /// + public string Url { get; set; } +} diff --git a/src/SJZY.Track.Application/AutoMapper/TrackContentAutoMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/TrackContentAutoMapperProfile.cs index 862447be..a161314e 100644 --- a/src/SJZY.Track.Application/AutoMapper/TrackContentAutoMapperProfile.cs +++ b/src/SJZY.Track.Application/AutoMapper/TrackContentAutoMapperProfile.cs @@ -1,6 +1,7 @@ using AutoMapper; using SJZY.Track.Application.Contract.Dtos.TrackContents; using SJZY.Track.Domain.Aggregates.TrackContentAggregate; +using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Dtos.TrackContents; namespace SJZY.Track.Application.AutoMapper; @@ -16,5 +17,9 @@ public class TrackContentAutoMapperProfile : Profile CreateMap, UnifyPageResultDto>( MemberList.None); CreateMap(MemberList.None); + + CreateMap(MemberList.None).ReverseMap(); + CreateMap< SJZY.Track.Domain.Aggregates.TrackDetailsAggregate.FileItem, SJZY.Track.Application.Contract.Dtos.TrackContents.FileItem>(MemberList.None).ReverseMap(); + } } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs index dea72486..c41d28c2 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs @@ -57,7 +57,7 @@ public partial class OrderService : ApplicationService, IOrderService { OrderId = order.Id, OrderNo = input.OrderNo, - OptionType = OrderOperationType.修改订单.ToString(), + OptionType = OrderOperationType.修改订单.ToString(), Content = input.ToJson(), CreateUserId = currentUser.UserId, CreateUserName = currentUser.Name, @@ -76,6 +76,7 @@ public partial class OrderService : ApplicationService, IOrderService order.OrderFlights = ObjectMapper.Map, List>(input.FlightInfos); order.OrderPullStatus = BuiltOrderPullStatus(input.PullConfigInfos); order.OrderPlatformNumbers = BuiltOrderPlatformNumbers(input.PullConfigInfos); + order.TemplateCodes = string.Join(',', input.TemplateCodes); var orderId = await _orderRepository.CreateOrderAsync(order); diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index cec5feae..ab931373 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -108,7 +108,7 @@ public partial class TrackService : ApplicationService, ITrackService throw new BusinessException(message: $"订单:{input.OrderNo},轨迹代码:{input.TrackCode}存在多条记录,不允许修改"); } - var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(); + var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(input.OptionUserId); if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) { //TODO: log || ex diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index c7c69e68..996b2f57 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -2,6 +2,7 @@ using System.Linq.Expressions; using Microsoft.Extensions.Localization; using SJZY.Expand.ABP.Core.Localization; using SJZY.Expand.ABP.Core.PublicMethords; +using SJZY.Expand.AliyunOSS; using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Dtos.TrackContents; using SJZY.Track.Application.Localization; @@ -10,7 +11,9 @@ using SJZY.Track.Domain.Aggregates.TrackContentAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackFlagAggregate; using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; +using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Dtos.TrackContents; +using SJZY.Track.Domain.Dtos.TrackTemplate; using SJZY.Track.Domain.Queries; namespace SJZY.Track.Application.Services.TrackContents; @@ -24,6 +27,7 @@ public class TrackContentService : ApplicationService { private readonly IStringLocalizer _stringLocalizer; private readonly ITrackContentRepository _trackContentRepository; + private readonly ITrackTemplateRepository _trackTemplateRepository; private readonly IBasicQuery _trackFlagBasicQuery; private readonly IBasicQuery _trackStatusBasicQuery; private readonly IOrderRepository _orderRepository; @@ -35,7 +39,8 @@ public class TrackContentService : ApplicationService IBasicQuery trackStatusBasicQuery, IBasicQuery trackFlagBasicQuery, IOrderRepository orderRepository, - ITrackDetailsEsRepository trackDetailsEsRepository) + ITrackDetailsEsRepository trackDetailsEsRepository, + ITrackTemplateRepository trackTemplateRepository) { _stringLocalizer = stringLocalizer; _trackContentRepository = trackContentRepository; @@ -43,6 +48,7 @@ public class TrackContentService : ApplicationService _trackFlagBasicQuery = trackFlagBasicQuery; _orderRepository = orderRepository; _trackDetailsEsRepository = trackDetailsEsRepository; + _trackTemplateRepository = trackTemplateRepository; } /// @@ -220,6 +226,50 @@ public class TrackContentService : ApplicationService return res; } + /// + /// 根据子系统id、单号、订单类型、轨迹发生时间、轨迹code获取轨迹内容 + /// + /// + /// + [HttpPost("GetContentDetail")] + public async Task> GetContentDetail([FromBody] GetContentDetailInput input) + { + if (input.SystemId <= 0) + return new UnifyResultDto(false, "子系统Id必须大于等于0"); + + if (string.IsNullOrEmpty(input.TrackCode)) + return new UnifyResultDto(false, "轨迹内容code不能为空"); + + if (string.IsNullOrEmpty(input.OrderNumber)) + return new UnifyResultDto(false, "订单code不能为空"); + + if (input.OrderType <= 0) + return new UnifyResultDto(false, "订单类型不能为空"); + + if (input.TrackTime == default) + return new UnifyResultDto(false, "轨迹发生时间不能为空"); + + var content = await _trackDetailsEsRepository.GetDetailAsync(input.OrderNumber, input.TrackCode, input.OrderType, input.SystemId, input.TrackTime); + if (content == default) + return new UnifyResultDto(false, "在当前子系统中未找到指定code的轨迹内容"); + + var res = new UnifyResultDto(true) + { + Data = ObjectMapper.Map(content) + }; + + + if (res.Data != default && res.Data.Files.Any()) + { + foreach (var item in res.Data.Files) + { + item.Url = OSSHelper.GetUrlByKey(item.OssKey); + } + } + + return res; + } + /// /// 创建轨迹时获取可用的轨迹内容 /// @@ -235,18 +285,25 @@ public class TrackContentService : ApplicationService return new UnifyResultDto>(false, "单号不能为空!"); //获取当前订单下已有的轨迹内容 - var orderId = await _orderRepository.GetFirstAsync(x => x.OrderNo == input.OrderNo && x.SubSystemId == input.SystemId, x => x.Id); - if (orderId == default) + var order = await _orderRepository.GetFirstAsync(x => x.OrderNo == input.OrderNo && x.SubSystemId == input.SystemId); + if (order == default) throw new BusinessException(message: "订单不存在!"); //获取轨迹详情 - var trackDetails = await _trackDetailsEsRepository.GetListAsync(orderId); + var trackDetails = await _trackDetailsEsRepository.GetListAsync(order.Id); //获取当前子系统下所有的轨迹内容 var contentList = await _trackContentRepository.GetListBySystemIdAsync(input.SystemId); if (contentList == null) throw new BusinessException(message: "当前子系统下未找到任何可用的轨迹内容!"); + //如果订单给了获取模板code,则进一步根据模板code进行过滤 + if (!string.IsNullOrEmpty(order.TemplateCodes)) + { + var currentCodes = order.TemplateCodes.Split(","); + var template = await _trackTemplateRepository.GetContentByTemplateCodes(currentCodes, input.SystemId); + contentList = contentList.Where(m => template.Contains(m.Code)).ToList(); + } var res = new UnifyResultDto>(true) { diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs index b2e3a5ba..762c1324 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs @@ -180,6 +180,12 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot [SugarColumn(ColumnName = "DestinationTimeZone")] public float? DestinationTimeZone { get; set; } + /// + /// 模板code + /// + [SugarColumn(ColumnName = "TemplateCodes")] + public string? TemplateCodes { get; set; } + [SugarColumn(IsIgnore = true)] public List OrderFlights { get; set; } [SugarColumn(IsIgnore = true)] public List OrderPullStatus { get; set; } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs index a8da5185..482d7142 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs @@ -29,4 +29,5 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService> GetDataByIds(string[] ids); + Task GetDetailAsync(string orderNo, string trackCode, int orderType, int subSystemId, DateTime trackTime); } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs index 8a104c3c..db202083 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs @@ -45,4 +45,5 @@ public interface ITrackTemplateRepository : IBasicRepository> whereExpression); Task> GetTrackTemplateListAsync(GetTrackTemplateListInputVo input); + Task> GetContentByTemplateCodes(string[] codes, int systemId); } diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index 0fee4fc6..cb62b1b1 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -440,4 +440,39 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract GetDetailAsync(string orderNo, string trackCode, int orderType, int subSystemId, DateTime trackTime) + { + var res = await Context.SearchAsync(s => s + .Index("sjzy_track_details") + .Query(q => q + .Bool(b => b + .Must(mu => mu + .Terms(t => t + .Field(f => f.OrderNo.Suffix("keyword")) + .Terms(orderNo)), + mu => mu + .Terms(t => t + .Field(f => f.TrackCode.Suffix("keyword")) + .Terms(trackCode)), + mu => mu + .Terms(t => t + .Field(f => f.OrderType) + .Terms(orderType)), + mu => mu + .Terms(t => t + .Field(f => f.SubSystemId) + .Terms(subSystemId)), + mu => mu + .Terms(t => t + .Field(f => f.TrackTime) + .Terms(trackTime)) // 注意:这里你重复了OrderType的查询,你可能需要移除重复的查询 + ) + ) + ) + ); + + return res.Documents.FirstOrDefault(); + } + } diff --git a/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs index be08e964..9f28d8fc 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs @@ -8,6 +8,7 @@ using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Dtos.TrackTemplate; using SJZY.Track.Domain.Enums; using SJZY.Track.Domain.VEntities; +using SJZY.Expand.ABP.Core.SqlSugar.Tools; namespace SJZY.Track.Repository.Repositories; @@ -225,4 +226,26 @@ public class TrackTemplateRepository : BasicRepository, ITr return templates; } + + public async Task> GetContentByTemplateCodes(string[] codes, int systemId) + { + + var sql = @$" + select + distinct + c.Code + from t_track_template a + left join t_track_template_content b on a.id = b.TrackTemplateId and b.IsDeleted = 0 + left join t_track_content c on b.TrackContentId = c.Id and c.IsDeleted = 0 + where + a.SubSystemId = {systemId} + and a.Code in (@codes) + and a.IsDeleted = 0 + "; + + + var list = Context.Ado.SqlQuery(sql, new {codes = codes}).ToList(); + + return list; + } } From c98e1e7d8a2303fa8d1cad82680f89e5264e82e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Mon, 25 Nov 2024 16:16:42 +0800 Subject: [PATCH 2/3] =?UTF-8?q?update:=20=E3=80=90GetAvailableContent?= =?UTF-8?q?=E3=80=91=E6=8E=A5=E5=8F=A3=E5=8F=8D=E5=8F=82=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E3=80=90=E9=99=84=E4=BB=B6=E6=96=87=E4=BB=B6=E3=80=91=E5=92=8C?= =?UTF-8?q?=E3=80=90=E7=94=A8=E6=88=B7=E6=98=AF=E5=90=A6=E5=8F=AF=E8=A7=81?= =?UTF-8?q?=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackContents/GetAvailableContentOutput.cs | 12 ++++++++++++ .../Services/TrackContents/TrackContentService.cs | 6 ++++++ 2 files changed, 18 insertions(+) diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs index 1102eed6..7af80b7c 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs @@ -1,3 +1,5 @@ +using SJZY.Track.Application.Contract.Dtos.ProvideServices; + namespace SJZY.Track.Application.Contract.Dtos.TrackContents; public class GetAvailableContentOutput @@ -89,4 +91,14 @@ public class GetAvailableContentOutput /// 目的地时区 /// public float? DestinationTimeZone { get; set; } + + /// + /// 附件文件集合 + /// + public List? FileItems { get; set; } + + /// + /// 客户是否可见 + /// + public bool IsVisibility { get; set; } } diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs index 996b2f57..c5e23f8d 100644 --- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs +++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs @@ -380,6 +380,12 @@ public class TrackContentService : ApplicationService TrackPlaceCityId = matchItem.TrackPlaceCityId, Remarks = matchItem.Remarks, TrackTimeZoneValue = matchItem.DestinationTimeZone, + IsVisibility = matchItem.IsVisibility, + FileItems = matchItem.Files?.Select(x => new FileItemDto + { + FileName = x.FileName, + OssKey = x.OssKey + }).ToList() }); matchContent.AddRange(match); } From ea77583ce41e13c28929b9b5e6b8e5f4110ddb90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=BE=99=20=E7=8E=8B?= Date: Mon, 25 Nov 2024 18:16:42 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProvideServices/BatchDeleteTrackInput.cs | 4 +- .../Dtos/ProvideServices/DeleteOrderInput.cs | 4 +- .../ProvideServices/TrackIdentifierDto.cs | 21 +++++++++ .../Events/TrackDeleteEvent.cs | 8 ++-- .../EventHandlers/TrackDeleteEventHandler.cs | 43 +++++++++++++++---- .../Services/ProvideServices/TrackService.cs | 24 ++++++++--- .../ITrackDetailsEsRepository.cs | 3 +- .../Dtos/TrackContents/TrackCodeMapVO.cs | 27 ++++++++++++ .../Queries/IProvideQueries.cs | 8 ++++ .../Queries/ProvideQueries.cs | 20 ++++++++- .../Repositories/TrackDetailsEsRepository.cs | 38 +++++++++++++--- 11 files changed, 168 insertions(+), 32 deletions(-) create mode 100644 src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackIdentifierDto.cs create mode 100644 src/SJZY.Track.Domain/Dtos/TrackContents/TrackCodeMapVO.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackInput.cs index 07db4f25..45ccc51c 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackInput.cs @@ -5,9 +5,9 @@ namespace SJZY.Track.Application.Contract.Dtos.ProvideServices; public class BatchDeleteTrackInput : OrderNosInfo { /// - /// 轨迹code,必填 + /// 轨迹标识符集合,必填 /// [Required] [MaxLength(500)] - public List TrackCodes { get; set; } = new(); + public List TrackIdentifiers { get; set; } = new(); } diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs index c70c9b42..de305c57 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs @@ -9,8 +9,8 @@ public class DeleteOrderInput : OrderNoInfo public class DeleteTrackInput : OrderNoInfo { /// - /// 轨迹code + /// 轨迹标识符集合,必填 /// [Required] - public List TrackCodes { get; set; } = new(); + public List TrackIdentifiers { get; set; } = new(); } diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackIdentifierDto.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackIdentifierDto.cs new file mode 100644 index 00000000..993de61c --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackIdentifierDto.cs @@ -0,0 +1,21 @@ +using System.ComponentModel.DataAnnotations; + +namespace SJZY.Track.Application.Contract.Dtos.ProvideServices; + +/// +/// 轨迹标识符,用于唯一标识一个轨迹 +/// +public sealed class TrackIdentifierDto +{ + /// + /// 轨迹code + /// + [Required] + public string TrackCode { get; set; } + + /// + /// 轨迹发生时间 + /// + [Required] + public DateTime TrackTime { get; set; } +} diff --git a/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs index e8072e27..0859de6b 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs @@ -1,3 +1,5 @@ +using SJZY.Track.Application.Contract.Dtos.ProvideServices; + namespace SJZY.Track.Application.Contract.Events; public class TrackDeleteEvent @@ -18,9 +20,9 @@ public class TrackDeleteEvent public int[] OrderIds { get; set; } = null!; /// - /// 轨迹代码 + /// 轨迹标识符 /// - public List TrackCodes { get; set; } = null!; + public List TrackIdentifiers { get; set; } = null!; /// /// 操作人 @@ -40,6 +42,6 @@ public class TrackDeleteEvent public override string ToString() { return $"[TrackDelete by {OperationMan}] SubSystemId: {SubSystemId}, OrderIds: {string.Join(",", - OrderIds)}, TrackCodes: {string.Join(",", TrackCodes)}"; + OrderIds)}, TrackCodes: {string.Join(",", TrackIdentifiers.Select(x=>x.TrackCode))}"; } } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index 288face2..dd4704ca 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -3,6 +3,7 @@ using BSI.Stack.Rabbit; using DotNetCore.CAP; using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.PublicMethords; +using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Events; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackContentAggregate; @@ -67,22 +68,29 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe { var nextEvent = @event.DeepCopy(); nextEvent.Visited.AddRange(@event.OrderIds); - nextEvent.TrackCodes = @event.TrackCodes; + nextEvent.TrackIdentifiers = @event.TrackIdentifiers; nextEvent.SubSystemId = group.Key; // 不同子系统需要做内容映射 if (@event.SubSystemId != nextEvent.SubSystemId) { - var mapCodes = await _provideQueries - .MapTrackCodesAsync(@event.SubSystemId, nextEvent.SubSystemId, @event.TrackCodes.ToArray()); + var codeMaps = await _provideQueries + .GetTrackCodeMapsAsync(@event.SubSystemId, nextEvent.SubSystemId, + @event.TrackIdentifiers.Select(x => x.TrackCode).ToArray()); - if (mapCodes.Count == 0) + if (codeMaps.Count == 0) { LogHelper.Warn($"订单跨子系统,未配置内容映射,请联系管理员:{@event}", true); continue; } - nextEvent.TrackCodes = mapCodes; + //映射轨迹code + foreach (var trackIdentity in nextEvent.TrackIdentifiers) + { + var match = codeMaps.FirstOrDefault(x => x.MapTrackContentCode == trackIdentity.TrackCode); + if (match == null) continue; + trackIdentity.TrackCode = match.TrackContentCode; + } } var identifiers = group.Select(x => x.OrderId).ToList(); @@ -172,7 +180,11 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe tracks = await _trackDetailsEsRepository.GetDataByIds(@event.EsIds); orderIds = tracks.Select(m => m.OrderId).Distinct().ToList(); @event.OrderIds = orderIds.ToArray(); - @event.TrackCodes = tracks.Select(x => x.TrackCode).Distinct().ToList(); + @event.TrackIdentifiers = tracks.Select(x => new TrackIdentifierDto + { + TrackCode = x.TrackCode, + TrackTime = x.TrackTime + }).ToList(); // 外部api获取的轨迹不允许删除 if (tracks.Any(m => m.Source == TrackSourceEnum.ExternalServiceProvide.GetHashCode())) @@ -189,11 +201,24 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe } else //原有逻辑,根据轨迹code和订单进行删除 { + var trackCodes = @event.TrackIdentifiers.Select(x => x.TrackCode).ToList(); // 删除轨迹(删的是同子系统下的单,所以code是统一的) - tracks = await _trackDetailsEsRepository.GetLatestListAsync(@event.OrderIds, @event.TrackCodes); + tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds, trackCodes,null); - orderIds = await _trackDetailsEsRepository.DeleteTrackAsync(@event.OrderIds, @event.TrackCodes); - if (orderIds.Count == 0) return tracks; + //构建标识符集合 + var ids = @event.TrackIdentifiers.Select(x => $"{x.TrackCode}{x.TrackTime}").ToList(); + //根据标识符选出要删除的轨迹明细 + var deleteTracks = tracks.Where(x => ids.Contains($"{x.TrackCode}{x.TrackTime}")).ToList(); + + if (deleteTracks.Count == 0) return deleteTracks; + + foreach (var track in deleteTracks) + { + await _trackDetailsEsRepository.DeleteTrackByIdAsync(track.Id, track.IndexName); + } + + orderIds = tracks.Select(m => m.OrderId).Distinct().ToList(); + tracks = deleteTracks; } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index ab931373..8023836a 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -163,8 +163,14 @@ public partial class TrackService : ApplicationService, ITrackService //删除轨迹约束,只要其中有一条来源是外部的就立即返回错误 var tracks = await _trackDetailsEsRepository - .GetListAsync(new[] { orderId }, input.TrackCodes, TrackSourceEnum.ExternalServiceProvide); - if (tracks.Count > 0) + .GetListAsync(new[] { orderId }, + input.TrackIdentifiers.Select(x => x.TrackCode).ToList(), + TrackSourceEnum.ExternalServiceProvide); + + //当要删除的轨迹标识出现交叉则不允许删除 + var intersect = tracks.Select(x => $"{x.TrackCode}{x.TrackTime}") + .Intersect(input.TrackIdentifiers.Select(y => $"{y.TrackCode}{y.TrackTime}")).ToList(); + if (intersect.Count > 0) { throw new BusinessException(message: "存在来源于外部服务商的轨迹,不允许删除"); } @@ -173,7 +179,7 @@ public partial class TrackService : ApplicationService, ITrackService var @event = new TrackDeleteEvent { OrderIds = new[] { orderId }, - TrackCodes = input.TrackCodes, + TrackIdentifiers = input.TrackIdentifiers, SubSystemId = input.SubSystemId, OperationMan = name }; @@ -254,8 +260,14 @@ public partial class TrackService : ApplicationService, ITrackService //删除轨迹约束,只要其中有一条来源是外部的就立即返回错误 var tracks = await _trackDetailsEsRepository - .GetListAsync(orderIds.ToArray(), input.TrackCodes, TrackSourceEnum.ExternalServiceProvide); - if (tracks.Count > 0) + .GetListAsync(orderIds.ToArray(), + input.TrackIdentifiers.Select(x => x.TrackCode).ToList(), + TrackSourceEnum.ExternalServiceProvide); + + //当要删除的轨迹标识出现交叉则不允许删除 + var intersect = tracks.Select(x => $"{x.TrackCode}{x.TrackTime}") + .Intersect(input.TrackIdentifiers.Select(y => $"{y.TrackCode}{y.TrackTime}")).ToList(); + if (intersect.Count > 0) { throw new BusinessException(message: "存在来源于外部服务商的轨迹,不允许删除"); } @@ -264,7 +276,7 @@ public partial class TrackService : ApplicationService, ITrackService var @event = new TrackDeleteEvent { OrderIds = orderIds.ToArray(), - TrackCodes = input.TrackCodes, + TrackIdentifiers = input.TrackIdentifiers, SubSystemId = input.SubSystemId, OperationMan = userInfo.Data.UserName, }; diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs index 482d7142..c57b797b 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs @@ -1,4 +1,5 @@ using SJZY.Expand.ElasticSearch.Services; +using SJZY.Track.Domain.Dtos.TrackContents; using SJZY.Track.Domain.Enums; namespace SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; @@ -23,7 +24,7 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService> GetListAsync(int orderId); - Task> GetListAsync(int[] orderIds, List trackCodes, TrackSourceEnum source); + Task> GetListAsync(int[] orderIds, List trackCodes, TrackSourceEnum? source); Task> DeleteTrackAsync(int[] orderIds, List trackCodes); diff --git a/src/SJZY.Track.Domain/Dtos/TrackContents/TrackCodeMapVO.cs b/src/SJZY.Track.Domain/Dtos/TrackContents/TrackCodeMapVO.cs new file mode 100644 index 00000000..c06fc740 --- /dev/null +++ b/src/SJZY.Track.Domain/Dtos/TrackContents/TrackCodeMapVO.cs @@ -0,0 +1,27 @@ +namespace SJZY.Track.Domain.Dtos.TrackContents; + +/// +/// 轨迹代码映射 +/// +public sealed class TrackCodeMapVO +{ + /// + /// 源子系统id + /// + public int SubSystemId { get; set; } + + /// + /// 源轨迹内容code + /// + public string TrackContentCode { get; set; } = null!; + + /// + /// 映射子系统id + /// + public int MapSubSystemId { get; set; } + + /// + /// 映射轨迹内容code + /// + public string MapTrackContentCode { get; set; } = null!; +} diff --git a/src/SJZY.Track.Domain/Queries/IProvideQueries.cs b/src/SJZY.Track.Domain/Queries/IProvideQueries.cs index 60c0b330..351224c5 100644 --- a/src/SJZY.Track.Domain/Queries/IProvideQueries.cs +++ b/src/SJZY.Track.Domain/Queries/IProvideQueries.cs @@ -18,6 +18,14 @@ public interface IProvideQueries /// Task> MapTrackCodesAsync(int upSubSystemId, int subSystemId, params string[] trackCodes); + /// + /// 获取子系统内容Code映射 + /// + /// + /// + /// + /// + Task> GetTrackCodeMapsAsync(int upSubSystemId, int subSystemId, params string[] trackCodes); /// /// 根据订单模板找对应服务商 /// diff --git a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs index 31855027..8dd6fc96 100644 --- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs +++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs @@ -33,6 +33,22 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen .ToListAsync(); } + public async Task> GetTrackCodeMapsAsync(int upSubSystemId, int subSystemId, params string[] trackCodes) + { + // 根据上游code得到下游code + return await Context.Queryable() + .Where(x => x.SubSystemId == subSystemId && x.MapSubSystemId == upSubSystemId && + trackCodes.Contains(x.MapTrackContentCode)) + .Select(x => new TrackCodeMapVO() + { + SubSystemId = x.SubSystemId, + TrackContentCode = x.TrackContentCode, + MapSubSystemId = x.MapSubSystemId, + MapTrackContentCode = x.MapTrackContentCode + }) + .ToListAsync(); + } + /// public async Task> FindOrderWithServiceProviderAsync(int subSystemId, List orderNos) @@ -46,7 +62,7 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen .Select((a, b, c) => new OrderWithServiceProviderVO { //优先使用第三方的订单号,为空时才使用主单号 - OrderNo = b.OrderNo ?? a.OrderNo, + OrderNo = b.OrderNo.IsNullOrWhiteSpace() ? a.OrderNo : b.OrderNo!, OrderType = a.OrderType, SubSystemId = a.SubSystemId, ServiceProviderCode = b.ServiceProviderCode, @@ -67,7 +83,7 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen .Select((a, b) => new OrderWithServiceProviderVO { //优先使用第三方的订单号,为空时才使用主单号 - OrderNo = b.OrderNo ?? a.OrderNo, + OrderNo = b.OrderNo.IsNullOrWhiteSpace() ? a.OrderNo : b.OrderNo!, OrderType = a.OrderType, SubSystemId = a.SubSystemId, ServiceProviderCode = b.ServiceProviderCode diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index cb62b1b1..346d8c57 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -3,6 +3,7 @@ using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Expand.ElasticSearch.Services; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Consts; +using SJZY.Track.Domain.Dtos.TrackContents; using SJZY.Track.Domain.Enums; namespace SJZY.Track.Repository.Repositories; @@ -75,6 +76,8 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract f.TrackTimeZone) .Field(f => f.OrderId) .Field(f => f.TrackCode) + .Field(f => f.Id) + .Field(f => f.IndexName) )) .Query(q => q .Bool(b => b @@ -99,6 +102,17 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract so .Field(f => f.ZeroTrackTime, SortOrder.Descending) ) + .Source(s2 => s2.Includes(fd2 => fd2 + .Field(f => f.TrackEnContent) + .Field(f => f.TrackContent) + .Field(f => f.TrackPlace) + .Field(f => f.TrackTime) + .Field(f => f.TrackTimeZone) + .Field(f => f.OrderId) + .Field(f => f.TrackCode) + .Field(f => f.Id) + .Field(f => f.IndexName) + )) ) ) ) @@ -343,15 +357,26 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract> GetListAsync(int[] orderIds, List trackCodes, TrackSourceEnum source) + public async Task> GetListAsync(int[] orderIds, List trackCodes, TrackSourceEnum? source) { + var query = new QueryContainer(); + + if (orderIds.Length > 0) + { + query &= Query.Terms(t => t.Field(f => f.OrderId).Terms(orderIds)); + } + if (trackCodes.Count > 0) + { + query &= Query.Terms(t => t.Field(f => f.TrackCode.Suffix("keyword")).Terms(trackCodes)); + } + if (source.HasValue) + { + query &= Query.Term(t => t.Field(f => f.Source).Value(source.Value)); + } + var r = await Context.SearchAsync(x => x .Index(GlobalConst.TrackDetailsIndex) - .Query(q => - q.Terms(t => t.Field(f => f.OrderId).Terms(orderIds)) - && q.Terms(t => t.Field(f => f.TrackCode.Suffix("keyword")).Terms(trackCodes)) - && q.Term(t => t.Source, (int) source) - ) + .Query(q => query) .Size(SafelyLimit) .Sort(s => s.Field(f => f.ZeroTrackTime, SortOrder.Descending))); @@ -474,5 +499,4 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract