diff --git a/scripts/sql/migrate_track_pull_config_order_type.sql b/scripts/sql/migrate_track_pull_config_order_type.sql new file mode 100644 index 00000000..a7894259 --- /dev/null +++ b/scripts/sql/migrate_track_pull_config_order_type.sql @@ -0,0 +1,6 @@ +-- 轨迹拉取配置增加订单类型(小包/大包/主单),用于同一应用+服务商下按订单类型区分配置 +-- 库:TrackCenter(t_track_pull_config) +-- MySQL;若 OrderType 列已存在可跳过 + +ALTER TABLE t_track_pull_config + ADD COLUMN OrderType INT NOT NULL DEFAULT 1 COMMENT '订单类型(TrackOrderType:1小包 2大包 4主单)' AFTER ServiceProviderCode; diff --git a/src/TrackCenter.Application/Dtos/ProvideServices/V2/OrderDtos.cs b/src/TrackCenter.Application/Dtos/ProvideServices/V2/OrderDtos.cs index edf9b3aa..8256c0d4 100644 --- a/src/TrackCenter.Application/Dtos/ProvideServices/V2/OrderDtos.cs +++ b/src/TrackCenter.Application/Dtos/ProvideServices/V2/OrderDtos.cs @@ -80,6 +80,11 @@ public class Consignee public class UpsertBigBagInput { + /// + /// 服务商code + /// + public string ApiCode { get; set; } + /// /// 客户名称,或者code,必填 /// @@ -108,7 +113,7 @@ public class UpsertBigBagInput public string Product { get; set; } /// - /// 产品名称,或者code + /// 目的国家二字码 /// public string Country { get; set; } } diff --git a/src/TrackCenter.Application/Rabbit/TrackRefreshEventHandler.cs b/src/TrackCenter.Application/Rabbit/TrackRefreshEventHandler.cs index eb5b6206..6d5f68d1 100644 --- a/src/TrackCenter.Application/Rabbit/TrackRefreshEventHandler.cs +++ b/src/TrackCenter.Application/Rabbit/TrackRefreshEventHandler.cs @@ -81,7 +81,7 @@ public class TrackRefreshEventHandler( // 客户A 渠道B 产品A var config = await trackPullCacheService.GetPullParamsWithContentAsync(attach.AppKey, - attach.ServiceProviderCode); + attach.ServiceProviderCode, attach.OrderType); if (config is null) { logger.LogWarning("请求id: {@RequestId},轨迹消费失败,找不到拉取配置:{@Attach}", attach.ToJson(), @event.RequestId); diff --git a/src/TrackCenter.Application/Services/ProvideServices/OrderService.V2.cs b/src/TrackCenter.Application/Services/ProvideServices/OrderService.V2.cs index f8949f36..cbcfc734 100644 --- a/src/TrackCenter.Application/Services/ProvideServices/OrderService.V2.cs +++ b/src/TrackCenter.Application/Services/ProvideServices/OrderService.V2.cs @@ -179,7 +179,8 @@ public partial class OrderService var config = await _trackPullConfigRepository .FirstOrDefaultAsync(x => x.AppKey == AppKey - && x.ServiceProviderCode == input.ApiCode); + && x.ServiceProviderCode == input.ApiCode + && x.OrderType == TrackOrderType.小包); if (config == null) { @@ -192,11 +193,12 @@ public partial class OrderService return order; } - private Task BuiltOrder(UpsertBigBagInput input) + private async Task BuiltOrder(UpsertBigBagInput input) { var order = new OrderEntity { AppKey = AppKey!, + ServiceProviderCode = input.ApiCode, OrderType = TrackOrderType.大包, OrderNo = input.BagNo, ThirdPartyOrderNumber = input.OtherNo, @@ -206,8 +208,25 @@ public partial class OrderService ArrivalCountry = input.Country }; - // tips: 2025-11-29 zzh 大包没有轨迹拉取能力 - return Task.FromResult(order); + if (string.IsNullOrWhiteSpace(input.ApiCode)) + { + // 未传 apiCode 时保持兼容:不挂拉取配置 + return order; + } + + var config = await _trackPullConfigRepository + .FirstOrDefaultAsync(x => x.AppKey == AppKey + && x.ServiceProviderCode == input.ApiCode + && x.OrderType == TrackOrderType.大包); + + if (config == null) + { + throw ProviderServiceActionResult.Exception("创建/更新失败", + "没有适用的大包拉取配置,请先配置轨迹拉取,否则无法拉取轨迹"); + } + + order.OrderPullStatus = [CreateOrderPullStatus(config, order)]; + return order; } private async Task BuiltOrder(UpsertMasterOrderInput input) @@ -227,7 +246,8 @@ public partial class OrderService var config = await _trackPullConfigRepository .FirstOrDefaultAsync(x => x.AppKey == AppKey - && x.ServiceProviderCode == input.ApiCode); + && x.ServiceProviderCode == input.ApiCode + && x.OrderType == TrackOrderType.小包); if (config == null) { diff --git a/src/TrackCenter.Application/Services/TrackPull/TrackPullCacheService.cs b/src/TrackCenter.Application/Services/TrackPull/TrackPullCacheService.cs index d44624fe..306580c7 100644 --- a/src/TrackCenter.Application/Services/TrackPull/TrackPullCacheService.cs +++ b/src/TrackCenter.Application/Services/TrackPull/TrackPullCacheService.cs @@ -20,12 +20,12 @@ public class TrackPullCacheService : ITransientDependency $"{GlobalConst.TrackPullKeyPrefix}:{config.AppKey}:{config.ServiceProviderCode}:{config.Customer}"; public async Task GetPullParamsWithContentAsync(string appKey, - string serviceProviderCode) + string serviceProviderCode, TrackOrderType orderType) { var data = await RedisHelper.Client.GetAsync(TrackPullContentKey( - appKey, serviceProviderCode)); + appKey, serviceProviderCode, orderType)); - var pullId = await _trackPullConfigRepository.FindIdAsync(appKey, serviceProviderCode); + var pullId = await _trackPullConfigRepository.FindIdAsync(appKey, serviceProviderCode, orderType); data ??= await SetPullConfigAsync(pullId); return data; @@ -53,12 +53,13 @@ public class TrackPullCacheService : ITransientDependency trackPullContentList) }; - var key = TrackPullContentKey(trackPullConfigDetail.AppKey, trackPullConfigDetail.ServiceProviderCode); + var key = TrackPullContentKey(trackPullConfigDetail.AppKey, trackPullConfigDetail.ServiceProviderCode, + trackPullConfigDetail.OrderType); await RedisHelper.Client.SetAsync(key, data, TimeSpan.FromHours(24)); return data; } - public static string TrackPullContentKey(string appKey, string serviceProviderCode) => - $"{GlobalConst.TrackPullContentKeyPrefix}:{appKey}:{serviceProviderCode}"; + public static string TrackPullContentKey(string appKey, string serviceProviderCode, TrackOrderType orderType) => + $"{GlobalConst.TrackPullContentKeyPrefix}:{appKey}:{serviceProviderCode}:{(int)orderType}"; } diff --git a/src/TrackCenter.Application/Services/TrackPull/TrackPullService.cs b/src/TrackCenter.Application/Services/TrackPull/TrackPullService.cs index 0506cead..8c4b6322 100644 --- a/src/TrackCenter.Application/Services/TrackPull/TrackPullService.cs +++ b/src/TrackCenter.Application/Services/TrackPull/TrackPullService.cs @@ -83,9 +83,13 @@ public class TrackPullService( if (input.Options != OptionTypeNoNull.删除) { + if (!Enum.IsDefined(typeof(TrackOrderType), input.OrderType)) + throw new BusinessException("请选择订单类型"); + Expression> isAnyExp = x => x.AppKey == input.AppKey && - x.ServiceProviderCode == input.ServiceProviderCode; + x.ServiceProviderCode == input.ServiceProviderCode && + x.OrderType == input.OrderType; if (input.Options == OptionTypeNoNull.修改) isAnyExp = isAnyExp.And(x => x.Id != input.Id); if (await trackPullConfigRepository.IsAnyAsync(isAnyExp)) diff --git a/src/TrackCenter.Domain/Aggregates/TrackPullAggregate/ITrackPullConfigRepository.cs b/src/TrackCenter.Domain/Aggregates/TrackPullAggregate/ITrackPullConfigRepository.cs index 492b5874..5e0cbb77 100644 --- a/src/TrackCenter.Domain/Aggregates/TrackPullAggregate/ITrackPullConfigRepository.cs +++ b/src/TrackCenter.Domain/Aggregates/TrackPullAggregate/ITrackPullConfigRepository.cs @@ -75,5 +75,5 @@ public interface ITrackPullConfigRepository : IBasicRepository IsPriorityAnyAsync(Expression> whereExpression); - Task FindIdAsync(string appKey, string serviceProviderCode); + Task FindIdAsync(string appKey, string serviceProviderCode, TrackOrderType orderType); } diff --git a/src/TrackCenter.Domain/Aggregates/TrackPullAggregate/TrackPullConfigEntity.cs b/src/TrackCenter.Domain/Aggregates/TrackPullAggregate/TrackPullConfigEntity.cs index 43820fcb..4f90a91f 100644 --- a/src/TrackCenter.Domain/Aggregates/TrackPullAggregate/TrackPullConfigEntity.cs +++ b/src/TrackCenter.Domain/Aggregates/TrackPullAggregate/TrackPullConfigEntity.cs @@ -20,6 +20,12 @@ public class TrackPullConfigEntity : FullAuditedAggregateRoot [SugarColumn(ColumnName = "ServiceProviderCode")] public string ServiceProviderCode { get; set; } + /// + /// 订单类型(主数据枚举TrackOrderType) + /// + [SugarColumn(ColumnName = "OrderType")] + public TrackOrderType OrderType { get; set; } + /// /// 开始轨迹code /// diff --git a/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullConfigDetailOutputVO.cs b/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullConfigDetailOutputVO.cs index a3892ef5..4a5cbd8f 100644 --- a/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullConfigDetailOutputVO.cs +++ b/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullConfigDetailOutputVO.cs @@ -26,6 +26,11 @@ public class GetTrackPullConfigDetailOutputVO /// public string AppKey { get; set; } + /// + /// 订单类型(主数据枚举TrackOrderType) + /// + public TrackOrderType OrderType { get; set; } + /// /// 轨迹扩展信息参数名集合(逗号分割) /// diff --git a/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullConfigPageOutputVO.cs b/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullConfigPageOutputVO.cs index cce27290..ebe196a5 100644 --- a/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullConfigPageOutputVO.cs +++ b/src/TrackCenter.Domain/Dtos/TrackPull/GetTrackPullConfigPageOutputVO.cs @@ -1,3 +1,5 @@ +using TrackCenter.Domain.Enums; + namespace TrackCenter.Domain.Dtos.TrackPull; public class GetTrackPullConfigPageOutputVO @@ -14,6 +16,11 @@ public class GetTrackPullConfigPageOutputVO /// public string ServiceProvider { get; set; } + /// + /// 服务商code + /// + public string ServiceProviderCode { get; set; } + /// /// 应用 /// @@ -23,4 +30,9 @@ public class GetTrackPullConfigPageOutputVO /// 应用 /// public string AppKey { get; set; } + + /// + /// 订单类型(主数据枚举TrackOrderType) + /// + public TrackOrderType OrderType { get; set; } } diff --git a/src/TrackCenter.Repository/Repositories/TrackPullConfigRepository.cs b/src/TrackCenter.Repository/Repositories/TrackPullConfigRepository.cs index 08bea8ee..8e16bfe2 100644 --- a/src/TrackCenter.Repository/Repositories/TrackPullConfigRepository.cs +++ b/src/TrackCenter.Repository/Repositories/TrackPullConfigRepository.cs @@ -5,6 +5,7 @@ using TrackCenter.Domain.Aggregates.TrackPullAggregate; using TrackCenter.Domain.Aggregates.TrackStatusAggregate; using TrackCenter.Domain.Dtos.Common; using TrackCenter.Domain.Dtos.TrackPull; +using TrackCenter.Domain.Enums; using TrackCenter.Domain.VEntities; namespace TrackCenter.Repository.Repositories; @@ -27,6 +28,8 @@ public class TrackPullConfigRepository : BasicRepository, AppKey = system.AppKey, App = system.Name, ServiceProvider = service.Name, + ServiceProviderCode = service.Code, + OrderType = trackPull.OrderType, CreateTime = trackPull.CreateTime }) .ToPagedListAsync(input.PageIndex, input.PageSize); @@ -216,11 +219,12 @@ public class TrackPullConfigRepository : BasicRepository, return await Context.Queryable().Where(whereExpression).AnyAsync(); } - public async Task FindIdAsync(string appKey, string serviceProviderCode) + public async Task FindIdAsync(string appKey, string serviceProviderCode, TrackOrderType orderType) { return await AsQueryable() .Where(trackPull => trackPull.AppKey == appKey - && trackPull.ServiceProviderCode == serviceProviderCode) + && trackPull.ServiceProviderCode == serviceProviderCode + && trackPull.OrderType == orderType) .Select(trackPull => trackPull.Id) .FirstAsync(); }