diff --git a/src/TrackCenter.Application/Dtos/TrackPull/EditTrackPullPriorityInput.cs b/src/TrackCenter.Application/Dtos/TrackPull/EditTrackPullPriorityInput.cs index 38852c4e..0765744f 100644 --- a/src/TrackCenter.Application/Dtos/TrackPull/EditTrackPullPriorityInput.cs +++ b/src/TrackCenter.Application/Dtos/TrackPull/EditTrackPullPriorityInput.cs @@ -14,25 +14,25 @@ public class EditTrackPullPriorityInput /// /// 轨迹拉取配置id /// - public int? TrackPullConfigId { get; set; } + public int TrackPullConfigId { get; set; } /// /// 客户 /// - public string? Customer { get; set; } + public string Customer { get; set; } /// /// 订单类型 /// - public TrackOrderType? OrderType { get; set; } + public TrackOrderType OrderType { get; set; } /// /// 优先级 /// - public string? Priority { get; set; } + public int Priority { get; set; } /// /// 服务商拉取频率(分钟) /// - public int? PullInterval { get; set; } + public int PullInterval { get; set; } } diff --git a/src/TrackCenter.Application/Services/ProvideServices/OrderServiceV2.cs b/src/TrackCenter.Application/Services/ProvideServices/OrderServiceV2.cs index d4d16c8e..efb22b49 100644 --- a/src/TrackCenter.Application/Services/ProvideServices/OrderServiceV2.cs +++ b/src/TrackCenter.Application/Services/ProvideServices/OrderServiceV2.cs @@ -1,5 +1,6 @@ using System.ComponentModel.DataAnnotations; using InterfaceForward.Domain.Shared.Helpers; +using Microsoft.AspNetCore.Components.Forms; using TrackCenter.Domain.Aggregates.OrderAggregate; using TrackCenter.Domain.Aggregates.TrackPullAggregate; using TrackCenter.Repository.Aggregates.OrderAggregate; @@ -71,6 +72,65 @@ public class OrderServiceV2( }; } + /// + /// 新增、更新大包(存在就更新) + /// + /// + /// + [HttpPost("OrderV2/UpsertBigBag")] + public async Task UpsertAsync(UpsertBigBagInput input) + { + // 校验订单是否已存在,存在则更新 + var order = await orderRepository.GetFirstAsync(x => + x.AppKey == input.ApiCode && x.OrderType == TrackOrderType.大包 && x.OrderNo == input.BagNo); + // 订单已存在则视为更新 + if (order != null) + { + order = await BuiltOrder(input); + + await orderRepository.UpdateOrderAsync(order); + + var index = new OrderOperationRecordIndex + { + OrderId = order.Id, + OrderNo = input.BagNo, + OptionType = OrderOperationType.修改订单.ToString(), + Content = input.ToJson(), + CreateUserId = CurrentUserId, + CreateUserName = CurrentUser.UserName ?? string.Empty, + }; + + _ = orderOperationRecordEsRepository.AddAsync(index); + + return new IdBaseDto + { + Id = order.Id + }; + } + + order = await BuiltOrder(input); + var orderId = await orderRepository.CreateOrderAsync(order); + + // 写入操作日志 + var indexForAdd = new OrderOperationRecordIndex + { + OrderId = orderId, + OrderNo = input.BagNo, + OptionType = nameof(OrderOperationType.创建订单), + Content = input.ToJson(), + CreateUserId = CurrentUserId, + CreateUserName = CurrentUser.UserName ?? string.Empty, + CreateTime = DateTime.Now + }; + _ = orderOperationRecordEsRepository.AddAsync(indexForAdd); + + + return new IdBaseDto + { + Id = orderId + }; + } + private async Task BuiltOrder(UpsertSmallBagInput input) { var order = new OrderEntity @@ -92,86 +152,42 @@ public class OrderServiceV2( }; var config = await trackPullConfigRepository - .GetListAsync(x => x.AppKey == input.ApiCode - && x.ServiceProviderCode == input.ApiCode && x.OrderType == TrackOrderType.小包); + .FirstOrDefaultAsync(x => x.AppKey == input.ApiCode + && x.ServiceProviderCode == input.ApiCode); - order.OrderPullStatus = BuiltOrderPullStatus(config, order); + if (config == null) throw new BusinessException(message: "没有一个拉取配置可以适用,请配置,否则无法拉取轨迹"); + + order.OrderPullStatus = [CreateOrderPullStatus(config, order)]; return order; } - private static List BuiltOrderPullStatus( - List configs, - OrderEntity order) + private Task BuiltOrder(UpsertBigBagInput input) { - if (configs.IsNullOrEmpty()) return []; - - TrackPullConfigEntity? selected = null; - var bestScore = -1; - - foreach (var config in configs) + var order = new OrderEntity { - if (!IsConfigApplicable(config, order)) - { - continue; - } + AppKey = input.ApiCode, + ServiceProviderCode = input.ApiCode, + OrderType = TrackOrderType.大包, + OrderNo = input.BagNo, + ThirdPartyOrderNumber = input.OtherNo, + Customer = input.Client, + Channel = input.Channel, + ProductCode = input.Product, + ArrivalCountry = input.Country + }; - var score = CalculateMatchScore(config, order); - if (score > bestScore) - { - bestScore = score; - selected = config; - } - } + // tips: 2025-11-29 zzh 大包没有轨迹拉取能力 - if (selected == null) throw new BusinessException(message: "没有一个拉取配置可以适用,请配置,否则无法拉取轨迹"); + // var config = await trackPullConfigRepository + // .FirstOrDefaultAsync(x => x.AppKey == input.ApiCode + // && x.ServiceProviderCode == input.ApiCode); + // + // if (config == null) throw new BusinessException(message: "没有一个拉取配置可以适用,请配置,否则无法拉取轨迹"); + // + // order.OrderPullStatus = [CreateOrderPullStatus(config, order)]; - return [CreateOrderPullStatus(selected, order)]; - } - - private static bool IsConfigApplicable(TrackPullConfigEntity config, OrderEntity order) - { - return IsFieldApplicable(order.Customer, config.Customer) && - IsFieldApplicable(order.Channel, config.Channel) && - IsFieldApplicable(order.ProductCode, config.Product); - } - - private static bool IsFieldApplicable(string? orderValue, string? configValue) - { - if (string.IsNullOrWhiteSpace(configValue)) - { - return true; - } - - return string.Equals(configValue, orderValue, StringComparison.OrdinalIgnoreCase); - } - - private static int CalculateMatchScore(TrackPullConfigEntity config, OrderEntity order) - { - var score = 0; - - if (IsPreciseMatch(order.Customer, config.Customer)) - { - score++; - } - - if (IsPreciseMatch(order.Channel, config.Channel)) - { - score++; - } - - if (IsPreciseMatch(order.ProductCode, config.Product)) - { - score++; - } - - return score; - } - - private static bool IsPreciseMatch(string? orderValue, string? configValue) - { - return !string.IsNullOrWhiteSpace(configValue) && - string.Equals(configValue, orderValue, StringComparison.OrdinalIgnoreCase); + return Task.FromResult(order); } private static OrderPullStatusEntity CreateOrderPullStatus(TrackPullConfigEntity config, OrderEntity order) @@ -195,6 +211,11 @@ public class OrderServiceV2( status.StartTime = DateTime.Now.AddHours(config.SilenceBeforeStart); } + if (string.IsNullOrWhiteSpace(config.EndTrackCode)) + { + status.EndTime = DateTime.Now.AddHours(config.SilenceBeforeStart).AddDays(7); + } + return status; } } @@ -273,3 +294,49 @@ public class Consignee /// public string Email { get; set; } } + +public class UpsertBigBagInput +{ + /// + /// 客户名称,或者code,必填 + /// + [Required] + public string Client { get; set; } + + /// + /// 客户单号,必填 + /// + [Required] + public string BagNo { get; set; } + + /// + /// 其他单号 + /// + public string OtherNo { get; set; } + + /// + /// 渠道名称,或者code + /// + public string Channel { get; set; } + + /// + /// 产品名称,或者code + /// + public string Product { get; set; } + + /// + /// 产品名称,或者code + /// + public string Country { get; set; } + + /// + /// 服务商code + /// + public string ApiCode { get; set; } +} + +public class UpsertMsterOrderInput +{ + +} + diff --git a/src/TrackCenter.Application/Services/TrackPull/TrackPullService.cs b/src/TrackCenter.Application/Services/TrackPull/TrackPullService.cs index 38655b00..0757e49a 100644 --- a/src/TrackCenter.Application/Services/TrackPull/TrackPullService.cs +++ b/src/TrackCenter.Application/Services/TrackPull/TrackPullService.cs @@ -88,8 +88,7 @@ public class TrackPullService( { Expression> isAnyExp = x => x.AppKey == input.AppKey && - x.ServiceProviderCode == input.ServiceProviderCode && - x.OrderType == input.OrderType; + x.ServiceProviderCode == input.ServiceProviderCode; if (input.Options == OptionTypeNoNull.修改) isAnyExp = isAnyExp.And(x => x.Id != input.Id); if (await trackPullConfigRepository.IsAnyAsync(isAnyExp)) @@ -317,6 +316,8 @@ public class TrackPullService( if (await trackPullConfigRepository.IsPriorityAnyAsync(isPriorityAnyExp)) throw new BusinessException("配置已存在"); + + if (input.PullInterval < 60) input.PullInterval = 60; } switch (input.Options) @@ -345,8 +346,7 @@ public class TrackPullService( case OptionTypeNoNull.删除: { - var oldTrackPullPriorityEntity = - await trackPullConfigRepository.GetPriorityByIdAsync(input.Id!.Value) ?? + _ = await trackPullConfigRepository.GetPriorityByIdAsync(input.Id!.Value) ?? throw new BusinessException(message: "找不到数据"); await trackPullConfigRepository.SoftDeletePriorityAsync(x => x.Id == input.Id); diff --git a/src/TrackCenter.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/TrackCenter.Domain/Aggregates/OrderAggregate/OrderEntity.cs index bc0dd798..a4200097 100644 --- a/src/TrackCenter.Domain/Aggregates/OrderAggregate/OrderEntity.cs +++ b/src/TrackCenter.Domain/Aggregates/OrderAggregate/OrderEntity.cs @@ -221,6 +221,7 @@ public class OrderEntity : FullAuditedAggregateRoot [SugarColumn(IsIgnore = true)] public List OrderFlights { get; set; } = []; + // tips:2025-11-29:sp挪到订单主表了,1v1拉取 [SugarColumn(IsIgnore = true)] public List OrderPullStatus { get; set; } = []; public void ResetTrackInfo() diff --git a/src/TrackCenter.Domain/Aggregates/TrackPullAggregate/TrackPullConfigEntity.cs b/src/TrackCenter.Domain/Aggregates/TrackPullAggregate/TrackPullConfigEntity.cs index ff988646..8558b3be 100644 --- a/src/TrackCenter.Domain/Aggregates/TrackPullAggregate/TrackPullConfigEntity.cs +++ b/src/TrackCenter.Domain/Aggregates/TrackPullAggregate/TrackPullConfigEntity.cs @@ -8,12 +8,6 @@ namespace TrackCenter.Domain.Aggregates.TrackPullAggregate; [SugarTable("t_track_pull_config")] public class TrackPullConfigEntity : FullAuditedAggregateRoot { - /// - /// 自增主键 - /// - [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)] - public int Id { get; set; } - /// /// 应用 /// @@ -24,7 +18,7 @@ public class TrackPullConfigEntity : FullAuditedAggregateRoot /// 服务商代码 /// [SugarColumn(ColumnName = "ServiceProviderCode")] - public string? ServiceProviderCode { get; set; } + public string ServiceProviderCode { get; set; } /// /// 解析方式,1取接口通返参映射后的,2取服务商原返参 @@ -92,12 +86,6 @@ public class TrackPullConfigEntity : FullAuditedAggregateRoot [SugarColumn(ColumnName = "TrackTimeZoneName")] public string? TrackTimeZoneName { get; set; } - /// - /// 订单类型 - /// - [SugarColumn(ColumnName = "OrderType")] - public TrackOrderType OrderType { get; set; } - /// /// 开始轨迹code /// diff --git a/src/TrackCenter.Domain/Aggregates/TrackPullAggregate/TrackPullPriorityEntity.cs b/src/TrackCenter.Domain/Aggregates/TrackPullAggregate/TrackPullPriorityEntity.cs index 0bf59092..55589ef2 100644 --- a/src/TrackCenter.Domain/Aggregates/TrackPullAggregate/TrackPullPriorityEntity.cs +++ b/src/TrackCenter.Domain/Aggregates/TrackPullAggregate/TrackPullPriorityEntity.cs @@ -30,7 +30,7 @@ public class TrackPullPriorityEntity: FullAuditedEntity /// 优先级 /// [SugarColumn(ColumnName = "优先级")] - public string Priority { get; set; } + public int Priority { get; set; } /// /// 服务商拉取频率(分钟) diff --git a/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullConfigDetailOutputVO.cs b/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullConfigDetailOutputVO.cs index d35a5460..0a5411b4 100644 --- a/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullConfigDetailOutputVO.cs +++ b/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullConfigDetailOutputVO.cs @@ -81,11 +81,6 @@ public class GetTrackPullConfigDetailOutputVO /// public string TrackDetailsPath { get; set; } - /// - /// 订单类型 - /// - public TrackOrderType OrderType { get; set; } - /// /// 开始轨迹code /// diff --git a/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullPriorityDetailOutputVO.cs b/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullPriorityDetailOutputVO.cs index 8f28b111..053759fb 100644 --- a/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullPriorityDetailOutputVO.cs +++ b/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullPriorityDetailOutputVO.cs @@ -24,7 +24,7 @@ public class GetTrackPullPriorityDetailOutputVO /// /// 优先级 /// - public string Priority { get; set; } + public int Priority { get; set; } /// /// 服务商拉取频率(分钟) diff --git a/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullPriorityPageOutputVO.cs b/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullPriorityPageOutputVO.cs index e90688b7..7616fcd8 100644 --- a/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullPriorityPageOutputVO.cs +++ b/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullPriorityPageOutputVO.cs @@ -19,13 +19,13 @@ public class GetTrackPullPriorityPageOutputVO /// /// 优先级 /// - public string Priority { get; set; } + public int Priority { get; set; } /// /// 服务商拉取频率(分钟) /// public int PullInterval { get; set; } - + public DateTime CreateTime { get; set; } public string? CreateUser { get; set; } diff --git a/src/TrackCenter.Repository/Repositories/TrackPullConfigRepository.cs b/src/TrackCenter.Repository/Repositories/TrackPullConfigRepository.cs index 61e53cfc..47a1cf6c 100644 --- a/src/TrackCenter.Repository/Repositories/TrackPullConfigRepository.cs +++ b/src/TrackCenter.Repository/Repositories/TrackPullConfigRepository.cs @@ -102,7 +102,6 @@ public class TrackPullConfigRepository : BasicRepository, TrackStatusName = trackPull.TrackStatusName, OrderPath = trackPull.OrderPath, TrackDetailsPath = trackPull.TrackDetailsPath, - OrderType = trackPull.OrderType, StartTrackCode = trackPull.StartTrackCode, EndTrackCode = trackPull.EndTrackCode, SilenceBeforeStart = trackPull.SilenceBeforeStart,