change:抽离接口通参数配置到配置文件
This commit is contained in:
parent
ed9730ed55
commit
05573fd12d
@ -1,4 +1,5 @@
|
||||
using DotNetCore.CAP;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Newtonsoft.Json;
|
||||
using SJZY.Expand.ABP.Core.PublicMethords;
|
||||
using SJZY.InterfaceRelay.Application.Contracts;
|
||||
@ -6,6 +7,7 @@ using SJZY.Track.Application.Contract.Dtos.TrackPush;
|
||||
using SJZY.Track.Application.Contract.Events;
|
||||
using SJZY.Track.Application.Contract.Services;
|
||||
using SJZY.Track.Application.Helpers;
|
||||
using SJZY.Track.Application.Options;
|
||||
using SJZY.Track.Application.Track2InterfaceRelay;
|
||||
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
||||
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
||||
@ -19,6 +21,7 @@ namespace SJZY.Track.Application.CAP.EventHandlers;
|
||||
public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
||||
{
|
||||
private readonly IHttpClientProxy<IInterfaceForwardServiceV2> _httpClientProxy;
|
||||
private readonly IOptionsMonitor<InterfaceRelayParamsConfigOptions> _options;
|
||||
private readonly IOrderRepository _orderRepository;
|
||||
private readonly ITrackDetailsEsRepository _trackDetailsEsRepository;
|
||||
private readonly ITrackPushCacheService _trackPushCacheService;
|
||||
@ -28,13 +31,15 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
||||
|
||||
public TrackPushEventHandler(IHttpClientProxy<IInterfaceForwardServiceV2> httpClientProxy,
|
||||
IOrderRepository orderRepository, ITrackPushCacheService trackPushCacheService,
|
||||
ITrackDetailsEsRepository trackDetailsEsRepository, ITrackPushRecordEsRepository trackPushRecordEsRepository)
|
||||
ITrackDetailsEsRepository trackDetailsEsRepository, ITrackPushRecordEsRepository trackPushRecordEsRepository,
|
||||
IOptionsMonitor<InterfaceRelayParamsConfigOptions> options)
|
||||
{
|
||||
_httpClientProxy = httpClientProxy;
|
||||
_orderRepository = orderRepository;
|
||||
_trackPushCacheService = trackPushCacheService;
|
||||
_trackDetailsEsRepository = trackDetailsEsRepository;
|
||||
_trackPushRecordEsRepository = trackPushRecordEsRepository;
|
||||
_options = options;
|
||||
}
|
||||
|
||||
[CapSubscribe(GlobalConst.TrackPushSubscribe, Group = GlobalConst.TrackPushSubscribe)]
|
||||
@ -155,11 +160,11 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
||||
{
|
||||
var asciiString = Base64Helper.SerializeObject(OptionType.新增.ToString());
|
||||
var r = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync(
|
||||
InterfaceRelayConst.PushTrackInterfaceCode,
|
||||
_options.CurrentValue.PushTrackInterfaceCode,
|
||||
_pushConfigs.First().ServiceProviderCode, items, GlobalConst.TrackPushCompletedSubscribe,
|
||||
attach: asciiString);
|
||||
|
||||
if (r.Code != InterfaceRelayConst.SuccessCode)
|
||||
if (r.Code != GlobalConst.SuccessCode)
|
||||
{
|
||||
throw new BusinessException(message: $"requestId: {r.RequestId}; {r.Msg}");
|
||||
}
|
||||
@ -199,11 +204,11 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
||||
{
|
||||
var asciiString = Base64Helper.SerializeObject(OptionType.修改.ToString());
|
||||
var r = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync(
|
||||
InterfaceRelayConst.TrackUpdateInterfaceCode,
|
||||
_options.CurrentValue.TrackUpdateInterfaceCode,
|
||||
_pushConfigs.First().ServiceProviderCode, items, GlobalConst.TrackPushCompletedSubscribe,
|
||||
attach: asciiString);
|
||||
|
||||
if (r.Code != InterfaceRelayConst.SuccessCode)
|
||||
if (r.Code != GlobalConst.SuccessCode)
|
||||
{
|
||||
throw new BusinessException(message: $"requestId: {r.RequestId}; {r.Msg}");
|
||||
}
|
||||
|
||||
@ -1,9 +0,0 @@
|
||||
using SJZY.Expand.ABP.Core;
|
||||
|
||||
namespace SJZY.Track.Application.Options;
|
||||
|
||||
public class CustomeOptions : IOptionAutoInjection
|
||||
{
|
||||
public int Setting1 { get; set; }
|
||||
public int Setting2 { get; set; }
|
||||
}
|
||||
@ -0,0 +1,64 @@
|
||||
namespace SJZY.Track.Application.Options;
|
||||
|
||||
public class InterfaceRelayParamsConfigOptions
|
||||
{
|
||||
/// <summary>
|
||||
/// 订单路径
|
||||
/// </summary>
|
||||
public string OrderPath { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 单号参数名
|
||||
/// </summary>
|
||||
public string OrderNoName { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹明细路径
|
||||
/// </summary>
|
||||
public string TrackDetailsPath { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹代码参数名
|
||||
/// </summary>
|
||||
public string TrackContentCodeName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹状态参数名
|
||||
/// </summary>
|
||||
public string TrackStatusName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹内容参数名
|
||||
/// </summary>
|
||||
public string TrackContentName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹发生地参数名
|
||||
/// </summary>
|
||||
public string TrackPlaceName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹发生时间参数名
|
||||
/// </summary>
|
||||
public string TrackTimeName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹时区参数名
|
||||
/// </summary>
|
||||
public string TrackTimeZoneName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取轨迹接口代码
|
||||
/// </summary>
|
||||
public string GetTrackInterfaceCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 推送轨迹接口代码
|
||||
/// </summary>
|
||||
public string PushTrackInterfaceCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 更新轨迹接口代码
|
||||
/// </summary>
|
||||
public string TrackUpdateInterfaceCode { get; set; }
|
||||
}
|
||||
@ -24,7 +24,7 @@ namespace SJZY.Track.Application.Services.ForewarningServices;
|
||||
public class ForewarningNotifyService : IForewarningNotifyService, ITransientDependency
|
||||
{
|
||||
private readonly IForewarningCacheService _forewarningCacheService;
|
||||
private readonly IOptionsSnapshot<TrackAppOptions> _options;
|
||||
private readonly IOptionsSnapshot<TrackAppOptions> _options; // not hot path
|
||||
private readonly IHttpClientProxy<IRequestSendMessageService> _requestSendMessageService;
|
||||
private readonly IWarningQueries _warningQueries;
|
||||
private readonly IWarningRecordEsRepository _warningRecordEsRepository;
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.Extensions.Options;
|
||||
using SJZY.Expand.ABP.Core.Logger;
|
||||
using SJZY.Expand.ABP.Core.PublicMethords;
|
||||
using SJZY.InterfaceRelay.Application.Contracts;
|
||||
@ -6,6 +7,7 @@ using SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
||||
using SJZY.Track.Application.Contract.Dtos.TrackPull;
|
||||
using SJZY.Track.Application.Contract.Services.ProvideServices;
|
||||
using SJZY.Track.Application.Helpers;
|
||||
using SJZY.Track.Application.Options;
|
||||
using SJZY.Track.Application.Rabbit;
|
||||
using SJZY.Track.Application.Track2InterfaceRelay;
|
||||
using SJZY.Track.Domain.Queries;
|
||||
@ -21,14 +23,16 @@ namespace SJZY.Track.Application.Services.ProvideServices;
|
||||
public class TrackPullService : ApplicationService, ITrackPullService
|
||||
{
|
||||
private readonly IHttpClientProxy<IInterfaceForwardServiceV2> _httpClientProxy;
|
||||
private readonly IOptionsMonitor<InterfaceRelayParamsConfigOptions> _options;
|
||||
private readonly IProvideQueries _provideQueries;
|
||||
|
||||
|
||||
public TrackPullService(IProvideQueries provideQueries,
|
||||
IHttpClientProxy<IInterfaceForwardServiceV2> httpClientProxy)
|
||||
IHttpClientProxy<IInterfaceForwardServiceV2> httpClientProxy,
|
||||
IOptionsMonitor<InterfaceRelayParamsConfigOptions> options)
|
||||
{
|
||||
_provideQueries = provideQueries;
|
||||
_httpClientProxy = httpClientProxy;
|
||||
_options = options;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -74,11 +78,11 @@ public class TrackPullService : ApplicationService, ITrackPullService
|
||||
{
|
||||
// 批量获取轨迹
|
||||
var res = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync(
|
||||
InterfaceRelayConst.GetTrackInterfaceCode, serviceProviderCode, data,
|
||||
_options.CurrentValue.GetTrackInterfaceCode, serviceProviderCode, data,
|
||||
GlobalConst.TrackRefreshSubscribe,
|
||||
attach);
|
||||
|
||||
if (res.Code != InterfaceRelayConst.SuccessCode)
|
||||
if (res.Code != GlobalConst.SuccessCode)
|
||||
{
|
||||
LogHelper.Error($"刷新轨迹失败:{res.ToJson()}");
|
||||
}
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.Extensions.Options;
|
||||
using SJZY.Expand.ABP.Core;
|
||||
using SJZY.Expand.ABP.Core.Logger;
|
||||
using SJZY.Expand.ABP.Core.PublicMethords;
|
||||
@ -6,6 +7,7 @@ using SJZY.InterfaceRelay.Application.Contracts;
|
||||
using SJZY.Track.Application.Contract.Dtos.TrackPull;
|
||||
using SJZY.Track.Application.Contract.Services;
|
||||
using SJZY.Track.Application.Helpers;
|
||||
using SJZY.Track.Application.Options;
|
||||
using SJZY.Track.Application.Track2InterfaceRelay;
|
||||
using SJZY.Track.Domain.Dtos.TrackPull;
|
||||
using SJZY.Track.Domain.Queries;
|
||||
@ -61,7 +63,9 @@ public class TrackPullTask : ApplicationService, ISingletonDependency
|
||||
var provideQueries = serviceScope.ServiceProvider.GetRequiredService<IProvideQueries>();
|
||||
var httpClientProxy = serviceScope.ServiceProvider
|
||||
.GetRequiredService<IHttpClientProxy<IInterfaceForwardServiceV2>>();
|
||||
await DoRefreshAsync(config, provideQueries, httpClientProxy);
|
||||
var interfaceOptions = serviceScope.ServiceProvider
|
||||
.GetRequiredService<IOptions<InterfaceRelayParamsConfigOptions>>();
|
||||
await DoRefreshAsync(config, provideQueries, httpClientProxy, interfaceOptions.Value);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@ -72,7 +76,8 @@ public class TrackPullTask : ApplicationService, ISingletonDependency
|
||||
}
|
||||
|
||||
private static async Task DoRefreshAsync(TrackPullConfigVo config, IProvideQueries provideQueries,
|
||||
IHttpClientProxy<IInterfaceForwardServiceV2> httpClientProxy)
|
||||
IHttpClientProxy<IInterfaceForwardServiceV2> httpClientProxy,
|
||||
InterfaceRelayParamsConfigOptions interfaceOptionsValue)
|
||||
{
|
||||
using (Track2InterfaceRelaySubSystemContext.Use(
|
||||
new Track2InterfaceRelaySubSystemContext(config.SubSystemCode)))
|
||||
@ -93,10 +98,10 @@ public class TrackPullTask : ApplicationService, ISingletonDependency
|
||||
var attach = Base64Helper.SerializeObject(new TrackRefreshAttach(config.ServiceProviderCode,
|
||||
config.SubSystemId, group.Key));
|
||||
var res = await httpClientProxy.Service.BatchForwardThenPushToQueueAsync(
|
||||
InterfaceRelayConst.GetTrackInterfaceCode, serviceProviderCode, data,
|
||||
interfaceOptionsValue.GetTrackInterfaceCode, serviceProviderCode, data,
|
||||
GlobalConst.TrackRefreshSubscribe, attach);
|
||||
|
||||
if (res.Code != InterfaceRelayConst.SuccessCode)
|
||||
if (res.Code != GlobalConst.SuccessCode)
|
||||
{
|
||||
LogHelper.Error($"刷新轨迹失败:{res.ToJson()}");
|
||||
}
|
||||
|
||||
@ -1,11 +1,12 @@
|
||||
using System.Linq.Expressions;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Localization;
|
||||
using Microsoft.Extensions.Options;
|
||||
using SJZY.Expand.ABP.Core.Localization;
|
||||
using SJZY.Expand.ABP.Core.PublicMethords;
|
||||
using SJZY.Track.Application.Contract.Dtos.TrackPull;
|
||||
using SJZY.Track.Application.Contract.Services;
|
||||
using SJZY.Track.Application.Localization;
|
||||
using SJZY.Track.Application.Options;
|
||||
using SJZY.Track.Domain.Aggregates.TrackPullAggregate;
|
||||
using SJZY.Track.Domain.Dtos.Common;
|
||||
using SJZY.Track.Domain.Dtos.TrackPull;
|
||||
@ -20,6 +21,7 @@ namespace SJZY.Track.Application.Services.TrackPull;
|
||||
[Route("/Track/PullConfig")]
|
||||
public class TrackPullService : ApplicationService
|
||||
{
|
||||
private readonly IOptionsMonitor<InterfaceRelayParamsConfigOptions> _options;
|
||||
private readonly IStringLocalizer<TrackLocalizationResource> _stringLocalizer;
|
||||
private readonly ITrackPullCacheService _trackPullCacheService;
|
||||
private readonly ITrackPullConfigRepository _trackPullConfigRepository;
|
||||
@ -27,11 +29,12 @@ public class TrackPullService : ApplicationService
|
||||
public TrackPullService(
|
||||
IStringLocalizer<TrackLocalizationResource> stringLocalizer,
|
||||
ITrackPullConfigRepository trackPullConfigRepository,
|
||||
ITrackPullCacheService trackPullCacheService)
|
||||
ITrackPullCacheService trackPullCacheService, IOptionsMonitor<InterfaceRelayParamsConfigOptions> options)
|
||||
{
|
||||
_stringLocalizer = stringLocalizer;
|
||||
_trackPullConfigRepository = trackPullConfigRepository;
|
||||
_trackPullCacheService = trackPullCacheService;
|
||||
_options = options;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -83,11 +86,9 @@ public class TrackPullService : ApplicationService
|
||||
/// 轨迹拉取配置编辑
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <param name="configuration"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("Edit")]
|
||||
public async Task<bool> EditAsync([FromBody] EditTrackPullConfigInput input,
|
||||
[FromServices] IConfiguration configuration)
|
||||
public async Task<bool> EditAsync([FromBody] EditTrackPullConfigInput input)
|
||||
{
|
||||
if (input.PullInterval < 60) input.PullInterval = 60;
|
||||
|
||||
@ -109,23 +110,21 @@ public class TrackPullService : ApplicationService
|
||||
|
||||
if (input.ParseMethod == (int) ParseMethod.InterfaceRelay)
|
||||
{
|
||||
var paramsConfig = configuration.GetSection("InterfaceRelayParamsConfig")
|
||||
.Get<Dictionary<string, string>>();
|
||||
var paramsConfig = _options.CurrentValue;
|
||||
if (paramsConfig == null)
|
||||
{
|
||||
throw new BusinessException(message: "未找到接口通参数配置,联系管理员添加");
|
||||
}
|
||||
|
||||
trackPullEntity.OrderPath = paramsConfig[nameof(trackPullEntity.OrderPath)];
|
||||
trackPullEntity.OrderNoName = paramsConfig[nameof(trackPullEntity.OrderNoName)];
|
||||
trackPullEntity.TrackDetailsPath = paramsConfig[nameof(trackPullEntity.TrackDetailsPath)];
|
||||
trackPullEntity.TrackContentCodeName =
|
||||
paramsConfig[nameof(trackPullEntity.TrackContentCodeName)];
|
||||
trackPullEntity.TrackStatusName = paramsConfig[nameof(trackPullEntity.TrackStatusName)];
|
||||
trackPullEntity.TrackContentName = paramsConfig[nameof(trackPullEntity.TrackContentName)];
|
||||
trackPullEntity.TrackPlaceName = paramsConfig[nameof(trackPullEntity.TrackPlaceName)];
|
||||
trackPullEntity.TrackTimeName = paramsConfig[nameof(trackPullEntity.TrackTimeName)];
|
||||
trackPullEntity.TrackTimeZoneName = paramsConfig[nameof(trackPullEntity.TrackTimeZoneName)];
|
||||
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.TrackTimeName = paramsConfig.TrackTimeName;
|
||||
trackPullEntity.TrackTimeZoneName = paramsConfig.TrackTimeZoneName;
|
||||
}
|
||||
|
||||
var id = await _trackPullConfigRepository.InsertReturnIdentityAsync(trackPullEntity);
|
||||
@ -142,24 +141,21 @@ public class TrackPullService : ApplicationService
|
||||
ObjectMapper.Map(input, oldTrackPullEntity);
|
||||
if (input.ParseMethod == (int) ParseMethod.InterfaceRelay)
|
||||
{
|
||||
var paramsConfig = configuration.GetSection("InterfaceRelayParamsConfig")
|
||||
.Get<Dictionary<string, string>>();
|
||||
var paramsConfig = _options.CurrentValue;
|
||||
if (paramsConfig == null)
|
||||
{
|
||||
throw new BusinessException(message: "未找到接口通参数配置,联系管理员添加");
|
||||
}
|
||||
|
||||
oldTrackPullEntity.OrderPath = paramsConfig[nameof(oldTrackPullEntity.OrderPath)];
|
||||
oldTrackPullEntity.OrderNoName = paramsConfig[nameof(oldTrackPullEntity.OrderNoName)];
|
||||
oldTrackPullEntity.TrackDetailsPath = paramsConfig[nameof(oldTrackPullEntity.TrackDetailsPath)];
|
||||
oldTrackPullEntity.TrackContentCodeName =
|
||||
paramsConfig[nameof(oldTrackPullEntity.TrackContentCodeName)];
|
||||
oldTrackPullEntity.TrackStatusName = paramsConfig[nameof(oldTrackPullEntity.TrackStatusName)];
|
||||
oldTrackPullEntity.TrackContentName = paramsConfig[nameof(oldTrackPullEntity.TrackContentName)];
|
||||
oldTrackPullEntity.TrackPlaceName = paramsConfig[nameof(oldTrackPullEntity.TrackPlaceName)];
|
||||
oldTrackPullEntity.TrackTimeName = paramsConfig[nameof(oldTrackPullEntity.TrackTimeName)];
|
||||
oldTrackPullEntity.TrackTimeZoneName =
|
||||
paramsConfig[nameof(oldTrackPullEntity.TrackTimeZoneName)];
|
||||
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.TrackTimeName = paramsConfig.TrackTimeName;
|
||||
oldTrackPullEntity.TrackTimeZoneName = paramsConfig.TrackTimeZoneName;
|
||||
}
|
||||
|
||||
await _trackPullConfigRepository.UpdateAsync(oldTrackPullEntity);
|
||||
|
||||
@ -152,6 +152,8 @@ public class SjzyTrackApplicationModule : AbpModule
|
||||
}, typeof(SjzyTrackApplicationModule).Assembly);
|
||||
|
||||
context.Services.Configure<TrackAppOptions>(configuration.GetSection("TrackApp"));
|
||||
context.Services.Configure<InterfaceRelayParamsConfigOptions>(
|
||||
configuration.GetSection("InterfaceRelayParamsConfig"));
|
||||
}
|
||||
|
||||
public override void PreConfigureServices(ServiceConfigurationContext context)
|
||||
|
||||
@ -8,9 +8,9 @@ public class Track2InterfaceRelayHttpMessageHandler : DelegatingHandler, ITransi
|
||||
{
|
||||
private readonly Track2InterfaceRelayOptions _options;
|
||||
|
||||
public Track2InterfaceRelayHttpMessageHandler(IOptionsSnapshot<Track2InterfaceRelayOptions> options)
|
||||
public Track2InterfaceRelayHttpMessageHandler(IOptionsMonitor<Track2InterfaceRelayOptions> options)
|
||||
{
|
||||
_options = options.Value;
|
||||
_options = options.CurrentValue;
|
||||
}
|
||||
|
||||
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
|
||||
|
||||
@ -1,27 +0,0 @@
|
||||
namespace SJZY.Track.Domain.Consts;
|
||||
|
||||
/// <summary>
|
||||
/// 接口通常量
|
||||
/// </summary>
|
||||
public class InterfaceRelayConst
|
||||
{
|
||||
/// <summary>
|
||||
/// 接口通成功代码
|
||||
/// </summary>
|
||||
public const string SuccessCode = GlobalConst.SuccessCode;
|
||||
|
||||
/// <summary>
|
||||
/// 获取轨迹接口代码
|
||||
/// </summary>
|
||||
public const string GetTrackInterfaceCode = "TEST";
|
||||
|
||||
/// <summary>
|
||||
/// 推送轨迹接口代码
|
||||
/// </summary>
|
||||
public const string PushTrackInterfaceCode = "A024";
|
||||
|
||||
/// <summary>
|
||||
/// 更新轨迹接口代码
|
||||
/// </summary>
|
||||
public const string TrackUpdateInterfaceCode = "A040";
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user