From 5bbf7d1824d0d3e2055e25ed1efc3627e75f33a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=86=9B?= <2357729423@qq.com> Date: Thu, 29 Feb 2024 11:31:19 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E8=AE=A2=E5=8D=95=E5=A2=9E=E5=88=A0?= =?UTF-8?q?=E6=94=B9=E3=80=81=E8=BD=A8=E8=BF=B9=E6=A8=A1=E6=9D=BF=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../appsettings.Development.json | 2 +- .../AutoMapper/OrderAutoMapperProfile.cs | 19 +++++ .../Dtos/ProvideServices/CreateOrderInput.cs | 4 +- .../Dtos/ProvideServices/DeleteOrderInput.cs | 23 ++++++ .../Dtos/ProvideServices/GetTrackInput.cs | 5 ++ .../Dtos/ProvideServices/GetTrackOutput.cs | 2 +- .../Dtos/ProvideServices/UpdateOrderInput.cs | 31 ++------ .../ProvideServices/OrderLinkService.cs | 2 +- .../Services/ProvideServices/OrderService.cs | 75 ++++++++++--------- .../ProvideServices/TrackQueryService.cs | 43 +++++++---- .../Services/ProvideServices/TrackService.cs | 5 ++ .../OrderAggregate/IOrderRepository.cs | 20 +++-- .../Aggregates/OrderAggregate/OrderEntity.cs | 72 ++++++++++-------- .../OrderAggregate/OrderFlightEntity.cs | 6 +- .../OrderAggregate/OrderLinkEntity.cs | 4 +- .../ITrackTemplateRepository.cs | 2 +- .../Dtos/Order/OrderTemplateDto.cs | 6 +- .../Dtos/TrackTemplate/TemplateContentDto.cs | 5 -- .../TemplateContentOrderlyDto.cs | 14 ++++ src/SJZY.Track.Domain/IBasicQuery.cs | 2 +- src/SJZY.Track.Repository/BasicQuery.cs | 2 + src/SJZY.Track.Repository/OrderRepository.cs | 47 +++++++++--- .../SJZYTrackRepositoryModule.cs | 4 +- .../TrackTemplateRepository.cs | 14 +++- 24 files changed, 265 insertions(+), 144 deletions(-) create mode 100644 src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs create mode 100644 src/SJZY.Track.Application/Dtos/ProvideServices/DeleteOrderInput.cs create mode 100644 src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs delete mode 100644 src/SJZY.Track.Domain/Dtos/TrackTemplate/TemplateContentDto.cs create mode 100644 src/SJZY.Track.Domain/Dtos/TrackTemplate/TemplateContentOrderlyDto.cs diff --git a/src/SJZY.Track.Api/appsettings.Development.json b/src/SJZY.Track.Api/appsettings.Development.json index d50e3e8a..900166d1 100644 --- a/src/SJZY.Track.Api/appsettings.Development.json +++ b/src/SJZY.Track.Api/appsettings.Development.json @@ -2,7 +2,7 @@ "Environment": "Dev", "Logging": { "LogLevel": { - "Default": "Information", + "Default": "Debug", "Microsoft.AspNetCore": "Warning" } }, diff --git a/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs new file mode 100644 index 00000000..2dac9751 --- /dev/null +++ b/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs @@ -0,0 +1,19 @@ +using AutoMapper; +using SJZY.Track.Application.Dtos.ProvideServices; +using SJZY.Track.Domain.Aggregates.OrderAggregate; + +namespace SJZY.Track.Application.AutoMapper; + +public class OrderAutoMapperProfile : Profile +{ + public OrderAutoMapperProfile() + { + CreateMap(MemberList.None); + CreateMap(MemberList.None); + + CreateMap(MemberList.None) + .ForMember(dest => dest.ServiceProviderId, opt => opt.MapFrom(m => m.ServiceProviderId ?? 0)) + .ForMember(dest => dest.TrackTemplateId, opt => opt.MapFrom(m => m.TemplateId)); + CreateMap(MemberList.None); + } +} \ No newline at end of file diff --git a/src/SJZY.Track.Application/Dtos/ProvideServices/CreateOrderInput.cs b/src/SJZY.Track.Application/Dtos/ProvideServices/CreateOrderInput.cs index 31b917f2..47888316 100644 --- a/src/SJZY.Track.Application/Dtos/ProvideServices/CreateOrderInput.cs +++ b/src/SJZY.Track.Application/Dtos/ProvideServices/CreateOrderInput.cs @@ -7,7 +7,7 @@ public class CreateOrderInput : UpdateOrderInput /// /// 客户id /// - public int ClientId { get; set; } + public int CustomId { get; set; } } public class OrderTemplateInfo @@ -24,7 +24,7 @@ public class OrderTemplateInfo public int? ServiceProviderId { get; set; } } -public class FligthInfo +public class OrderFligthInfo { /// /// 航班号 diff --git a/src/SJZY.Track.Application/Dtos/ProvideServices/DeleteOrderInput.cs b/src/SJZY.Track.Application/Dtos/ProvideServices/DeleteOrderInput.cs new file mode 100644 index 00000000..b48f8af7 --- /dev/null +++ b/src/SJZY.Track.Application/Dtos/ProvideServices/DeleteOrderInput.cs @@ -0,0 +1,23 @@ +using System.ComponentModel.DataAnnotations; + +namespace SJZY.Track.Application.Dtos.ProvideServices; + +public class DeleteOrderInput : OrderNoInfo +{ +} + +public class OrderNoInfo +{ + /// + /// 订单类型,必填 + /// + [Required] + public int OrderType { get; set; } + + /// + /// 订单号,必填 + /// + [Required] + [MaxLength(100)] + public string OrderNo { get; set; } = null!; +} \ No newline at end of file diff --git a/src/SJZY.Track.Application/Dtos/ProvideServices/GetTrackInput.cs b/src/SJZY.Track.Application/Dtos/ProvideServices/GetTrackInput.cs index 2dc3c39a..d455a5b2 100644 --- a/src/SJZY.Track.Application/Dtos/ProvideServices/GetTrackInput.cs +++ b/src/SJZY.Track.Application/Dtos/ProvideServices/GetTrackInput.cs @@ -2,6 +2,11 @@ namespace SJZY.Track.Application.Dtos.ProvideServices; public class GetTrackInput { + /// + /// 订单类型 + /// + public int OrderType { get; set; } + /// /// 订单号 /// diff --git a/src/SJZY.Track.Application/Dtos/ProvideServices/GetTrackOutput.cs b/src/SJZY.Track.Application/Dtos/ProvideServices/GetTrackOutput.cs index 659ed260..b6b77862 100644 --- a/src/SJZY.Track.Application/Dtos/ProvideServices/GetTrackOutput.cs +++ b/src/SJZY.Track.Application/Dtos/ProvideServices/GetTrackOutput.cs @@ -16,6 +16,6 @@ public class TrackDetail public string Status { get; set; } public string Content { get; set; } public string Location { get; set; } - public DateTime Date { get; set; } + public DateTime Time { get; set; } public float TimeZone { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Dtos/ProvideServices/UpdateOrderInput.cs b/src/SJZY.Track.Application/Dtos/ProvideServices/UpdateOrderInput.cs index 88b12be1..d614db45 100644 --- a/src/SJZY.Track.Application/Dtos/ProvideServices/UpdateOrderInput.cs +++ b/src/SJZY.Track.Application/Dtos/ProvideServices/UpdateOrderInput.cs @@ -1,27 +1,7 @@ -using System.ComponentModel.DataAnnotations; +namespace SJZY.Track.Application.Dtos.ProvideServices; -namespace SJZY.Track.Application.Dtos.ProvideServices; - -public class UpdateOrderInput +public class UpdateOrderInput : OrderNoInfo { - /// - /// 订单类型,必填 - /// - [Required] - public int OrderType { get; set; } - - /// - /// 订单号,必填 - /// - [Required] - [MaxLength(100)] - public string OrderNo { get; set; } - - /// - /// 订单模板(传全量) - /// - public List Templates { get; set; } = new(); - /// /// 目的港口 /// @@ -52,8 +32,13 @@ public class UpdateOrderInput /// public string LeaveCity { get; set; } + /// + /// 订单模板(传全量) + /// + public List Templates { get; set; } = new(); + /// /// 订单航班信息 /// - public List FlightInfos { get; set; } = new(); + public List FlightInfos { get; set; } = new(); } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderLinkService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderLinkService.cs index f729f6b1..d4ec1f87 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/OrderLinkService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderLinkService.cs @@ -7,7 +7,7 @@ namespace SJZY.Track.Application.Services.ProvideServices; /// 订单关联服务 /// [ApiExplorerSettings(GroupName = "提供接口")] -public class OrderLinkService +public class OrderLinkService : ApplicationService { private readonly IOrderRepository _orderRepository; private readonly IBasicQuery _orderLinkQuery; diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs index a5a37ce2..61ae2a24 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs @@ -1,6 +1,5 @@ using SJZY.Track.Application.Dtos.ProvideServices; using SJZY.Track.Domain.Aggregates.OrderAggregate; -using SJZY.UserCenter.HttpApi.Services; namespace SJZY.Track.Application.Services.ProvideServices; @@ -18,56 +17,58 @@ public class OrderService : ApplicationService } /// - /// 创建订单 + /// 创建订单,订单已存在则视为更新 /// /// /// /// - [HttpPost("Order/Create")] - public async Task CreateOrderAsync(CreateOrderInput input) + [HttpPost("Order/CreateOrUpdate")] + public async Task CreateOrUpdateOrderAsync(CreateOrderInput input) { - if (await _orderRepository.IsAnyAsync(x => - x.OrderType == input.OrderType && x.OrderNo == input.OrderNo)) + var order = await _orderRepository.GetFirstAsync(x => + x.OrderType == input.OrderType && x.OrderNo == input.OrderNo); + if (order != default) { - throw new BusinessException(message: $"单号:{input.OrderNo}已存在"); + // 订单已存在则视为更新 + await UpdateOrderAsync(input, order); + return "更新成功"; } - var order = new OrderEntity + order = ObjectMapper.Map(input); + order.SubSystemId = 1; + order.OrderTemplates = ObjectMapper.Map, List>(input.Templates); + order.OrderFlights = ObjectMapper.Map, List>(input.FlightInfos); + + await _orderRepository.CreateOrderAsync(order); + return "创建成功"; + } + + /// + /// 删除订单 + /// + /// + /// + /// + [HttpPost("Order/Delete")] + public async Task DeleteOrderAsync(DeleteOrderInput input) + { + var orderId = await _orderRepository.GetFirstAsync(x => + x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, x => x.Id); + if (orderId == default) { - CustomId = input.ClientId, - OrderNo = input.OrderNo, - OrderType = input.OrderType, - SubSystemId = CurrentUserRequest.SubSystemId, - IsCompleted = false, - LatestTraceContent = null, - LatestTraceEnContent = null, - LatestTraceTime = null, - OrderDetails = null, - }; + throw new BusinessException(message: $"订单:{input.OrderNo}不存在"); + } - using var tran = TransactionHelper.GetReadCommitted(); - - // 创建订单 - var orderId = await _orderRepository.InsertReturnIdentityAsync(order); - - var templates = input.Templates.Select(x => new OrderTemplateEntity - { - OrderId = orderId, - ServiceProviderId = x.ServiceProviderId ?? 0, - TrackTemplateId = x.TemplateId - }).ToList(); - - // 创建订单模板 - await _orderRepository.CreateOrderTemplatesAsync(templates); - - tran.Complete(); + await _orderRepository.SoftDeleteAsync(x => x.Id == orderId); return true; } - [HttpPost("Order/Update")] - public async Task UpdateOrderAsync(UpdateOrderInput input) + private async Task UpdateOrderAsync(UpdateOrderInput input, OrderEntity order) { - return true; + order = ObjectMapper.Map(input, order); + order.OrderTemplates = ObjectMapper.Map, List>(input.Templates); + order.OrderFlights = ObjectMapper.Map, List>(input.FlightInfos); + await _orderRepository.UpdateOrderAsync(order); } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackQueryService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackQueryService.cs index e768cbab..7792631f 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackQueryService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackQueryService.cs @@ -38,12 +38,10 @@ public class TrackQueryService : ApplicationService } var res = new List(); - var distinctOrderNos = input.OrderNos.Distinct().ToList(); - var details = await _trackDetailsRepository.GetListAsync(distinctOrderNos); - var orderTemplates = await _orderRepository.GetOrderTemplatesAsync(distinctOrderNos); - var distinctTemplateIds = orderTemplates.Select(x => x.TrackTemplateId).Distinct().ToList(); - var templateContents = await _trackTemplateRepository.GetTemplateContentsAsync(distinctTemplateIds); + input.OrderNos = input.OrderNos.Distinct().ToList(); + var details = await _trackDetailsRepository.GetListAsync(input.OrderNos); + var isTurn = input.TimeZone != 0; foreach (var group in details.GroupBy(x => x.OrderId)) { var item = new GetTrackOutput(); @@ -56,33 +54,50 @@ public class TrackQueryService : ApplicationService Status = x.TrackStatus, Content = x.TrackContent, Location = x.TrackPlace, - Date = x.TrackTime.AddHours(input.TimeZone - x.TraceTimeZone), - TimeZone = x.TraceTimeZone + Time = isTurn ? x.TrackTime.AddHours(input.TimeZone - x.TraceTimeZone) : x.TrackTime, + TimeZone = isTurn ? input.TimeZone : x.TraceTimeZone }).ToList(); - TrackDetailSort(item, input.SortMethod); - res.Add(item); } + await TrackDetailSort(res, input); return res; } - private void TrackDetailSort(GetTrackOutput item, SortMethod sortMethod) + private async Task TrackDetailSort(List list, GetTrackInput input) { - switch (sortMethod) + switch (input.SortMethod) { case SortMethod.ByTrackTime: // tips:quick-sort 直接修改原list - item.TrackDetails.Sort((a, b) => a.Date.CompareTo(b.Date)); + list.ForEach(item => item.TrackDetails.Sort((a, b) => a.Time.CompareTo(b.Time))); break; case SortMethod.ByTrackTimeDesc: - item.TrackDetails.Sort((a, b) => b.Date.CompareTo(a.Date)); + list.ForEach(item => item.TrackDetails.Sort((a, b) => b.Time.CompareTo(a.Time))); break; case SortMethod.ByTemplate: + var orderTemplates = await _orderRepository.GetOrderTemplatesAsync(input.OrderType, input.OrderNos); + var distinctTemplateIds = orderTemplates.Select(x => x.TemplateId).Distinct().ToList(); + var templateContent = + await _trackTemplateRepository.GetTemplateContentOrderlyAsync(distinctTemplateIds); + list.ForEach(item => + { + var template = orderTemplates.FirstOrDefault(x => x.OrderNo == item.OrderNo); + if (template == default) return; + var codes = templateContent + .Where(x => x.TemplateId == template.TemplateId) + .Select(x => x.Code) + .ToList(); + item.TrackDetails = item.TrackDetails + .Where(x => codes.Contains(x.Code)) // 剔除不在模板内容中的元素 + .OrderBy(x => codes.IndexOf(x.Code)) // 按照在模板内容的位置排序 + .ToList(); + }); + break; default: - throw new ArgumentOutOfRangeException(nameof(sortMethod), sortMethod, "不支持的排序方式"); + throw new ArgumentOutOfRangeException(nameof(input.SortMethod), input.SortMethod, "不支持的排序方式"); } } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs new file mode 100644 index 00000000..c5cddf06 --- /dev/null +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -0,0 +1,5 @@ +namespace SJZY.Track.Application.Services.ProvideServices; + +public class TrackService +{ +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs index d187933a..e076b731 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs @@ -5,18 +5,19 @@ namespace SJZY.Track.Domain.Aggregates.OrderAggregate; public interface IOrderRepository : IBasicRepository { /// - /// 根据订单号,获取订单模板 + /// 创建订单 /// - /// + /// /// - Task> GetOrderTemplatesAsync(List distinctOrderNumbers); + Task CreateOrderAsync(OrderEntity order); /// - /// 创建订单模板 + /// 根据订单号,获取订单模板 /// - /// + /// 订单类型 + /// /// - Task CreateOrderTemplatesAsync(List templateEntities); + Task> GetOrderTemplatesAsync(int orderType, List distinctOrderNumbers); /// /// 关联订单 @@ -31,4 +32,11 @@ public interface IOrderRepository : IBasicRepository /// /// Task UnLinkByIdsAsync(List linkIds); + + /// + /// 更新订单 + /// + /// + /// + Task UpdateOrderAsync(OrderEntity order); } \ 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 9fe699e4..33e44303 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs @@ -12,6 +12,24 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } + /// + /// 订单号 + /// + [SugarColumn(ColumnName = "OrderNo")] + public string OrderNo { get; set; } = null!; + + /// + /// 订单类型(主数据枚举TrackOrderType) + /// + [SugarColumn(ColumnName = "OrderType")] + public int OrderType { get; set; } + + /// + /// 子系统id + /// + [SugarColumn(ColumnName = "SubSystemId")] + public int SubSystemId { get; set; } + /// /// 客户id(外部主体id) /// @@ -27,78 +45,66 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot /// /// 最新轨迹内容(异步维护) /// - [SugarColumn(ColumnName = "LatestTraceContent")] - public string LatestTraceContent { get; set; } + [SugarColumn(ColumnName = "LatestTrackContent")] + public string? LatestTrackContent { get; set; } /// /// 最新轨迹内容英文(异步维护) /// - [SugarColumn(ColumnName = "LatestTraceEnContent")] - public string LatestTraceEnContent { get; set; } + [SugarColumn(ColumnName = "LatestTrackEnContent")] + public string? LatestTrackEnContent { get; set; } /// /// 最新轨迹时间(异步维护) /// - [SugarColumn(ColumnName = "LatestTraceTime")] - public DateTime? LatestTraceTime { get; set; } + [SugarColumn(ColumnName = "LatestTrackTime")] + public DateTime? LatestTrackTime { get; set; } /// - /// 订单明细(json字符串) + /// 最新轨迹发生地(异步维护) /// - [SugarColumn(ColumnName = "OrderDetails")] - public string OrderDetails { get; set; } - - /// - /// 订单号 - /// - [SugarColumn(ColumnName = "OrderNo")] - public string OrderNo { get; set; } - - /// - /// 订单类型(主数据枚举TrackOrderType) - /// - [SugarColumn(ColumnName = "OrderType")] - public int OrderType { get; set; } - - /// - /// 子系统id - /// - [SugarColumn(ColumnName = "SubSystemId")] - public int SubSystemId { get; set; } + [SugarColumn(ColumnName = "LatestTrackPlace")] + public string? LatestTrackPlace { get; set; } /// /// 目的城市 /// [SugarColumn(ColumnName = "ArrivalCity")] - public string ArrivalCity { get; set; } + public string ArrivalCity { get; set; } = null!; /// /// 目的国家 /// [SugarColumn(ColumnName = "ArrivalCountry")] - public string ArrivalCountry { get; set; } + public string ArrivalCountry { get; set; } = null!; /// /// 目的港口 /// [SugarColumn(ColumnName = "ArrivalPort")] - public string ArrivalPort { get; set; } + public string? ArrivalPort { get; set; } /// /// 起运城市 /// [SugarColumn(ColumnName = "LeaveCity")] - public string LeaveCity { get; set; } + public string LeaveCity { get; set; } = null!; /// /// 起运国家 /// [SugarColumn(ColumnName = "LeaveCountry")] - public string LeaveCountry { get; set; } + public string LeaveCountry { get; set; } = null!; /// /// 起运港口 /// [SugarColumn(ColumnName = "LeavePort")] - public string LeavePort { get; set; } + public string? LeavePort { get; set; } + + [Navigate(NavigateType.OneToMany, nameof(OrderFlightEntity.OrderId))] + public List OrderFlights { get; set; } + + [Navigate(NavigateType.OneToMany, nameof(OrderFlightEntity.OrderId))] + public List OrderTemplates { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderFlightEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderFlightEntity.cs index 8e828946..c76d4d54 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderFlightEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderFlightEntity.cs @@ -1,5 +1,9 @@ namespace SJZY.Track.Domain.Aggregates.OrderAggregate; +/// +/// 订单航班表(1:N) +/// +[SugarTable("t_order_flight")] public class OrderFlightEntity : ICreateBaicEntity, IEntity { /// @@ -18,7 +22,7 @@ public class OrderFlightEntity : ICreateBaicEntity, IEntity /// 航班号 /// [SugarColumn(ColumnName = "FlightNo")] - public string FlightNo { get; set; } + public string FlightNo { get; set; } = null!; /// /// 订单id diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderLinkEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderLinkEntity.cs index bc94704a..68b20740 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderLinkEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderLinkEntity.cs @@ -22,7 +22,7 @@ public class OrderLinkEntity : ICreateBaicEntity, IEntity /// 订单号 /// [SugarColumn(ColumnName = "OrderNo")] - public string OrderNo { get; set; } + public string OrderNo { get; set; } = null!; /// /// 关联的订单类型 @@ -34,7 +34,7 @@ public class OrderLinkEntity : ICreateBaicEntity, IEntity /// 关联的订单号 /// [SugarColumn(ColumnName = "LinkOrderNo")] - public string LinkOrderNo { get; set; } + public string LinkOrderNo { get; set; } = null!; /// /// 创建人 diff --git a/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs index a20f2ced..72c28edf 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs @@ -4,7 +4,7 @@ namespace SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; public interface ITrackTemplateRepository : IBasicRepository { - Task GetTemplateContentsAsync(List distinctTemplateIds); + Task> GetTemplateContentOrderlyAsync(List distinctTemplateIds); Task GetDetailAsync(int id); diff --git a/src/SJZY.Track.Domain/Dtos/Order/OrderTemplateDto.cs b/src/SJZY.Track.Domain/Dtos/Order/OrderTemplateDto.cs index df433d5d..c2655b43 100644 --- a/src/SJZY.Track.Domain/Dtos/Order/OrderTemplateDto.cs +++ b/src/SJZY.Track.Domain/Dtos/Order/OrderTemplateDto.cs @@ -3,12 +3,12 @@ namespace SJZY.Track.Domain.Dtos.Order; public class OrderTemplateDto { /// - /// 订单id + /// 订单号 /// - public int OrderId { get; set; } + public string OrderNo { get; set; } /// /// 模板id /// - public int TrackTemplateId { get; set; } + public int TemplateId { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/TrackTemplate/TemplateContentDto.cs b/src/SJZY.Track.Domain/Dtos/TrackTemplate/TemplateContentDto.cs deleted file mode 100644 index 4d82a4d5..00000000 --- a/src/SJZY.Track.Domain/Dtos/TrackTemplate/TemplateContentDto.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace SJZY.Track.Domain.Dtos.TrackTemplate; - -public class TemplateContentDto -{ -} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/TrackTemplate/TemplateContentOrderlyDto.cs b/src/SJZY.Track.Domain/Dtos/TrackTemplate/TemplateContentOrderlyDto.cs new file mode 100644 index 00000000..d7ef08ef --- /dev/null +++ b/src/SJZY.Track.Domain/Dtos/TrackTemplate/TemplateContentOrderlyDto.cs @@ -0,0 +1,14 @@ +namespace SJZY.Track.Domain.Dtos.TrackTemplate; + +public class TemplateContentOrderlyDto +{ + /// + /// 模板id + /// + public int TemplateId { get; set; } + + /// + /// 轨迹内容代码 + /// + public string Code { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/IBasicQuery.cs b/src/SJZY.Track.Domain/IBasicQuery.cs index 0ddba65d..f050d54d 100644 --- a/src/SJZY.Track.Domain/IBasicQuery.cs +++ b/src/SJZY.Track.Domain/IBasicQuery.cs @@ -7,7 +7,7 @@ public interface IBasicQuery where T : IEntity /// /// /// - Task GetFirstAsync(Expression> whereExpression); + Task GetFirstAsync(Expression> whereExpression); Task GetFirstAsync(Expression> whereExpression, Expression> resultExpression); diff --git a/src/SJZY.Track.Repository/BasicQuery.cs b/src/SJZY.Track.Repository/BasicQuery.cs index 0e0d8874..275b3b4d 100644 --- a/src/SJZY.Track.Repository/BasicQuery.cs +++ b/src/SJZY.Track.Repository/BasicQuery.cs @@ -4,7 +4,9 @@ using SJZY.Track.Domain.SeedWork; namespace SJZY.Track.Repository; +#pragma warning disable CS8613 public class BasicQuery : SimpleClient, IBasicQuery where T : class, IEntity, new() +#pragma warning restore CS8613 { public BasicQuery() { diff --git a/src/SJZY.Track.Repository/OrderRepository.cs b/src/SJZY.Track.Repository/OrderRepository.cs index 9b64b010..645fb94b 100644 --- a/src/SJZY.Track.Repository/OrderRepository.cs +++ b/src/SJZY.Track.Repository/OrderRepository.cs @@ -1,24 +1,33 @@ -using SJZY.Track.Domain.Aggregates.OrderAggregate; +using SJZY.Track.Domain; +using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Dtos.Order; namespace SJZY.Track.Repository; public class OrderRepository : BasicRepository, IOrderRepository, ITransientDependency { - public async Task> GetOrderTemplatesAsync(List distinctOrderNumbers) + public async Task CreateOrderAsync(OrderEntity order) + { + return await Context.InsertNav(order) + .Include(x => x.OrderFlights) + .Include(x => x.OrderTemplates) + .ExecuteCommandAsync(); + } + + public async Task> GetOrderTemplatesAsync(int orderType, + List distinctOrderNumbers) { return await AsQueryable() .LeftJoin((a, b) => a.Id == b.OrderId) - .Where(a => distinctOrderNumbers.Contains(a.OrderNo)) - .Select() + .Where(a => a.OrderType == orderType && distinctOrderNumbers.Contains(a.OrderNo)) + .Select((a, b) => new OrderTemplateDto + { + OrderNo = a.OrderNo, + TemplateId = b.TrackTemplateId + }) .ToListAsync(); } - public async Task CreateOrderTemplatesAsync(List templateEntities) - { - await Context.Insertable(templateEntities).ExecuteCommandAsync(); - } - public async Task LinkOrderAsync(List orderLinkEntities) { await Context.Insertable(orderLinkEntities).ExecuteCommandAsync(); @@ -28,4 +37,24 @@ public class OrderRepository : BasicRepository, IOrderRepository, I { await Context.Deleteable(linkIds).ExecuteCommandAsync(); } + + public async Task UpdateOrderAsync(OrderEntity order) + { + using var tran = TransactionHelper.GetReadCommitted(); + + // 更新订单主表 + await UpdateAsync(order, x => new { x.CustomId, x.SubSystemId }); + + // 更新订单模板 + await Context.Deleteable().Where(x => x.OrderId == order.Id).ExecuteCommandAsync(); + order.OrderTemplates.ForEach(x => x.OrderId = order.Id); + await Context.Insertable(order.OrderTemplates).ExecuteCommandAsync(); + + // 更新订单航班 + await Context.Deleteable().Where(x => x.OrderId == order.Id).ExecuteCommandAsync(); + order.OrderFlights.ForEach(x => x.OrderId = order.Id); + await Context.Insertable(order.OrderFlights).ExecuteCommandAsync(); + + tran.Complete(); + } } \ No newline at end of file diff --git a/src/SJZY.Track.Repository/SJZYTrackRepositoryModule.cs b/src/SJZY.Track.Repository/SJZYTrackRepositoryModule.cs index 08cdcbb0..b58d19b1 100644 --- a/src/SJZY.Track.Repository/SJZYTrackRepositoryModule.cs +++ b/src/SJZY.Track.Repository/SJZYTrackRepositoryModule.cs @@ -28,11 +28,11 @@ public class SJZYTrackRepositoryModule : AbpModule ConnectionString = configuration["ConnectionStrings:DefaultConnection"], DbType = DbType.MySql, IsAutoCloseConnection = true, - ConfigId = "default" + ConfigId = "default", OpenSqlLog = true } } ); - }, DataBaseContext.OnExcutingAction, "SJZY.Track.Repository"); + }, DataBaseContext.OnExcutingAction, "SJZY.Track.Domain"); context.Services.AddElasticSearch(options => { diff --git a/src/SJZY.Track.Repository/TrackTemplateRepository.cs b/src/SJZY.Track.Repository/TrackTemplateRepository.cs index 1424b6df..b36ea8bf 100644 --- a/src/SJZY.Track.Repository/TrackTemplateRepository.cs +++ b/src/SJZY.Track.Repository/TrackTemplateRepository.cs @@ -13,9 +13,19 @@ namespace SJZY.Track.Repository; /// public class TrackTemplateRepository : BasicRepository, ITrackTemplateRepository, IScopedDependency { - public Task GetTemplateContentsAsync(List distinctTemplateIds) + public async Task> GetTemplateContentOrderlyAsync(List distinctTemplateIds) { - throw new NotImplementedException(); + return await Context.Queryable() + .LeftJoin((a, b) => a.Id == b.TrackTemplateId) + .LeftJoin((a, b, c) => b.TrackContentId == c.Id) + .Where(a => distinctTemplateIds.Contains(a.Id)) + .OrderBy((a, b) => b.Sort) + .Select((a, b, c) => new TemplateContentOrderlyDto + { + TemplateId = a.Id, + Code = c.Code + }) + .ToListAsync(); } ///