feat:移除t_track_pull_config:11个有关itfx参数路径的字段(无需定义,必须走itfx映射)

This commit is contained in:
xiaolipro 2026-01-28 16:50:23 +08:00
parent ecfcf8b5fb
commit 36ff1c955c
8 changed files with 51 additions and 290 deletions

View File

@ -160,7 +160,6 @@
"TrackPlaceName": "location",
"TrackUtcTimeName": "timeUtc",
"TrackIsoTimeName": "timeIso",
"PodName": "pod",
"TrackTimeName": "time",
"TrackTimeZoneName": "timezone",
"TrackExtraNames": "extra",

View File

@ -4,66 +4,11 @@ namespace TrackCenter.Application.Dtos.TrackPull;
public class TrackPullParamConfigDto
{
/// <summary>
/// 单号参数名
/// </summary>
public string OrderNoName { get; set; } = null!;
/// <summary>
/// 轨迹代码参数名
/// </summary>
public string? TrackContentCodeName { get; set; }
/// <summary>
/// 轨迹内容参数名
/// </summary>
public string? TrackContentName { get; set; }
/// <summary>
/// 轨迹发生地参数名
/// </summary>
public string? TrackPlaceName { get; set; }
/// <summary>
/// 轨迹状态参数名
/// </summary>
public string? TrackStatusName { get; set; }
/// <summary>
/// 轨迹扩展信息参数名集合(逗号分割)
/// </summary>
public string? TrackExtraNames { get; set; }
/// <summary>
/// 轨迹UTC时间参数名
/// </summary>
public string? TrackUtcTimeName { get; set; }
/// <summary>
/// 轨迹发生ISO时间参数名
/// </summary>
public string? TrackIsoTimeName { get; set; }
/// <summary>
/// 轨迹发生时间参数名
/// </summary>
public string? TrackTimeName { get; set; }
/// <summary>
/// 轨迹时区参数名
/// </summary>
public string? TrackTimeZoneName { get; set; }
/// <summary>
/// 订单数组路径
/// </summary>
public string OrderPath { get; set; } = null!;
/// <summary>
/// 轨迹明细数组路径
/// </summary>
public string TrackDetailsPath { get; set; } = null!;
/// <summary>
/// 轨迹内容代码
/// </summary>

View File

@ -42,6 +42,16 @@ public class InterfaceRelayParamsConfigOptions
/// </summary>
public string TrackIsoTimeName { get; set; }
/// <summary>
/// 轨迹UTC时间参数名
/// </summary>
public string TrackUtcTimeName { get; set; }
/// <summary>
/// 轨迹扩展信息参数名集合(逗号分割)
/// </summary>
public string? TrackExtraNames { get; set; }
/// <summary>
/// 轨迹发生时间参数名
/// </summary>

View File

@ -4,12 +4,14 @@ using DotNetCore.CAP;
using Fake.UnitOfWork;
using InterfaceForward.Domain.Shared.Helpers;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RabbitMQ.Client.Events;
using TrackCenter.Application.Dtos.TrackPull;
using TrackCenter.Application.Events;
using TrackCenter.Application.Helpers;
using TrackCenter.Application.Options;
using TrackCenter.Application.Services.TrackPull;
using TrackCenter.Domain.Aggregates.OrderAggregate;
using TrackCenter.Domain.Aggregates.TrackDetailsAggregate;
@ -17,29 +19,18 @@ using TrackCenter.Domain.Aggregates.TrackDetailsAggregate;
namespace TrackCenter.Application.Rabbit;
[ExposeServices(typeof(IRabbitHandler))]
public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
public class TrackRefreshEventHandler(
IOrderRepository orderRepository,
ICapPublisher capPublisher,
TrackPullCacheService trackPullCacheService,
ITrackDetailsEsRepository trackDetailsEsRepository,
ILogger<TrackRefreshEventHandler> logger,
IOptionsMonitor<InterfaceRelayParamsConfigOptions> options)
: ITransientDependency, IRabbitHandler
{
private readonly ICapPublisher _capPublisher;
private readonly ILogger<TrackRefreshEventHandler> _logger;
private readonly IOrderRepository _orderRepository;
private readonly ITrackDetailsEsRepository _trackDetailsEsRepository;
private readonly TrackPullCacheService _trackPullCacheService;
public TrackRefreshEventHandler(IOrderRepository orderRepository,
ICapPublisher capPublisher, TrackPullCacheService trackPullCacheService,
ITrackDetailsEsRepository trackDetailsEsRepository,
ILogger<TrackRefreshEventHandler> logger)
public bool Enable(ConsumeOptions coptions)
{
_orderRepository = orderRepository;
_capPublisher = capPublisher;
_trackPullCacheService = trackPullCacheService;
_trackDetailsEsRepository = trackDetailsEsRepository;
_logger = logger;
}
public bool Enable(ConsumeOptions options)
{
return options.Queue.StartsWith(GlobalConst.TrackRefreshSubscribe);
return coptions.Queue.StartsWith(GlobalConst.TrackRefreshSubscribe);
}
[UnitOfWork]
@ -52,7 +43,7 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
var @event = System.Text.Json.JsonSerializer.Deserialize<InterfaceRelayForwardReplayEvent>(msg);
if (@event == null)
{
_logger.LogWarning(
logger.LogWarning(
$"rabbit on queue received msg can't convert to {nameof(InterfaceRelayForwardReplayEvent)}");
return;
}
@ -69,14 +60,14 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
{
if (!@event.IsSuccess)
{
_logger.LogWarning("请求id: {@RequestId},轨迹刷新失败", @event.RequestId);
logger.LogWarning("请求id: {@RequestId},轨迹刷新失败", @event.RequestId);
return;
}
var attach = Base64Helper.DeSerialize<TrackRefreshAttach>(@event.Attach);
if (attach is null || @event.Data.IsNullOrWhiteSpace())
{
_logger.LogWarning("请求id: {@RequestId},轨迹消费失败,attach或data解析为空", @event.RequestId);
logger.LogWarning("请求id: {@RequestId},轨迹消费失败,attach或data解析为空", @event.RequestId);
return;
}
@ -89,17 +80,17 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
// 客户A 渠道B 产品A
var config = await _trackPullCacheService.GetPullParamsWithContentAsync(attach.AppKey,
var config = await trackPullCacheService.GetPullParamsWithContentAsync(attach.AppKey,
attach.ServiceProviderCode);
if (config is null)
{
_logger.LogWarning("请求id: {@RequestId},轨迹消费失败,找不到拉取配置:{@Attach}", attach.ToJson(), @event.RequestId);
logger.LogWarning("请求id: {@RequestId},轨迹消费失败,找不到拉取配置:{@Attach}", attach.ToJson(), @event.RequestId);
return;
}
var data = JToken.Parse(@event.Data);
var orderToken = data.SelectToken(config.ParamConfig.OrderPath);
var orderToken = data.SelectToken(options.CurrentValue.OrderPath);
if (orderToken is JArray orderTokens)
{
foreach (var token in orderTokens)
@ -116,7 +107,7 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
private async Task HandleOrderAsync(JToken orderToken, TrackPullParamsWithContentDto paramsWithContent,
TrackRefreshAttach attach)
{
var paramConfig = paramsWithContent.ParamConfig;
var paramConfig = options.CurrentValue;
var orderNo = orderToken.SelectToken(paramConfig.OrderNoName)?.Value<string>();
if (orderNo.IsNullOrWhiteSpace()) return;
@ -125,10 +116,10 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
//回传单号可能是主单也可能是外部单号
//通过平台code和(外部单号/主单号)查询主单
var order = await _orderRepository.GetTrackOrderByProviderAndOrderNo(attach.ServiceProviderCode, orderNo!);
var order = await orderRepository.GetTrackOrderByProviderAndOrderNo(attach.ServiceProviderCode, orderNo!);
if (order == default)
{
_logger.LogError($"请求id: {attach.ToJson()},轨迹消费失败,找不到主单,平台code:{attach.ServiceProviderCode},单号:{orderNo}");
logger.LogError($"请求id: {attach.ToJson()},轨迹消费失败,找不到主单,平台code:{attach.ServiceProviderCode},单号:{orderNo}");
return;
}
@ -161,17 +152,17 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
{
var originTrackDataHash = StringHelper.GetHash(JsonConvert.SerializeObject(trackToken));
// 如果已经存在一模一样的报文了说明处理过了,直接return
if (await _trackDetailsEsRepository.AnyAsync(context.OrderId, originTrackDataHash))
if (await trackDetailsEsRepository.AnyAsync(context.OrderId, originTrackDataHash))
{
return;
}
var paramConfig = paramsWithContent.ParamConfig;
var paramConfig = options.CurrentValue;
var contentConfigs = paramsWithContent.ContentConfigs;
TrackPullContentConfigDto? matchedContentConfig = null;
// 轨迹内容
var trackContent = paramConfig.TrackContentName == null
var trackContent = paramConfig.TrackContentName.IsNullOrWhiteSpace()
? null
: trackToken.SelectToken(paramConfig.TrackContentName)?.Value<string>();
@ -180,7 +171,7 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
// 2、匹配轨迹状态
if (matchedContentConfig == null && !paramConfig.TrackStatusName.IsNullOrWhiteSpace())
{
var trackStatus = trackToken.SelectToken(paramConfig.TrackStatusName!)?.Value<string>();
var trackStatus = trackToken.SelectToken(paramConfig.TrackStatusName)?.Value<string>();
if (!trackStatus.IsNullOrWhiteSpace())
{
matchedContentConfig = contentConfigs.FirstOrDefault(x => x.TrackStatusValues.Contains(trackStatus!));
@ -224,23 +215,23 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
}
// 轨迹发生ISO时间
var trackIsoTime = paramConfig.TrackIsoTimeName == null
var trackIsoTime = paramConfig.TrackIsoTimeName.IsNullOrWhiteSpace()
? null
: trackToken.SelectToken(paramConfig.TrackIsoTimeName)?.Value<DateTimeOffset?>();
// 轨迹发生UTC时间
var trackUtcTime = paramConfig.TrackUtcTimeName == null
var trackUtcTime = string.IsNullOrWhiteSpace(paramConfig.TrackUtcTimeName)
? null
: trackToken.SelectToken(paramConfig.TrackUtcTimeName)?.Value<DateTime?>();
: trackToken.SelectToken(paramConfig.TrackUtcTimeName)?.ToObject<DateTime?>();
// 轨迹发生时间
var trackTime = trackIsoTime?.DateTime ?? (paramConfig.TrackTimeName == null
var trackTime = trackIsoTime?.DateTime ?? (paramConfig.TrackTimeName.IsNullOrWhiteSpace()
? null
: trackToken.SelectToken(paramConfig.TrackTimeName)?.Value<DateTime?>());
// 轨迹发生时区
var trackTimeZone = (float?) trackIsoTime?.Offset.TotalHours ?? (paramConfig.TrackTimeZoneName == null
var trackTimeZone = (float?) trackIsoTime?.Offset.TotalHours ?? (paramConfig.TrackTimeZoneName.IsNullOrWhiteSpace()
? null
: trackToken.SelectToken(paramConfig.TrackTimeZoneName)?.Value<float?>());
// 轨迹发生地
var trackPlace = paramConfig.TrackPlaceName == null
var trackPlace = paramConfig.TrackPlaceName.IsNullOrWhiteSpace()
? null
: trackToken.SelectToken(paramConfig.TrackPlaceName)?.Value<string?>();
// 轨迹扩展信息,根据输入的多个字段提取报文内容,构建一个新的对象的json形式
@ -253,7 +244,7 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
if (matchedContentConfig is null)
{
_logger.LogDebug("订单号:{OrderNo},未匹配到轨迹内容,轨迹报文:{TrackContent}",
logger.LogDebug("订单号:{OrderNo},未匹配到轨迹内容,轨迹报文:{TrackContent}",
context.OrderNo, trackToken.ToString());
await InsertNotMappedTrackAsync(trackToken, context, trackPlace, trackTime.Value, trackTimeZone.Value, trackContent, trackExtra);
return;
@ -289,23 +280,10 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
//服务商轨迹默认不对外
IsExternal = false,
Source = (int) TrackSourceEnum.ExternalServiceProvide,
Remarks = null,
Files = null,
Content = null,
EnStatus = null,
TrackPlaceCity = null,
TrackPlaceCityId = null,
TrackPlaceProvince = null,
TrackPlaceProvinceId = null,
TrackPlaceNation = null,
TrackPlaceNationId = null,
TrackPlacePostcode = null,
DestinationTimeZone = null,
EstimatedDeliveryDate = null,
Extra = trackExtra
};
await _capPublisher.PublishAsync(GlobalConst.TrackUpsertForRefreshSubscribe, trackUpsertEvent);
await capPublisher.PublishAsync(GlobalConst.TrackUpsertForRefreshSubscribe, trackUpsertEvent);
}
private async Task InsertNotMappedTrackAsync(JToken trackToken, TrackRefreshContext context, string? trackPlace,
@ -338,17 +316,6 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
//服务商轨迹默认不对外
IsExternal = false,
Source = (int) TrackSourceEnum.ExternalServiceProvide,
Remarks = null,
Files = null,
TrackPlaceCity = null,
TrackPlaceCityId = null,
TrackPlaceProvince = null,
TrackPlaceProvinceId = null,
TrackPlaceNation = null,
TrackPlaceNationId = null,
TrackPlacePostcode = null,
DestinationTimeZone = null,
EstimatedDeliveryDate = null,
Extra = extra
};
@ -356,7 +323,7 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
? track.TrackTime
: track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone));
await _trackDetailsEsRepository.AddAsync(track);
await trackDetailsEsRepository.AddAsync(track);
}
private static string? ExtraBuild(JToken jToken, string trackExtraNames)

View File

@ -1,13 +1,11 @@
using System.ComponentModel;
using System.Linq.Expressions;
using Fake.Application.Dtos;
using Microsoft.Extensions.Options;
using TrackCenter.Application.Dtos.TrackPull;
using TrackCenter.Domain.Aggregates.TrackPullAggregate;
using TrackCenter.Domain.Dtos.TrackPull;
using SqlSugar;
using TrackCenter.Application.Helpers;
using TrackCenter.Application.Options;
namespace TrackCenter.Application.Services.TrackPull;
@ -18,8 +16,7 @@ namespace TrackCenter.Application.Services.TrackPull;
[Route("/Track/PullConfig")]
public class TrackPullService(
ITrackPullConfigRepository trackPullConfigRepository,
TrackPullCacheService trackPullCacheService,
IOptionsMonitor<InterfaceRelayParamsConfigOptions> options)
TrackPullCacheService trackPullCacheService)
: ApplicationServiceBase
{
/// <summary>
@ -101,26 +98,6 @@ public class TrackPullService(
{
var trackPullEntity = ObjectMapper.Map<EditTrackPullConfigInput, TrackPullConfigEntity>(input);
if (input.ParseMethod == (int) ParseMethod.InterfaceRelay)
{
var paramsConfig = options.CurrentValue;
if (paramsConfig == null)
{
throw new BusinessException(message: "未找到接口通参数配置,联系管理员添加");
}
trackPullEntity.OrderPath = paramsConfig.OrderPath;
trackPullEntity.OrderNoName = paramsConfig.OrderNoName;
trackPullEntity.TrackDetailsPath = paramsConfig.TrackDetailsPath;
trackPullEntity.TrackContentCodeName = paramsConfig.TrackContentCodeName;
trackPullEntity.TrackStatusName = paramsConfig.TrackStatusName;
trackPullEntity.TrackContentName = paramsConfig.TrackContentName;
trackPullEntity.TrackPlaceName = paramsConfig.TrackPlaceName;
trackPullEntity.TrackIsoTimeName = paramsConfig.TrackIsoTimeName;
trackPullEntity.TrackTimeName = paramsConfig.TrackTimeName;
trackPullEntity.TrackTimeZoneName = paramsConfig.TrackTimeZoneName;
}
using (var ts = TransacationHelper.GetReadCommitted())
{
var id = await trackPullConfigRepository.InsertReturnIdentityAsync(trackPullEntity);
@ -148,25 +125,6 @@ public class TrackPullService(
throw new BusinessException("配置不存在");
ObjectMapper.Map(input, oldTrackPullEntity);
if (input.ParseMethod == (int) ParseMethod.InterfaceRelay)
{
var paramsConfig = options.CurrentValue;
if (paramsConfig == null)
{
throw new BusinessException(message: "未找到接口通参数配置,联系管理员添加");
}
oldTrackPullEntity.OrderPath = paramsConfig.OrderPath;
oldTrackPullEntity.OrderNoName = paramsConfig.OrderNoName;
oldTrackPullEntity.TrackDetailsPath = paramsConfig.TrackDetailsPath;
oldTrackPullEntity.TrackContentCodeName = paramsConfig.TrackContentCodeName;
oldTrackPullEntity.TrackStatusName = paramsConfig.TrackStatusName;
oldTrackPullEntity.TrackContentName = paramsConfig.TrackContentName;
oldTrackPullEntity.TrackPlaceName = paramsConfig.TrackPlaceName;
oldTrackPullEntity.TrackIsoTimeName = paramsConfig.TrackIsoTimeName;
oldTrackPullEntity.TrackTimeName = paramsConfig.TrackTimeName;
oldTrackPullEntity.TrackTimeZoneName = paramsConfig.TrackTimeZoneName;
}
await trackPullConfigRepository.UpdateAsync(oldTrackPullEntity);

View File

@ -20,72 +20,6 @@ public class TrackPullConfigEntity : FullAuditedAggregateRoot<int, int>
[SugarColumn(ColumnName = "ServiceProviderCode")]
public string ServiceProviderCode { get; set; }
/// <summary>
/// 解析方式,1取接口通返参映射后的,2取服务商原返参
/// </summary>
[SugarColumn(ColumnName = "ParseMethod")]
public ParseMethod ParseMethod { get; set; }
/// <summary>
/// 订单路径
/// </summary>
[SugarColumn(ColumnName = "OrderPath")]
public string OrderPath { get; set; } = null!;
/// <summary>
/// 单号参数名
/// </summary>
[SugarColumn(ColumnName = "OrderNoName")]
public string OrderNoName { get; set; } = null!;
/// <summary>
/// 轨迹明细路径
/// </summary>
[SugarColumn(ColumnName = "TrackDetailsPath")]
public string TrackDetailsPath { get; set; } = null!;
/// <summary>
/// 轨迹状态参数名
/// </summary>
[SugarColumn(ColumnName = "TrackStatusName")]
public string? TrackStatusName { get; set; }
/// <summary>
/// 轨迹代码参数名
/// </summary>
[SugarColumn(ColumnName = "TrackContentCodeName")]
public string? TrackContentCodeName { get; set; }
/// <summary>
/// 轨迹内容参数名
/// </summary>
[SugarColumn(ColumnName = "TrackContentName")]
public string? TrackContentName { get; set; }
/// <summary>
/// 轨迹发生地参数名
/// </summary>
[SugarColumn(ColumnName = "TrackPlaceName")]
public string? TrackPlaceName { get; set; }
/// <summary>
/// 轨迹发生ISO时间参数名
/// </summary>
[SugarColumn(ColumnName = "TrackIsoTimeName")]
public string? TrackIsoTimeName { get; set; }
/// <summary>
/// 轨迹发生时间参数名
/// </summary>
[SugarColumn(ColumnName = "TrackTimeName")]
public string? TrackTimeName { get; set; }
/// <summary>
/// 轨迹时区参数名
/// </summary>
[SugarColumn(ColumnName = "TrackTimeZoneName")]
public string? TrackTimeZoneName { get; set; }
/// <summary>
/// 开始轨迹code
/// </summary>
@ -109,4 +43,10 @@ public class TrackPullConfigEntity : FullAuditedAggregateRoot<int, int>
/// </summary>
[SugarColumn(ColumnName = "SilenceAfterEnd")]
public int SilenceAfterEnd { get; set; }
/// <summary>
/// 轨迹扩展信息参数名集合(逗号分割)
/// </summary>
[SugarColumn(ColumnName = "TrackExtraNames")]
public string? TrackExtraNames { get; set; }
}

View File

@ -6,16 +6,6 @@ public class GetTrackPullConfigDetailOutputVO
{
public int Id { get; set; }
/// <summary>
/// 拉取轨迹订单号
/// </summary>
public string OrderNoName { get; set; }
/// <summary>
/// 返参解析对象
/// </summary>
public int ParseMethod { get; set; }
/// <summary>
/// 服务商id
/// </summary>
@ -41,51 +31,6 @@ public class GetTrackPullConfigDetailOutputVO
/// </summary>
public string? TrackExtraNames { get; set; }
/// <summary>
/// 轨迹发生ISO时间参数名
/// </summary>
public string? TrackIsoTimeName { get; set; }
/// <summary>
/// 拉取轨迹发生时间
/// </summary>
public string TrackTimeName { get; set; }
/// <summary>
/// 拉取轨迹时区
/// </summary>
public string TrackTimeZoneName { get; set; }
/// <summary>
/// 拉取轨迹内容代码
/// </summary>
public string TrackContentCodeName { get; set; }
/// <summary>
/// 拉取轨迹内容
/// </summary>
public string TrackContentName { get; set; }
/// <summary>
/// 拉取轨迹发生地
/// </summary>
public string TrackPlaceName { get; set; }
/// <summary>
/// 拉取轨迹状态
/// </summary>
public string TrackStatusName { get; set; }
/// <summary>
/// 订单路径
/// </summary>
public string OrderPath { get; set; }
/// <summary>
/// 轨迹明细路径
/// </summary>
public string TrackDetailsPath { get; set; }
/// <summary>
/// 开始轨迹code
/// </summary>

View File

@ -91,9 +91,6 @@ public class TrackPullConfigRepository : BasicRepository<TrackPullConfigEntity>,
AppKey = system.AppKey,
ServiceProviderId = service.Id,
ServiceProviderCode = service.Code,
OrderNoName = trackPull.OrderNoName,
ParseMethod = (int)trackPull.ParseMethod,
TrackIsoTimeName = trackPull.TrackIsoTimeName,
}, true)
.FirstAsync();
}