解决客户

This commit is contained in:
xiaolipro 2025-08-05 10:41:46 +08:00
parent be1a18dfcb
commit 310988d583
110 changed files with 399 additions and 706 deletions

View File

@ -1,4 +1,3 @@
using System.Collections.Immutable;
using DotNetCore.CAP;
using InterfaceForward.Domain.Shared.Helpers;
using TrackCenter.Application.Dtos.ProvideServices;
@ -9,7 +8,6 @@ using TrackCenter.Application.Services.Broadcasting;
using TrackCenter.Application.Services.Warning.Signals;
using TrackCenter.Domain.Aggregates.OrderAggregate;
using TrackCenter.Domain.Aggregates.TrackDetailsAggregate;
using TrackCenter.Domain.Enums;
using TrackCenter.Repository.Aggregates.OrderAggregate;
namespace TrackCenter.Application.CAP.EventHandlers;

View File

@ -14,7 +14,6 @@ using TrackCenter.Application.Track2InterfaceRelay;
using TrackCenter.Domain.Aggregates.OrderAggregate;
using TrackCenter.Domain.Aggregates.TrackDetailsAggregate;
using TrackCenter.Domain.Aggregates.TrackPushAggregate;
using TrackCenter.Domain.Enums;
using TrackCenter.Repository.Otel;
namespace TrackCenter.Application.CAP.EventHandlers;
@ -30,7 +29,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
private readonly BroadcastingService _broadcastingService;
private List<OrderEntity> _orders = null!;
private List<TrackPushContentConfigDto> _pushConfigs = null!;
private Dictionary<int, List<TrackPushContentConfigDto>> _orderTypeSortedConfigsDict = null!; //订单类型,根据sort从小到大排序后的配置字典
private Dictionary<TrackOrderType, List<TrackPushContentConfigDto>> _orderTypeSortedConfigsDict = null!; //订单类型,根据sort从小到大排序后的配置字典
public TrackPushEventHandler(
IOrderRepository orderRepository,
@ -55,11 +54,11 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
public async Task ConsumerAsync(TrackPushEvent @event)
{
// 应用+客户id找推送映射配置
var pushConfigs = await _trackPushCacheService.GetPushContentConfigsAsync(@event.AppKey, @event.CustomId);
var pushConfigs = await _trackPushCacheService.GetPushContentConfigsAsync(@event.AppKey, @event.Customer);
if (pushConfigs == null || pushConfigs.Count == 0) return;
if (pushConfigs.First().ServiceProviderCode.IsNullOrWhiteSpace())
{
throw new BusinessException(GlobalConst.CapNoRetryErrorCode, $"该客户{@event.CustomId}未关联服务商,无法推送");
throw new BusinessException(GlobalConst.CapNoRetryErrorCode, $"该客户{@event.Customer}未关联服务商,无法推送");
}
_pushConfigs = pushConfigs;
@ -154,7 +153,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
// tips:不同订单类型可能会有不同的顺序
if (!_orderTypeSortedConfigsDict.TryGetValue(order.OrderType, out var sortedConfigs))
{
TrackPushFailedPublicTopic($"应用:[{@event.AppKey}],客户id:[{@event.CustomId}],没有订单类型[{order.OrderType}]的推送映射配置", @event, order);
TrackPushFailedPublicTopic($"应用:[{@event.AppKey}],客户:[{@event.Customer}],没有订单类型[{order.OrderType}]的推送映射配置", @event, order);
continue;
}
@ -221,7 +220,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
// tips:不同订单类型可能会有不同的顺序
if (!_orderTypeSortedConfigsDict.TryGetValue(order.OrderType, out var sortedConfigs))
{
TrackPushFailedPublicTopic($"应用:[{@event.AppKey}],客户id:[{@event.CustomId}],没有订单类型[{order.OrderType}]的推送映射配置", @event, order);
TrackPushFailedPublicTopic($"应用:[{@event.AppKey}],客户:[{@event.Customer}],没有订单类型[{order.OrderType}]的推送映射配置", @event, order);
continue;
}
@ -229,13 +228,13 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
var config = sortedConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode);
if (config == null)
{
TrackPushFailedPublicTopic($"应用:[{@event.AppKey}],客户id:[{@event.CustomId}],没有订单类型[{order.OrderType}]的推送映射配置," +
TrackPushFailedPublicTopic($"应用:[{@event.AppKey}],客户:[{@event.Customer}],没有订单类型[{order.OrderType}]的推送映射配置," +
$"没有在推送映射配置中找到关于轨迹代码[{@event.TrackCode}]的配置", @event, order);
return;
}
// 系统不推异常单,只能人工操作
if (order.QuestionType == (int) TrackProblemType.Error)
if (order.QuestionType == TrackProblemType.Error)
{
TrackPushFailedPublicTopic("系统不推异常单,只能人工操作", @event, order);
continue;
@ -306,7 +305,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
// tips:不同订单类型可能会有不同的顺序
if (!_orderTypeSortedConfigsDict.TryGetValue(order.OrderType, out var sortedConfigs))
{
TrackPushFailedPublicTopic($"应用:[{@event.AppKey}],客户id:[{@event.CustomId}],没有订单类型[{order.OrderType}]的推送映射配置", @event, order);
TrackPushFailedPublicTopic($"应用:[{@event.AppKey}],客户:[{@event.Customer}],没有订单类型[{order.OrderType}]的推送映射配置", @event, order);
continue;
}

View File

@ -9,7 +9,6 @@ using TrackCenter.Application.Services.Warning.Signals;
using TrackCenter.Domain.Aggregates.OrderAggregate;
using TrackCenter.Domain.Aggregates.TrackDetailsAggregate;
using TrackCenter.Domain.Dtos.TrackContents;
using TrackCenter.Domain.Enums;
using TrackCenter.Repository.Aggregates.OrderAggregate;
using TrackCenter.Repository.Otel;
using OrderIdentifier = TrackCenter.Application.Events.OrderIdentifier;
@ -71,13 +70,13 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
.GroupBy(x => new
{
x.AppKey,
x.CustomId // 这里按客户分组是为了后续的推送方便
x.Customer // 这里按客户分组是为了后续的推送方便
}))
{
var nextEvent = @event.DeepCopy();
nextEvent.Visited.AddRange(canNextOrderIds);
nextEvent.AppKey = group.Key.AppKey;
nextEvent.CustomId = group.Key.CustomId;
nextEvent.Customer = group.Key.Customer;
nextEvent.TrackRefreshData = new TrackRefreshStruct
{
ServiceProviderCode = @event.TrackRefreshData.ServiceProviderCode,
@ -238,7 +237,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
{
OptionType = @event.IsAdd ? OptionType.新增 : OptionType.修改,
AppKey = @event.AppKey,
CustomId = @event.CustomId,
Customer = @event.Customer,
OrderIdTrackMetadataDict = orderIdTrackMetadataDict,
TrackCode = @event.TrackCode,
SystemPushInfo = new SystemPushStruct
@ -574,7 +573,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
TrackCode = @event.TrackCode,
OperationMan = @event.OperationMan,
OrderIdentifiers = @event.OrderIdentifiers,
CustomId = @event.CustomId,
Customer = @event.Customer,
AppKey = @event.AppKey,
Extra = @event.NewExtra ?? @event.Extra
};

View File

@ -6,12 +6,12 @@ public class RuleAreaBaseInfo
{
}
public RuleAreaBaseInfo(string appKey, int customerId)
public RuleAreaBaseInfo(string appKey, string customer)
{
AppKey = appKey;
CustomerId = customerId;
Customer = customer;
}
public string AppKey { get; set; }
public int CustomerId { get; set; }
public string Customer { get; set; }
}

View File

@ -20,7 +20,7 @@ public class TrackOrderDetailDto
/// <summary>
/// 订单类型(主数据枚举TrackOrderType)
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 订单号

View File

@ -28,9 +28,9 @@ public class GetPageTrackOrderInput : PageInfoInput
public int? TrackOrderType { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int? CustomerId { get; set; }
public string? Customer { get; set; }
///// <summary>
///// 当tab选中 0 默认不传 1 直接写死传值 [1,4] 2 传 [2,4]
@ -61,7 +61,7 @@ public class TrackOrderDto
/// <summary>
/// 订单类型id
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 订单名称
@ -84,9 +84,9 @@ public class TrackOrderDto
public string? CustomerCode { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int CustomerId { get; set; }
public string Customer { get; set; }
/// <summary>
/// 订单明细(json)

View File

@ -8,9 +8,9 @@ public class GetPageTrackTemplateListInput : PageInfoInput
public string AppKey { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int? CustomerId { get; set; }
public string? Customer { get; set; }
/// <summary>
/// 模版分类

View File

@ -8,9 +8,9 @@ public class GetTrackTemplateListInput
public string AppKey { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int? CustomerId { get; set; }
public string? Customer { get; set; }
/// <summary>
/// 模版分类

View File

@ -21,7 +21,7 @@ public class LinkOrderInput
/// 订单类型,必填
/// </summary>
[Required]
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 订单号,必填
@ -40,7 +40,7 @@ public class LinkOrderInput
/// 关联单类型
/// </summary>
[Required]
public int LinkOrderType { get; set; }
public TrackOrderType LinkOrderType { get; set; }
/// <summary>
/// 关联的单号

View File

@ -19,7 +19,7 @@ public class OrderNoInfo
/// </summary>
[Required]
[Range(1, int.MaxValue)]
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 订单号,必填
@ -43,7 +43,7 @@ public class OrderNosInfo
/// </summary>
[Required]
[Range(1, int.MaxValue)]
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 订单号

View File

@ -11,9 +11,9 @@ public class QueryTrackPullMappingsInput
public int AppsId { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int CustomerId { get; set; }
public string Customer { get; set; }
}
/// <summary>
@ -29,7 +29,7 @@ public class QueryTrackPullMappingsInfo
/// <summary>
/// 订单类型
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 服务商轨迹代码

View File

@ -5,9 +5,9 @@ namespace TrackCenter.Application.Dtos.ProvideServices;
public class UpsertOrderInput : UpdateOrderInput
{
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int CustomId { get; set; }
public string Customer { get; set; }
/// <summary>
/// 当前操作人

View File

@ -15,7 +15,7 @@ public class GetContentDetailInput
/// <summary>
/// 订单类型
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 轨迹code

View File

@ -25,7 +25,7 @@ public class GetContentDetailOutput
/// <summary>
/// 订单类型(主数据枚举TrackOrderType)
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 轨迹状态

View File

@ -2,10 +2,10 @@ namespace TrackCenter.Application.Dtos.TrackPull;
public class TrackRefreshAttach
{
public TrackRefreshAttach(string serviceProviderCode, string AppKey, int orderType)
public TrackRefreshAttach(string serviceProviderCode, string appKey, TrackOrderType orderType)
{
ServiceProviderCode = serviceProviderCode;
AppKey = AppKey;
AppKey = appKey;
OrderType = orderType;
}
@ -17,7 +17,7 @@ public class TrackRefreshAttach
/// <summary>
/// 订单类型(主数据枚举TrackOrderType)
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 应用

View File

@ -10,7 +10,7 @@ public class TrackRefreshContext
/// <summary>
/// 订单类型
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 订单号
@ -23,9 +23,9 @@ public class TrackRefreshContext
public string ServiceProviderCode { get; set; } = null!;
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int CustomId { get; set; }
public string Customer { get; set; }
/// <summary>
/// 应用

View File

@ -3,9 +3,9 @@ namespace TrackCenter.Application.Dtos.TrackPush;
public class EditTrackPushConfigInput
{
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int? CustomId { get; set; }
public string Customer { get; set; }
public int? Id { get; set; }
@ -24,11 +24,6 @@ public class EditTrackPushConfigInput
/// </summary>
public string? ServiceProviderCode { get; set; }
/// <summary>
/// 应用
/// </summary>
public int? AppKey { get; set; }
/// <summary>
/// 是否支持更新
/// </summary>

View File

@ -17,7 +17,7 @@ public class EditTrackPushContentInput
/// <summary>
/// 推送单号类型
/// </summary>
public int OrderNoType { get; set; }
public TrackOrderType OrderNoType { get; set; }
/// <summary>
/// 推送轨迹排序

View File

@ -12,7 +12,7 @@ public class QueryPushRecordInput
/// <summary> 订单类型 </summary>
[Required]
[Range(1, int.MaxValue)]
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary> 订单号集合 </summary>
[Required]

View File

@ -40,7 +40,7 @@ public class TrackPushContentConfigDto
/// <summary>
/// 推送单号类型(主数据枚举TrackOrderType)
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 推送顺序

View File

@ -12,7 +12,7 @@ public class TrackPushContentDto
/// <summary>
/// 推送单号类型
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 服务商轨迹代码

View File

@ -108,7 +108,7 @@ public class EditTrackTemplateInput
public int CategoryId { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int CustomerId { get; set; }
public string Customer { get; set; }
}

View File

@ -25,7 +25,7 @@ public class CompleteWarningDetailsDto
/// <summary>
/// 订单类型
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 订单类型名称
@ -49,14 +49,9 @@ public class CompleteWarningDetailsDto
public int Status { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int CustomId { get; set; }
/// <summary>
/// 客户简称
/// </summary>
public string CustomName { get; set; }
public string Customer { get; set; }
/// <summary>
/// 缺失轨迹状态 e.g [ {1:"状态1",2:"状态2"} , {3:"状态3",4:"状态4"} ]

View File

@ -51,7 +51,7 @@ public class OrderTypeDto
/// <summary>
/// 订单类型
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 订单类型名称

View File

@ -30,9 +30,9 @@ public class GetPageCompleteWarningDetailsInput : PageInfoInput
public int? Status { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int? CustomId { get; set; }
public string Customer { get; set; }
/// <summary>
/// 缺失轨迹状态id

View File

@ -16,9 +16,9 @@ public class GetWarningRuleInput
public string? KpiName { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int? CustomId { get; set; }
public string Customer { get; set; }
/// <summary>
/// 是否启用(留null查全部)

View File

@ -30,9 +30,9 @@ public class GetPageReturnWarningDetailsInput : PageInfoInput
public int? Status { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int? CustomId { get; set; }
public string Customer { get; set; }
/// <summary>
/// 轨迹状态id

View File

@ -23,7 +23,7 @@ public sealed class ReturnWarningDetailsDto
/// <summary>
/// 订单类型
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 订单类型名称
@ -46,14 +46,9 @@ public sealed class ReturnWarningDetailsDto
public int Status { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int CustomId { get; set; }
/// <summary>
/// 客户简称
/// </summary>
public string CustomName { get; set; }
public string Customer { get; set; }
/// <summary>
/// 轨迹状态

View File

@ -29,9 +29,9 @@ public class GetPageTransportWarningDetailsInput : PageInfoInput
public int? Status { get; set; }
/// <summary>
/// 客户Id
/// 客户
/// </summary>
public int? CustomId { get; set; }
public string Customer { get; set; }
/// <summary>
/// 预警名称

View File

@ -21,14 +21,9 @@ public sealed class TransportWarningDetailsDto
public string AppName { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int CustomId { get; set; }
/// <summary>
/// 客户简称
/// </summary>
public string CustomName { get; set; }
public string Customer { get; set; }
/// <summary>
/// 订单id
@ -43,7 +38,7 @@ public sealed class TransportWarningDetailsDto
/// <summary>
/// 订单类型
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 订单类型名称

View File

@ -20,10 +20,10 @@ public class UpsertWarningRuleInput
public string AppKey { get; set; } //应用
/// <summary>
/// 客户id
/// 客户
/// </summary>
[IdRequired]
public int CustomId { get; set; } //客户id
public string Customer { get; set; } //客户
/// <summary>
/// 预警规则名称

View File

@ -21,14 +21,9 @@ public sealed class WarningRuleDto
public string AppName { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int CustomId { get; set; } //客户id
/// <summary>
/// 客户简称
/// </summary>
public string CustomName { get; set; }
public string Customer { get; set; }
/// <summary>
/// 预警规则名称

View File

@ -15,5 +15,5 @@ public struct OrderIdentifier
/// <summary>
/// 订单类型
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
}

View File

@ -35,9 +35,9 @@ public class TrackChangeEto
public string OrderNo { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int CustomId { get; set; }
public string Customer { get; set; }
/// <summary>
/// 订单id

View File

@ -17,9 +17,9 @@ public class TrackPushEvent
public string AppKey { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int CustomId { get; set; }
public string Customer { get; set; }
// /// <summary>
// /// 订单id

View File

@ -10,9 +10,9 @@ public class TrackUpsertEvent
public string AppKey { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int CustomId { get; set; }
public string Customer { get; set; }
/// <summary>
/// 订单id

View File

@ -5,5 +5,6 @@ global using Microsoft.AspNetCore.Mvc;
global using Microsoft.Extensions.DependencyInjection;
global using TrackCenter.Domain;
global using TrackCenter.Domain.Dtos.Common;
global using TrackCenter.Domain.Enums;
global using TrackCenter.Domain.Extensions;
global using TrackCenter.Repository.Redis;

View File

@ -8,7 +8,6 @@ using TrackCenter.Domain.Aggregates.TrackDetailsAggregate;
using TrackCenter.Domain.Aggregates.WarningAggregate;
using TrackCenter.Domain.Dtos.Forewarning;
using TrackCenter.Domain.Dtos.Warning;
using TrackCenter.Domain.Enums;
namespace TrackCenter.Application.Hangfire;

View File

@ -5,7 +5,6 @@ using TrackCenter.Application.Dtos.TrackPush;
using TrackCenter.Domain.Aggregates.WarningAggregate;
using TrackCenter.Domain.Aggregates.WarningAggregate.Return;
using TrackCenter.Domain.Dtos.Warning;
using TrackCenter.Domain.Enums;
using TrackCenter.Application.Helpers;
using TrackCenter.Application.Options;
using TrackCenter.Application.Track2InterfaceRelay;

View File

@ -7,7 +7,6 @@ using TrackCenter.Application.Services.Broadcasting;
using TrackCenter.Application.Services.Warning.Handlers;
using TrackCenter.Domain.Aggregates.OrderAggregate;
using TrackCenter.Domain.Aggregates.TrackPushAggregate;
using TrackCenter.Domain.Enums;
namespace TrackCenter.Application.Rabbit;
@ -115,7 +114,7 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl
var orders = logs.Select(x => new OrderEntity
{
Id = x.OrderId,
QuestionType = (int) TrackProblemType.Error,
QuestionType = TrackProblemType.Error,
LatestPushError = x.Message
}).ToList();

View File

@ -12,7 +12,6 @@ using TrackCenter.Application.Helpers;
using TrackCenter.Application.Services.TrackPull;
using TrackCenter.Domain.Aggregates.OrderAggregate;
using TrackCenter.Domain.Aggregates.TrackDetailsAggregate;
using TrackCenter.Domain.Enums;
namespace TrackCenter.Application.Rabbit;
@ -128,7 +127,7 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
{
OrderId = order.MainOrderId,
OrderNo = order.OrderNo,
CustomId = order.CustomId,
Customer = order.Customer,
OrderType = attach.OrderType,
AppKey = attach.AppKey,
ServiceProviderCode = attach.ServiceProviderCode
@ -271,7 +270,7 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
OriginTrackContent = trackContent ?? GlobalConst.EmptyString,
},
AppKey = context.AppKey,
CustomId = context.CustomId,
Customer = context.Customer,
TrackCode = matchedContentConfig.TrackContentCode,
TrackPlace = trackPlace ?? GlobalConst.EmptyString,
TrackTime = trackTime.Value,

View File

@ -75,7 +75,7 @@ public partial class OrderService
x.OrderNo,
x.OrderType,
AppKey = x.AppKey,
x.CustomId
x.Customer
});
// 如果有不存在的单,需要抛异常
@ -97,7 +97,7 @@ public partial class OrderService
foreach (var group in existedOrders.GroupBy(x => new
{
x.AppKey,
x.CustomId
x.Customer
}))
{
foreach (var track in tracks)
@ -105,7 +105,7 @@ public partial class OrderService
var fillTrackEvent = new TrackUpsertEvent
{
AppKey = group.Key.AppKey,
CustomId = group.Key.CustomId,
Customer = group.Key.Customer,
OrderIdentifiers =
group.Select(x =>
new OrderIdentifier

View File

@ -8,7 +8,6 @@ using TrackCenter.Domain.Aggregates.TrackDetailsAggregate;
using TrackCenter.Domain.Aggregates.TrackPushAggregate;
using TrackCenter.Domain.Dtos.TrackPush;
using TrackCenter.Application.Helpers;
using TrackCenter.Application.Queries;
namespace TrackCenter.Application.Services.ProvideServices;
@ -54,7 +53,7 @@ public class TrackPushService : ApplicationServiceBase
&& input.OrderNos.Contains(x.OrderNo), x => new
{
x.Id,
x.CustomId
x.Customer
});
if (!orders.Any())
@ -115,7 +114,7 @@ public class TrackPushService : ApplicationServiceBase
{
OptionType = OptionType.新增,
AppKey = input.AppKey,
CustomId = order.CustomId,
Customer = order.Customer,
OrderIdTrackMetadataDict = new Dictionary<int, TrackMetadata>
{
[order.Id] = TrackMetadata.Build(track.Id, track.Version, track.CreateTime)
@ -148,12 +147,12 @@ public class TrackPushService : ApplicationServiceBase
/// 获取轨迹推送内容
/// </summary>
/// <param name="AppKey"></param>
/// <param name="customerId"></param>
/// <param name="customer"></param>
/// <returns></returns>
[HttpGet("Track/GetTrackPushContentList")]
public async Task<List<TrackPushContentDto>> GetTrackPushContentListAsync(string AppKey, int customerId)
public async Task<List<TrackPushContentDto>> GetTrackPushContentListAsync(string AppKey, string customer)
{
var list = await _trackPushConfigRepository.GetTrackPushContentListAsync(AppKey, customerId);
var list = await _trackPushConfigRepository.GetTrackPushContentListAsync(AppKey, customer);
var result = ObjectMapper.Map<List<GetTrackPushContentListVo>, List<TrackPushContentDto>>(list);

View File

@ -5,7 +5,6 @@ using TrackCenter.Application.Events;
using TrackCenter.Domain.Aggregates.OrderAggregate;
using TrackCenter.Domain.Aggregates.TrackContentAggregate;
using TrackCenter.Domain.Aggregates.TrackDetailsAggregate;
using TrackCenter.Domain.Enums;
using TrackCenter.Application.Helpers;
using TrackCenter.Repository.Otel;
@ -226,7 +225,7 @@ public partial class TrackService : ApplicationServiceBase
{
x.Id,
x.OrderNo,
x.CustomId
x.Customer
});
if (order == null)
{
@ -256,7 +255,7 @@ public partial class TrackService : ApplicationServiceBase
input.TrackTimeZone ??= GlobalConst.NoneTrackTimeZone; //时区为空使用一个特殊值填充
var @event = ObjectMapper.Map<UpsertTrackInput, TrackUpsertEvent>(input);
@event.AppKey = input.AppKey;
@event.CustomId = order.CustomId;
@event.Customer = order.Customer;
@event.OrderIdentifiers = new[]
{
new OrderIdentifier
@ -290,7 +289,7 @@ public partial class TrackService : ApplicationServiceBase
{
x.Id,
x.OrderNo,
x.CustomId
x.Customer
});
if (orders.Count == 0)
@ -323,12 +322,12 @@ public partial class TrackService : ApplicationServiceBase
input.CompareFields);
// 按客户新增/更新轨迹(为了推送轨迹时方便)
foreach (var group in orders.GroupBy(x => x.CustomId))
foreach (var group in orders.GroupBy(x => x.Customer))
{
var @event = new TrackUpsertEvent
{
AppKey = input.AppKey,
CustomId = group.Key,
Customer = group.Key,
OrderIdentifiers = group.Select(o => new OrderIdentifier
{
OrderId = o.Id,

View File

@ -6,7 +6,6 @@ using TrackCenter.Application.Dtos.TrackPull;
using TrackCenter.Application.Helpers;
using TrackCenter.Application.Options;
using TrackCenter.Domain.Aggregates.OrderAggregate;
using TrackCenter.Domain.Enums;
namespace TrackCenter.Application.Services.TimerTaskss;

View File

@ -11,8 +11,6 @@ using TrackCenter.Domain.Aggregates.TrackDetailsAggregate;
using TrackCenter.Domain.Aggregates.TrackFlagAggregate;
using TrackCenter.Domain.Aggregates.TrackStatusAggregate;
using TrackCenter.Domain.Dtos.TrackContents;
using TrackCenter.Domain.Enums;
using TrackCenter.Repository;
namespace TrackCenter.Application.Services.TrackContents;
@ -96,7 +94,7 @@ public class TrackContentService : ApplicationServiceBase
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("GetDetail")]
public async Task<GetTrackContentDetailDto> GetDetailAsync(int id)
public async Task<GetTrackContentDetailDto?> GetDetailAsync(int id)
{
var detailInfo = await _trackContentRepository.GetDetailAsync(id);
if (detailInfo == null) return null;
@ -288,7 +286,7 @@ public class TrackContentService : ApplicationServiceBase
//进行推送时,匹配订单类型一致的轨迹
if (input.TrackOptionType == TrackOptionType.推送)
{
var pushConfigs = await _trackPushCacheService.GetPushContentConfigsAsync(order.AppKey, order.CustomId);
var pushConfigs = await _trackPushCacheService.GetPushContentConfigsAsync(order.AppKey, order.Customer);
//没有推送配置也不会展示任何下拉
if (pushConfigs == null || pushConfigs.Count == 0) return res;
//选订单类型和配置订单类型一致的配置的轨迹代码

View File

@ -61,16 +61,6 @@ public class TrackOrderService : ApplicationServiceBase
#endregion
/// <summary>
/// 获取订单类型字典
/// </summary>
/// <returns></returns>
[HttpGet("GetOrderTypeDict")]
public async Task<Dictionary<string, string>> GetOrderTypeDict()
{
return await _orderRepository.GetTrackOrderTypeDictAsync();
}
/// <summary>
/// 更新订单状态
/// </summary>

View File

@ -1,12 +1,9 @@
using SJZY.Expand.ABP.Core;
using TrackCenter.Application.Dtos.TrackPush;
using TrackCenter.Application.Services;
using TrackCenter.Domain.Aggregates.TrackPushAggregate;
using Volo.Abp.DependencyInjection;
namespace TrackCenter.Application.Services.TrackPush;
public class TrackPushCacheService : ITrackPushCacheService, ITransientDependency
public class TrackPushCacheService : ITransientDependency
{
private readonly ITrackPushConfigRepository _trackPushConfigRepository;
@ -15,37 +12,37 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc
_trackPushConfigRepository = trackPushConfigRepository;
}
public async Task<List<TrackPushContentConfigDto>?> GetPushContentConfigsAsync(string AppKey, int customId)
public async Task<List<TrackPushContentConfigDto>?> GetPushContentConfigsAsync(string appKey, string customer)
{
var exists = await RedisHelper.Client.ExistsAsync(TrackPushContentKey(AppKey, customId));
var exists = await RedisHelper.Client.ExistsAsync(TrackPushContentKey(appKey, customer));
if (exists)
{
return await RedisHelper.Client.GetAsync<List<TrackPushContentConfigDto>>(
TrackPushContentKey(AppKey, customId));
TrackPushContentKey(appKey, customer));
}
return await SetPushContentConfigsAsync(AppKey, customId);
return await SetPushContentConfigsAsync(appKey, customer);
}
public async Task<List<TrackPushContentConfigDto>?> SetPushContentConfigsAsync(string appKey, int customId)
public async Task<List<TrackPushContentConfigDto>?> SetPushContentConfigsAsync(string appKey, string customer)
{
// maybe is null
var data = await DoGetPushContentConfigsAsync(appKey, customId);
var data = await DoGetPushContentConfigsAsync(appKey, customer);
var ttl = 3 * 24 * 60 * 60;
if (data == null) ttl = 5;
// ttl 3days
await RedisHelper.Client.SetAsync(TrackPushContentKey(appKey, customId),
await RedisHelper.Client.SetAsync(TrackPushContentKey(appKey, customer),
data, ttl);
return data;
}
private static string TrackPushContentKey(string appKey, int customId) =>
$"{GlobalConst.TrackPushContentKeyPrefix}:{appKey}:{customId}";
private static string TrackPushContentKey(string appKey, string customer) =>
$"{GlobalConst.TrackPushContentKeyPrefix}:{appKey}:{customer}";
private async Task<List<TrackPushContentConfigDto>?> DoGetPushContentConfigsAsync(string appKey, int customId)
private async Task<List<TrackPushContentConfigDto>?> DoGetPushContentConfigsAsync(string appKey, string customer)
{
var trackPushConfig = await _trackPushConfigRepository.GetFirstAsync(
x => x.AppKey == AppKey && x.CustomId == customId,
x => x.AppKey == appKey && x.Customer == customer,
x => new
{
x.Id,
@ -55,7 +52,7 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc
x.IsCanDelete,
x.IsCanUpdate,
AppKey = x.AppKey,
x.CustomId,
x.Customer,
x.DateTimeFormatType,
x.DateTimeFormat,
x.TimezoneFormat

View File

@ -1,18 +1,11 @@
using System.Linq.Expressions;
using Microsoft.Extensions.Localization;
using SJZY.Expand.ABP.Core.Localization;
using SJZY.Expand.ABP.Core.Logger;
using SJZY.Expand.ABP.Core.PublicMethords;
using Fake.Application.Dtos;
using InterfaceForward.Domain.Shared.Helpers;
using TrackCenter.Application.Dtos.TrackPush;
using TrackCenter.Application.Services;
using TrackCenter.Application.Helpers;
using TrackCenter.Application.Localization;
using TrackCenter.Application.Services.Warning.Handlers;
using TrackCenter.Domain.Aggregates.OrderAggregate;
using TrackCenter.Domain.Aggregates.TrackPushAggregate;
using TrackCenter.Domain.Dtos.TrackPush;
using TrackCenter.Domain.Enums;
using Volo.Abp.DependencyInjection;
namespace TrackCenter.Application.Services.TrackPush;
@ -23,22 +16,17 @@ namespace TrackCenter.Application.Services.TrackPush;
[Route("/Track/PushConfig")]
public class TrackPushService : ApplicationServiceBase, ISingletonDependency
{
private readonly IStringLocalizer<TrackLocalizationResource> _stringLocalizer;
private readonly ITrackPushCacheService _trackPushCacheService;
private readonly TrackPushCacheService _trackPushCacheService;
private readonly ITrackPushConfigRepository _trackPushConfigRepository;
private readonly IOrderRepository _orderRepository;
private readonly IServiceProvider _serviceProvider;
public TrackPushService(
IStringLocalizer<TrackLocalizationResource> stringLocalizer,
ITrackPushConfigRepository trackPushConfigRepository,
ITrackPushCacheService trackPushCacheService,
IOrderRepository orderRepository, IServiceProvider serviceProvider)
TrackPushCacheService trackPushCacheService,
IServiceProvider serviceProvider)
{
_stringLocalizer = stringLocalizer;
_trackPushConfigRepository = trackPushConfigRepository;
_trackPushCacheService = trackPushCacheService;
_orderRepository = orderRepository;
_serviceProvider = serviceProvider;
}
@ -53,26 +41,6 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
return await _trackPushConfigRepository.GetPageAsync(input);
}
/// <summary>
/// 获取推送配置类型标签卡列表
/// </summary>
/// <returns></returns>
[HttpPost("GetConfigTags")]
public async Task<List<TrackPushConfigTagDto>> GetConfigTags([FromBody] GetConfigTagsInputVO inputVo)
{
var orderTypes = await _trackPushConfigRepository.GetConfigTags(inputVo);
if (orderTypes.Count == 0) return new List<TrackPushConfigTagDto>();
var trackOrderTypes = await _orderRepository.GetTrackOrderTypeDictAsync();
return orderTypes.Select(x => new TrackPushConfigTagDto
{
Type = x,
Name = trackOrderTypes[x.ToString()]
})
.OrderBy(x => x.Type)
.ToList();
}
/// <summary>
/// 轨迹推送配置内容列表
/// </summary>
@ -117,12 +85,11 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
{
if (input.Options != OptionTypeNoNull.删除)
{
Expression<Func<TrackPushConfigEntity, bool>> isAnyExp = x =>
x.AppKey == input.AppKey && x.CustomId == input.CustomId;
Expression<Func<TrackPushConfigEntity, bool>> isAnyExp = x => x.Customer == input.Customer;
if (input.Options == OptionTypeNoNull.修改) isAnyExp = isAnyExp.And(x => x.Id != input.Id);
if (await _trackPushConfigRepository.IsAnyAsync(isAnyExp))
throw new BusinessException(message: _stringLocalizer["IsTrackPushConfigAny"]);
throw new BusinessException(message: "配置已存在");
}
var msg = string.Empty;
@ -133,7 +100,7 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
msg = message;
}
using var ts = TransacationHelper.Create();
using var ts = TransacationHelper.GetReadCommitted();
switch (input.Options)
{
@ -142,7 +109,7 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
await _trackPushConfigRepository.InsertReturnIdentityAsync(trackPushEntity);
await _trackPushCacheService.SetPushContentConfigsAsync(trackPushEntity.AppKey,
trackPushEntity.CustomId);
trackPushEntity.Customer);
break;
case OptionTypeNoNull.修改:
@ -152,7 +119,7 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
ObjectMapper.Map(input, oldTrackPushEntity);
await _trackPushConfigRepository.UpdateAsync(oldTrackPushEntity);
await _trackPushCacheService.SetPushContentConfigsAsync(oldTrackPushEntity.AppKey,
oldTrackPushEntity.CustomId);
oldTrackPushEntity.Customer);
break;
case OptionTypeNoNull.删除:
@ -161,30 +128,17 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
await _trackPushConfigRepository.SoftDeleteAsync(x => x.Id == input.Id);
await _trackPushConfigRepository.SoftDeleteContentAsync(x => x.TrackPushConfigId == input.Id);
await _trackPushCacheService.SetPushContentConfigsAsync(entity.AppKey, entity.CustomId);
await _trackPushCacheService.SetPushContentConfigsAsync(entity.AppKey, entity.Customer);
break;
default:
throw new BusinessException(message: _stringLocalizer[SjzyBasicLocalization.Validation_IsInEnum,
nameof(EditTrackPushConfigInput.Options)]);
throw new ArgumentOutOfRangeException();
}
ts.Complete();
return msg;
}
/// <summary>
/// 获取服务商code根据客户id
/// </summary>
/// <param name="customerId"></param>
/// <returns></returns>
[HttpGet("GetServiceCodeByCustomerId")]
public async Task<string?> GetServiceCodeByCustomerId(int customerId)
{
return await _trackPushConfigRepository.GetServiceCodeByCustomerIdAsync(customerId);
}
/// <summary>
/// 轨迹推送配置内容编辑
/// </summary>
@ -202,28 +156,28 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
if (await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x =>
x.TrackContentId == input.TrackContentId)))
throw new BusinessException(message: _stringLocalizer["IsTrackPushContentAny"]);
throw new BusinessException(message: "TrackContentId配置已存在");
if (!input.TrackContentCodeValue.IsNullOrWhiteSpace() &&
await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x =>
x.TrackContentCodeValue == input.TrackContentCodeValue)))
throw new BusinessException(message: _stringLocalizer["IsTrackPushContentCodeValueAny"]);
throw new BusinessException(message: "TrackContentCodeValue配置已存在");
if (!input.TrackStatusValue.IsNullOrWhiteSpace() &&
await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x =>
x.TrackStatusValue == input.TrackStatusValue)))
throw new BusinessException(message: _stringLocalizer["IsTrackPushContentStatusValueAny"]);
throw new BusinessException(message: "TrackStatusValue配置已存在");
if (!input.TrackContentValue.IsNullOrWhiteSpace() &&
await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x =>
x.TrackContentValue == input.TrackContentValue)))
throw new BusinessException(message: _stringLocalizer["IsTrackPushContentValueAny"]);
throw new BusinessException(message: "TrackContentValue配置已存在");
if (!input.TrackEnContentValue.IsNullOrWhiteSpace() &&
await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x =>
x.TrackEnContentValue == input.TrackEnContentValue)))
throw new BusinessException(message: _stringLocalizer["IsTrackPushEnContentValueAny"]);
throw new BusinessException(message: "TrackEnContentValue配置已存在");
}
var trackPushConfigId = input.TrackPushConfigId;
using var ts = TransacationHelper.Create();
using var ts = TransacationHelper.GetReadCommitted();
TrackPushContentConfigEntity? oldContentConfig = null;
TrackPushContentConfigEntity? postContentConfig = null;
@ -269,14 +223,13 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
}
default:
throw new BusinessException(message: _stringLocalizer[SjzyBasicLocalization.Validation_IsInEnum,
nameof(EditTrackPushContentInput.Options)]);
throw new ArgumentOutOfRangeException();
}
var pushConfig = await _trackPushConfigRepository.GetFirstAsync(x => x.Id == trackPushConfigId);
if (pushConfig != null)
{
await _trackPushCacheService.SetPushContentConfigsAsync(pushConfig.AppKey, pushConfig.CustomId);
await _trackPushCacheService.SetPushContentConfigsAsync(pushConfig.AppKey, pushConfig.Customer);
}
ts.Complete();
@ -303,7 +256,7 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
if (trackPushContentEntities.Count > 0)
{
using var ts = TransacationHelper.Create();
using var ts = TransacationHelper.GetReadCommitted();
await _trackPushConfigRepository.UpdateContentRangeAsync(trackPushContentEntities);
@ -311,12 +264,12 @@ public class TrackPushService : ApplicationServiceBase, ISingletonDependency
x => x.Id == trackPushContentEntities[0].TrackPushConfigId,
y => new
{
AppKey = y.AppKey,
y.CustomId
y.AppKey,
y.Customer
});
if (pushConfig != null)
{
await _trackPushCacheService.SetPushContentConfigsAsync(pushConfig.AppKey, pushConfig.CustomId);
await _trackPushCacheService.SetPushContentConfigsAsync(pushConfig.AppKey, pushConfig.Customer);
}
ts.Complete();

View File

@ -1,3 +1,4 @@
using Fake.Application.Dtos;
using TrackCenter.Application.Dtos.TrackStatus;
using TrackCenter.Domain.Aggregates.TrackContentAggregate;
using TrackCenter.Domain.Aggregates.TrackStatusAggregate;
@ -29,15 +30,24 @@ public class TrackStatusService : ApplicationServiceBase
/// </summary>
/// <returns></returns>
[HttpPost("Edit")]
public async Task<UnifyResultDto> EditAsync(EditTrackStatusInput input)
public async Task EditAsync(EditTrackStatusInput input)
{
return input.Options switch
switch (input.Options)
{
OptionType.新增 => await AddAsync(input),
OptionType.修改 => await UpdateAsync(input),
OptionType.删除 => await DeleteAsync(input),
_ => throw new BusinessException(message: "当前操作动作不合法")
};
case OptionType.无:
break;
case OptionType.新增:
await AddAsync(input);
break;
case OptionType.删除:
await DeleteAsync(input);
break;
case OptionType.修改:
await UpdateAsync(input);
break;
default:
throw new ArgumentOutOfRangeException();
}
}
/// <summary>
@ -46,16 +56,13 @@ public class TrackStatusService : ApplicationServiceBase
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("GetDetail")]
public async Task<UnifyResultDto<GetTrackStatusDetailDto>> GetDetailAsync(int id)
public async Task<GetTrackStatusDetailDto?> GetDetailAsync(int id)
{
var detailInfo = await _trackStatusRepository.GetDetailAsync(id);
if (detailInfo == null)
{
return new UnifyResultDto<GetTrackStatusDetailDto>(false, null, "未查询到轨迹状态");
}
if (detailInfo == null) return null;
var dto = ObjectMapper.Map<GetTrackStatusDetailVO, GetTrackStatusDetailDto>(detailInfo);
return new UnifyResultDto<GetTrackStatusDetailDto>(GlobalConst.SuccessCode, "", dto);
return dto;
}
/// <summary>
@ -77,7 +84,7 @@ public class TrackStatusService : ApplicationServiceBase
#region 私有方法
private async Task<UnifyResultDto> AddAsync(EditTrackStatusInput input)
private async Task AddAsync(EditTrackStatusInput input)
{
#region 业务校验
@ -109,11 +116,9 @@ public class TrackStatusService : ApplicationServiceBase
var entity = ObjectMapper.Map<EditTrackStatusInput, TrackStatusEntity>(input);
var isTrue = await _trackStatusRepository.InsertAsync(entity);
return new UnifyResultDto(GlobalConst.SuccessCode, "新增成功", isTrue);
}
private async Task<UnifyResultDto> UpdateAsync(EditTrackStatusInput input)
private async Task UpdateAsync(EditTrackStatusInput input)
{
#region 业务校验
@ -151,11 +156,9 @@ public class TrackStatusService : ApplicationServiceBase
ObjectMapper.Map(input, trackStatus);
var isTrue = await _trackStatusRepository.UpdateAsync(trackStatus);
return new UnifyResultDto(GlobalConst.SuccessCode, "修改成功", isTrue);
}
private async Task<UnifyResultDto> DeleteAsync(EditTrackStatusInput input)
private async Task DeleteAsync(EditTrackStatusInput input)
{
#region 业务校验
@ -169,8 +172,6 @@ public class TrackStatusService : ApplicationServiceBase
#endregion
var isTrue = await _trackStatusRepository.SoftDeleteAsync(x => x.Id == input.Id);
return new UnifyResultDto(GlobalConst.SuccessCode, "删除成功", isTrue);
}
#endregion

View File

@ -1,6 +1,5 @@
using Fake.Application.Dtos;
using InterfaceForward.Domain.Shared.Helpers;
using SJZY.Expand.ABP.Core.PublicMethords;
using TrackCenter.Application.Dtos.Warning;
using TrackCenter.Application.Dtos.Warning.Complete;
using TrackCenter.Application.Dtos.Warning.Return;
@ -13,7 +12,6 @@ using TrackCenter.Domain.Aggregates.TrackDetailsAggregate;
using TrackCenter.Domain.Aggregates.WarningAggregate;
using TrackCenter.Domain.Aggregates.WarningAggregate.Complete;
using TrackCenter.Domain.Dtos.Warning;
using TrackCenter.Domain.Enums;
namespace TrackCenter.Application.Services.Warning;
@ -30,7 +28,6 @@ public class CompleteWarningService : ApplicationServiceBase
private readonly ITrackDetailsEsRepository _trackDetailsEsRepository;
private readonly ICompleteWarningHandler _completeWarningHandler;
private readonly TrackStatusNameDictCache _trackStatusNameDictCache;
private readonly CustomAbbreviationDictCache _customAbbreviationDictCache;
public CompleteWarningService(
IOrderRepository orderRepository,
@ -38,8 +35,7 @@ public class CompleteWarningService : ApplicationServiceBase
IWarningDetailsEsRepository warningDetailsEsRepository,
ITrackDetailsEsRepository trackDetailsEsRepository,
ICompleteWarningHandler completeWarningHandler,
TrackStatusNameDictCache trackStatusNameDictCache,
CustomAbbreviationDictCache customAbbreviationDictCache,
TrackStatusNameDictCache trackStatusNameDictCache
)
{
_orderRepository = orderRepository;
@ -48,7 +44,6 @@ public class CompleteWarningService : ApplicationServiceBase
_trackDetailsEsRepository = trackDetailsEsRepository;
_completeWarningHandler = completeWarningHandler;
_trackStatusNameDictCache = trackStatusNameDictCache;
_customAbbreviationDictCache = customAbbreviationDictCache;
}
@ -79,8 +74,6 @@ public class CompleteWarningService : ApplicationServiceBase
// 查轨迹状态名称字典
var trackStatusDict = await _trackStatusNameDictCache.SafeGetBatchAsync(trackStatusIds);
// 查订单类型字典
var orderTypeDict = await _orderRepository.GetTrackOrderTypeDictAsync();
var map = result.Select(x => new CompleteWarningRuleItemDto
{
@ -114,7 +107,7 @@ public class CompleteWarningService : ApplicationServiceBase
.Select(x => new OrderTypeDto
{
OrderType = x,
OrderTypeName = orderTypeDict.GetValueOrDefault(x.ToString(), GlobalConst.EmptyString)
OrderTypeName = x.GetDescription()
}).ToList();
}
}
@ -130,32 +123,21 @@ public class CompleteWarningService : ApplicationServiceBase
var vo = ObjectMapper.Map<GetPageCompleteWarningDetailsInput, GetPageCompleteWarningDetailsInputVO>(input);
var result = await _warningDetailsEsRepository.GetPageCompleteWarningDetailsAsync(vo);
if (result.Items.Count == 0)
{
return new PagedResult<CompleteWarningDetailsDto>(new List<CompleteWarningDetailsDto>(),
result.Pagination.PageIndex,
result.Pagination.PageSize,
result.Pagination.Total);
}
return new PagedResult<CompleteWarningDetailsDto>(0, new List<CompleteWarningDetailsDto>());
// 订单类型名称字典
var orderTypeDict = await _orderRepository.GetTrackOrderTypeDictAsync();
var trackStatusIds = result.List
var trackStatusIds = result.Items
.SelectMany(x => x.GetMissingTrackStatusIdGroups().SelectMany(y => y))
.ToHashSet();
// 轨迹状态名称字典
var trackStatusDict = await _trackStatusNameDictCache.SafeGetBatchAsync(trackStatusIds);
// 客户id简称字典
var customIds = result.List.Select(x => x.CustomId).ToHashSet();
var customDict = await _customAbbreviationDictCache.SafeGetBatchAsync(customIds);
// 查最新轨迹(创建时间)
var orderIds = result.List.Select(x => x.OrderId).ToHashSet();
var orderIds = result.Items.Select(x => x.OrderId).ToHashSet();
var orderIdTrackDict = await _trackDetailsEsRepository.GetLatestDictAsync(orderIds);
var map = result.List.Select(x =>
var map = result.Items.Select(x =>
{
var orderIdTrack = orderIdTrackDict.GetValueOrDefault(x.OrderId);
return new CompleteWarningDetailsDto
@ -163,12 +145,11 @@ public class CompleteWarningService : ApplicationServiceBase
EsId = x.Id,
AppKey = x.AppKey,
OrderType = x.OrderType,
OrderTypeName = orderTypeDict.GetValueOrDefault(x.OrderType.ToString(), GlobalConst.EmptyString),
OrderTypeName = x.OrderType.GetDescription(),
OrderId = x.OrderId,
OrderNo = x.OrderNo,
Status = x.Status,
CustomId = x.CustomId,
CustomName = customDict.GetValueOrDefault(x.CustomId, GlobalConst.EmptyString),
Customer = x.Customer,
MissingTrackStatus = BuildMissingTrackStatus(x),
LatestTrackStatus = orderIdTrack?.TrackStatus,
LatestTrackContent = orderIdTrack?.TrackContent,
@ -187,18 +168,14 @@ public class CompleteWarningService : ApplicationServiceBase
.OrderBy(x => x.Status == (int) CompleteWarningStatus.待处理 ? 1 : 2)
.ThenByDescending(x => x.CreateTime); //同状态组按时间降序;
return new PagedResult<CompleteWarningDetailsDto>(
sorted.ToList(),
result.Pagination.PageIndex,
result.Pagination.PageSize,
result.Pagination.Total);
return new PagedResult<CompleteWarningDetailsDto>(result.TotalCount, sorted.ToList());
// 通知用户提取用户名称
string ToUserNames(string notifyUsers)
{
if (string.IsNullOrWhiteSpace(notifyUsers))
return string.Empty;
return string.Join(',', notifyUsers.ToObject<List<NotifyUserDto>>().Select(x => x.UserName));
return string.Join(',', notifyUsers.ToObject<List<NotifyUserDto>>()!.Select(x => x.UserName));
}
// 构建缺失轨迹状态
@ -234,7 +211,7 @@ public class CompleteWarningService : ApplicationServiceBase
// 同一个主体下同一个检查点,订单类型不允许出现交集
foreach (var group in bos.GroupBy(x => x.CheckPointTrackStatusId))
{
var allOrderTypes = new HashSet<int>();
var allOrderTypes = new HashSet<TrackOrderType>();
var count = 0;
foreach (var orderTypes in group.Select(x => x.OrderTypes))
{

View File

@ -6,7 +6,6 @@ using TrackCenter.Domain.Aggregates.WarningAggregate;
using TrackCenter.Domain.Aggregates.WarningAggregate.Complete;
using TrackCenter.Domain.Dtos.TrackDetails;
using TrackCenter.Domain.Dtos.Warning;
using TrackCenter.Domain.Enums;
namespace TrackCenter.Application.Services.Warning.Handlers;
@ -129,7 +128,7 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient
var orderTrackStatusEarliestDictDict = await _trackDetailsEsRepository.GetTrackStatusEarliestDictAsync(orderIds);
// 3.查规则主体
var conditionDict = orders.GroupBy(x => (x.AppKey, x.CustomId)).ToDictionary(x => x.Key, y => y.ToList());
var conditionDict = orders.GroupBy(x => (x.AppKey, x.Customer)).ToDictionary(x => x.Key, y => y.ToList());
var conditions = conditionDict.Keys.ToHashSet();
var ruleDict = await _warningRuleRepository.GetWarningRuleForEnabledAsync(conditions, WarningRuleType.完整预警);
if (ruleDict.Count == 0) return;
@ -147,7 +146,7 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient
foreach (var group in ruleItems.GroupBy(x => x.WarningId))
{
var rule = ruleDict[group.Key];
var hitRuleOrders = conditionDict[(rule.AppKey, rule.CustomId)]; //tips:一定存在
var hitRuleOrders = conditionDict[(rule.AppKey, rule.Customer)]; //tips:一定存在
foreach (var order in hitRuleOrders)
{
var trackStatusIdTrackDict = orderTrackStatusEarliestDictDict.GetValueOrDefault(order.Id);
@ -279,7 +278,7 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient
MissingTrackStatusIds = ruleItem.BuildMissingTrackStatusIdExpression(trackStatusIds),
AppKey = order.AppKey,
CustomId = order.CustomId,
Customer = order.Customer,
OrderId = order.Id,
OrderNo = order.OrderNo,
OrderType = order.OrderType,

View File

@ -1,7 +1,6 @@
using TrackCenter.Domain.Aggregates.OrderAggregate;
using TrackCenter.Domain.Aggregates.WarningAggregate;
using TrackCenter.Domain.Dtos.Warning;
using TrackCenter.Domain.Enums;
namespace TrackCenter.Application.Services.Warning.Handlers;

View File

@ -9,7 +9,6 @@ using TrackCenter.Domain.Aggregates.TrackPushAggregate;
using TrackCenter.Domain.Aggregates.WarningAggregate;
using TrackCenter.Domain.Aggregates.WarningAggregate.Return;
using TrackCenter.Domain.Dtos.Warning;
using TrackCenter.Domain.Enums;
namespace TrackCenter.Application.Services.Warning.Handlers;
@ -95,7 +94,7 @@ public sealed class ReturnWarningHandler : IReturnWarningHandler, ITransientDepe
// 2.匹配规则项目,每个订单至多有一个
// 已知每次推送只能是推同一个应用,同一个客户的订单,查找规则主体时选任意一个单即可,并且这次推送的轨迹内容是相同的所以状态也是相同的
ReturnWarningRuleItemEntity? ruleItem = null; //todo:历史推送可能对应多个配置,但只关注这一次的推送
var rule = await _warningRuleRepository.GetWarningRuleForEnabledAsync(orderFirst.AppKey, orderFirst.CustomId, WarningRuleType.回传时效预警);
var rule = await _warningRuleRepository.GetWarningRuleForEnabledAsync(orderFirst.AppKey, orderFirst.Customer, WarningRuleType.回传时效预警);
if (rule != null)
{
var ruleItemEntities = await _warningRuleRepository.GetReturnRuleItemsAsync(rule.Id);
@ -105,7 +104,7 @@ public sealed class ReturnWarningHandler : IReturnWarningHandler, ITransientDepe
// 3.查询订单+轨迹 关联的推送映射配置(tips:一定存在,如果不存在则推送都进行不了)
// 已知可以推送出去的轨迹都是符合推送顺序的,todo:历史轨迹的推送对应多个配置,但只关注这一次的推送的配置
var pushConfigs = await _trackPushCacheService.GetPushContentConfigsAsync(orderFirst.AppKey, orderFirst.CustomId);
var pushConfigs = await _trackPushCacheService.GetPushContentConfigsAsync(orderFirst.AppKey, orderFirst.Customer);
var pushContentConfig = pushConfigs?.FirstOrDefault(x => x.TrackContentId == recordFirst.TrackContentId);
if (pushContentConfig == null) return;
@ -318,7 +317,7 @@ public sealed class ReturnWarningHandler : IReturnWarningHandler, ITransientDepe
// 订单信息
AppKey = order.AppKey,
CustomId = order.CustomId,
Customer = order.Customer,
OrderId = order.Id,
OrderNo = order.OrderNo,
OrderType = order.OrderType,

View File

@ -8,7 +8,6 @@ using TrackCenter.Domain.Aggregates.WarningAggregate.Transport;
using TrackCenter.Domain.Dtos.Forewarning;
using TrackCenter.Domain.Dtos.TrackDetails;
using TrackCenter.Domain.Dtos.Warning;
using TrackCenter.Domain.Enums;
using SqlSugar;
using TrackCenter.Application.Services.Warning.Model;
using TrackCenter.Application.Services.Warning.Signals;
@ -225,7 +224,7 @@ public class TransportWarningHandler : ITransportWarningHandler, ITransientDepen
if (orders.Count == 0) return;
// 3.查规则主体
var conditions = orders.Select(x => (AppKey: x.AppKey, x.CustomId)).ToHashSet();
var conditions = orders.Select(x => (AppKey: x.AppKey, x.Customer)).ToHashSet();
var ruleDict = await _warningRuleRepository.GetWarningRuleForEnabledAsync(conditions, WarningRuleType.运输时效预警);
if (ruleDict.Count == 0) return;
@ -1242,7 +1241,7 @@ public class TransportWarningHandler : ITransportWarningHandler, ITransientDepen
//订单信息
AppKey = order.AppKey,
CustomId = order.CustomId,
Customer = order.Customer,
OrderId = order.Id,
OrderNo = order.OrderNo,
OrderType = order.OrderType,

View File

@ -19,7 +19,7 @@ public sealed class CompleteWarningRuleItemBO
/// <summary>
/// 订单类型集合(,分割) e.g. 1,2,3
/// </summary>
public HashSet<int> OrderTypes { get; set; }
public HashSet<TrackOrderType> OrderTypes { get; set; }
/// <summary>
/// 检查点轨迹状态id
@ -43,7 +43,7 @@ public sealed class CompleteWarningRuleItemBO
{
Id = x.Id,
WarningId = input.WarningId,
OrderTypes = x.OrderTypes.Split(",").Select(int.Parse).ToHashSet(),
OrderTypes = x.OrderTypes.Split(",").Select(Enum.Parse<TrackOrderType>).ToHashSet(),
CheckPointTrackStatusId = x.CheckPointTrackStatusId,
RequireTrackStatus = x.RequireTrackStatus.Select(y => y.ToHashSet()).ToList(),
NotifyUsers = x.NotifyUsers

View File

@ -7,7 +7,6 @@ using TrackCenter.Application.Events;
using TrackCenter.Domain.Aggregates.OrderAggregate;
using TrackCenter.Domain.Aggregates.WarningAggregate;
using TrackCenter.Domain.Dtos.Warning;
using TrackCenter.Domain.Enums;
using TrackCenter.Application.Caching;
using TrackCenter.Application.Helpers;
using TrackCenter.Application.Services.Warning.Handlers;
@ -106,11 +105,6 @@ public class ReturnWarningService : ApplicationServiceBase
return new PagedResult<ReturnWarningDetailsDto>(result.TotalCount, new List<ReturnWarningDetailsDto>());
}
// 订单类型名称字典
var orderTypeDict = await _orderRepository.GetTrackOrderTypeDictAsync();
// 客户id简称字典
var customIds = result.Items.Select(x => x.CustomId).ToHashSet();
var customDict = await _customAbbreviationDictCache.SafeGetBatchAsync(customIds);
// 应用中文名字典
var appKeys = result.Items.Select(x => x.AppKey).ToHashSet();
var appDict = await _appNameDictCache.SafeGetBatchAsync(appKeys);
@ -121,12 +115,11 @@ public class ReturnWarningService : ApplicationServiceBase
AppKey = x.AppKey,
AppName = appDict.GetValueOrDefault(x.AppKey, GlobalConst.EmptyString),
OrderType = x.OrderType,
OrderTypeName = orderTypeDict.GetValueOrDefault(x.OrderType.ToString(), GlobalConst.EmptyString),
OrderTypeName = x.OrderType.GetDescription(),
OrderId = x.OrderId,
OrderNo = x.OrderNo,
Status = x.Status,
CustomId = x.CustomId,
CustomName = customDict.GetValueOrDefault(x.CustomId, GlobalConst.EmptyString),
Customer = x.Customer,
// 轨迹信息
TrackStatus = x.TrackStatus,
TrackCode = x.TrackCode,
@ -262,7 +255,7 @@ public class ReturnWarningService : ApplicationServiceBase
{
OptionType = OptionType.新增,
AppKey = detail.AppKey,
CustomId = detail.CustomId,
Customer = detail.Customer,
OrderIdTrackMetadataDict = new Dictionary<int, TrackMetadata>
{
[detail.OrderId] = TrackMetadata.Build(detail.Id, detail.TrackVersion, detail.CreateTime)

View File

@ -17,7 +17,7 @@ public readonly struct WarningSignal
public int TrackContentId { get; }
// public string OrderNo { get; set; }
// public int OrderType { get; set; }
// public TrackOrderType OrderType { get; set; }
// public string AppKey { get; set; }
[System.Text.Json.Serialization.JsonConstructor]

View File

@ -12,7 +12,6 @@ using TrackCenter.Domain.Aggregates.TrackDetailsAggregate;
using TrackCenter.Domain.Aggregates.WarningAggregate;
using TrackCenter.Domain.Aggregates.WarningAggregate.Transport;
using TrackCenter.Domain.Dtos.Warning;
using TrackCenter.Domain.Enums;
namespace TrackCenter.Application.Services.Warning;
@ -157,7 +156,7 @@ public class TransportWarningService : ApplicationServiceBase
EndTrackStatus = trackStatusDict.GetValueOrDefault(x.EndTrackStatusId, GlobalConst.EmptyString),
TransportTimeSpan = x.TransportTimeSpan,
StartTrackWarningTimeSpan = x.StartTrackWarningTimeSpan,
NotifyUsers = x.NotifyUsers.ToObject<List<NotifyUserDto>>()
NotifyUsers = x.NotifyUsers.ToObject<List<NotifyUserDto>>()!
});
return map.ToList();
@ -187,11 +186,6 @@ public class TransportWarningService : ApplicationServiceBase
// 查轨迹状态最早轨迹
var orderIdTrackStatusEarliestTrackDict = await _trackDetailsEsRepository.GetTrackStatusEarliestDictAsync(orderIds);
// 订单类型名称字典
var orderTypeDict = await _orderRepository.GetTrackOrderTypeDictAsync();
// 客户id简称字典
var customIds = result.Items.Select(x => x.CustomId).ToHashSet();
var customDict = await _customAbbreviationDictCache.SafeGetBatchAsync(customIds);
// 应用中文名字典
var appKeys = result.Items.Select(x => x.AppKey).ToHashSet();
var appDict = await _appNameDictCache.SafeGetBatchAsync(appKeys);
@ -207,12 +201,11 @@ public class TransportWarningService : ApplicationServiceBase
EsId = x.Id,
AppKey = x.AppKey,
AppName = appDict.GetValueOrDefault(x.AppKey, GlobalConst.EmptyString),
CustomId = x.CustomId,
CustomName = customDict.GetValueOrDefault(x.CustomId, GlobalConst.EmptyString),
Customer = x.Customer,
OrderId = x.OrderId,
OrderNo = x.OrderNo,
OrderType = x.OrderType,
OrderTypeName = orderTypeDict.GetValueOrDefault(x.OrderType.ToString(), GlobalConst.EmptyString),
OrderTypeName = x.OrderType.GetDescription(),
NotifyUserNames = ToUserNames(x.NotifyUsers),
// 最新轨迹 (不冗余)创建时间最新

View File

@ -2,7 +2,6 @@ using TrackCenter.Application.Dtos.Warning;
using TrackCenter.Application.Caching;
using TrackCenter.Application.Services.Warning.Handlers;
using TrackCenter.Domain.Aggregates.WarningAggregate;
using TrackCenter.Domain.Enums;
namespace TrackCenter.Application.Services.Warning;
@ -17,7 +16,6 @@ public class WarningService : ApplicationServiceBase
private readonly ICompleteWarningHandler _completeWarningHandler;
private readonly ITransportWarningHandler _transportWarningHandler;
private readonly IReturnWarningHandler _returnWarningHandler;
private readonly CustomAbbreviationDictCache _customAbbreviationDictCache;
private readonly AppNameDictCache _appNameDictCache;
public WarningService(
@ -25,7 +23,6 @@ public class WarningService : ApplicationServiceBase
ICompleteWarningHandler completeWarningHandler,
ITransportWarningHandler transportWarningHandler,
IReturnWarningHandler returnWarningHandler,
CustomAbbreviationDictCache customAbbreviationDictCache,
AppNameDictCache appNameDictCache
)
{
@ -33,7 +30,6 @@ public class WarningService : ApplicationServiceBase
_completeWarningHandler = completeWarningHandler;
_transportWarningHandler = transportWarningHandler;
_returnWarningHandler = returnWarningHandler;
_customAbbreviationDictCache = customAbbreviationDictCache;
_appNameDictCache = appNameDictCache;
}
@ -45,13 +41,10 @@ public class WarningService : ApplicationServiceBase
[HttpPost("GetWarningRule")]
public async Task<List<WarningRuleDto>> GetWarningRule(GetWarningRuleInput input)
{
var result = await _warningRuleRepository.GetWarningRuleListAsync(input.AppKey, input.CustomId, input.KpiName, input.IsEnabled, input.WarningType);
var result = await _warningRuleRepository.GetWarningRuleListAsync(input.AppKey, input.Customer, input.KpiName, input.IsEnabled, input.WarningType);
if (result.Count == 0)
return new List<WarningRuleDto>();
// 客户id简称字典
var customIds = result.Select(x => x.CustomId).ToHashSet();
var customDict = await _customAbbreviationDictCache.SafeGetBatchAsync(customIds);
// 应用中文名字典
var appKeys = result.Select(x => x.AppKey).ToHashSet();
var appDict = await _appNameDictCache.SafeGetBatchAsync(appKeys);
@ -61,8 +54,7 @@ public class WarningService : ApplicationServiceBase
Id = x.Id,
AppKey = x.AppKey,
AppName = appDict.GetValueOrDefault(x.AppKey, GlobalConst.EmptyString),
CustomId = x.CustomId,
CustomName = customDict.GetValueOrDefault(x.CustomId, GlobalConst.EmptyString),
Customer = x.Customer,
Name = x.Name,
IsEnabled = x.IsEnabled,
WarningType = x.WarningType,
@ -93,9 +85,9 @@ public class WarningService : ApplicationServiceBase
}
// 如果设置为启用则检查同一个应用同一客户下有多个启用的规则
if (input.IsEnabled && await _warningRuleRepository.CheckEnableDuplicateAsync(rule.Id, rule.AppKey, rule.CustomId, (WarningRuleType) rule.WarningType))
if (input.IsEnabled && await _warningRuleRepository.CheckEnableDuplicateAsync(rule.Id, rule.AppKey, rule.Customer, (WarningRuleType) rule.WarningType))
{
throw new BusinessException(message: $"同一【应用+客户+类型】下不能有多个启用的预警规则主体,AppKey=[{rule.AppKey},CustomId=[{rule.CustomId}]]");
throw new BusinessException(message: $"同一【应用+客户+类型】下不能有多个启用的预警规则主体,AppKey=[{rule.AppKey},Customer=[{rule.Customer}]]");
}
// 更新规则主体状态
@ -128,15 +120,15 @@ public class WarningService : ApplicationServiceBase
throw new BusinessException(message: $"WarningId=[{input.Id}],WarningType=[{input.WarningType}]预警规则主体不存在,不允许修改");
}
// 要求 AppKey+CustomId+Name+WarningType 联合不能重复
if (await _warningRuleRepository.CheckNameDuplicateAsync(input.Id, input.AppKey, input.CustomId, input.Name, (WarningRuleType) input.WarningType))
// 要求 AppKey+Customer+Name+WarningType 联合不能重复
if (await _warningRuleRepository.CheckNameDuplicateAsync(input.Id, input.AppKey, input.Customer, input.Name, (WarningRuleType) input.WarningType))
{
throw new BusinessException(message: $"AppKey:[{input.AppKey}],CustomId:[{input.CustomId}]," +
throw new BusinessException(message: $"AppKey:[{input.AppKey}],Customer:[{input.Customer}]," +
$"WarningType:[{input.WarningType.ToString()}]已存在名称为[{input.Name}]规则,不允许重复创建/修改");
}
// 如果创建/修改的主体为启用状态,则要求通过检查
if (input.IsEnabled && await _warningRuleRepository.CheckEnableDuplicateAsync(input.Id, input.AppKey, input.CustomId, (WarningRuleType) input.WarningType))
if (input.IsEnabled && await _warningRuleRepository.CheckEnableDuplicateAsync(input.Id, input.AppKey, input.Customer, (WarningRuleType) input.WarningType))
{
throw new BusinessException(message: $"同一【应用+客户+预警类型】下不能有多个启用的预警规则主体,不允许创建/修改");
}
@ -148,7 +140,7 @@ public class WarningService : ApplicationServiceBase
input.Id,
input.Name,
input.AppKey,
input.CustomId,
input.Customer,
input.IsEnabled,
input.WarningType
);
@ -158,7 +150,7 @@ public class WarningService : ApplicationServiceBase
enabledChanged = ruleEntity.IsEnabled != input.IsEnabled;
ruleEntity.Name = input.Name;
ruleEntity.AppKey = input.AppKey;
ruleEntity.CustomId = input.CustomId;
ruleEntity.Customer = input.Customer;
ruleEntity.IsEnabled = input.IsEnabled;
ruleEntity.WarningType = input.WarningType;
}

View File

@ -5,13 +5,6 @@ namespace TrackCenter.Domain.Aggregates.OrderAggregate;
public interface IOrderRepository : IBasicRepository<OrderEntity>
{
/// <summary>
/// 获取订单类型字典
/// key:OrderType value:TypeName
/// </summary>
/// <returns></returns>
Task<Dictionary<string, string>> GetTrackOrderTypeDictAsync();
/// <summary>
/// 获取分页的轨迹订单
/// </summary>
@ -24,8 +17,8 @@ public interface IOrderRepository : IBasicRepository<OrderEntity>
/// </summary>
/// <param name="serviceProviderCode">三方平台</param>
/// <param name="orderNo">三方平台单号</param>
/// <returns>(主单id,主单号,客户id)</returns>
Task<(int MainOrderId, string OrderNo, int CustomId)> GetTrackOrderByProviderAndOrderNo(string serviceProviderCode, string orderNo);
/// <returns>(主单id,主单号,客户)</returns>
Task<(int MainOrderId, string OrderNo, string Customer)> GetTrackOrderByProviderAndOrderNo(string serviceProviderCode, string orderNo);
/// <summary>
/// 创建订单
@ -92,7 +85,7 @@ public interface IOrderRepository : IBasicRepository<OrderEntity>
/// <param name="linkAppKey"></param>
/// <param name="linkOrderType"></param>
/// <returns></returns>
Task<List<string>> GetLinkedOrdersAsync(int orderId, string linkAppKey, int linkOrderType);
Task<List<string>> GetLinkedOrdersAsync(int orderId, string linkAppKey, TrackOrderType linkOrderType);
/// <summary>
@ -103,7 +96,7 @@ public interface IOrderRepository : IBasicRepository<OrderEntity>
/// <param name="linkOrderType"></param>
/// <param name="linkOrderNos"></param>
/// <returns></returns>
Task<List<int>> GetLinkedOrdersAsync(int orderId, string linkAppKey, int linkOrderType,
Task<List<int>> GetLinkedOrdersAsync(int orderId, string linkAppKey, TrackOrderType linkOrderType,
List<string> linkOrderNos);
/// <summary>

View File

@ -25,7 +25,7 @@ public class OrderEntity : FullAuditedAggregateRoot<int>
/// 订单类型(主数据枚举TrackOrderType)
/// </summary>
[SugarColumn(ColumnName = "OrderType")]
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 应用
@ -34,10 +34,10 @@ public class OrderEntity : FullAuditedAggregateRoot<int>
public string AppKey { get; set; }
/// <summary>
/// 客户id(外部主体id)
/// 客户
/// </summary>
[SugarColumn(ColumnName = "CustomId")]
public int CustomId { get; set; }
[SugarColumn(ColumnName = "Customer")]
public string Customer { get; set; }
/// <summary>
/// 订单是否完结(异步维护)
@ -130,10 +130,10 @@ public class OrderEntity : FullAuditedAggregateRoot<int>
public string LeaveCountry { get; set; } = null!;
/// <summary>
/// 问题类型(主数据枚举TrackQuestionType)
/// 问题类型
/// </summary>
[SugarColumn(ColumnName = "QuestionType")]
public int QuestionType { get; set; }
public TrackProblemType QuestionType { get; set; }
/// <summary>
/// 起运港口

View File

@ -1,5 +1,4 @@
using TrackCenter.Domain.Dtos.TrackDetails;
using TrackCenter.Domain.Enums;
using TrackCenter.Domain.SeedWork;
namespace TrackCenter.Domain.Aggregates.TrackDetailsAggregate;
@ -19,7 +18,7 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService<TrackDe
Task<List<TrackDetailsIndex>> GetLatestListAsync(int[] eventOrderIds, List<string> trackCodes);
Task<List<TrackDetailsIndex>> GetListAsync(string AppKey, int orderType, List<string> orderNos, List<string>? trackCodes = null);
Task<List<TrackDetailsIndex>> GetListAsync(string appKey, TrackOrderType orderType, List<string> orderNos, List<string>? trackCodes = null);
Task<bool> AnyAsync(int orderId, string originTrackDataHash);
@ -45,7 +44,7 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService<TrackDe
Task<List<TrackDetailsIndex>> GetDataByIds(string[] ids);
Task<TrackDetailsIndex?> GetDetailAsync(string orderNo, string trackCode, int orderType, string AppKey, DateTime trackTime);
Task<TrackDetailsIndex?> GetDetailAsync(string orderNo, string trackCode, TrackOrderType orderType, string appKey, DateTime trackTime);
Task MigrateAsync();
}

View File

@ -28,9 +28,9 @@ public class TrackDetailsIndex : IdVersionIndex
public string IndexName { get; set; } = null!;
/// <summary>
/// 订单类型(主数据枚举TrackOrderType)
/// 订单类型
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 轨迹状态Id

View File

@ -49,7 +49,7 @@ public class TrackPullContentConfigEntity : FullAuditedEntity<int>
/// 兜底轨迹发生地参数值
/// </summary>
[SugarColumn(ColumnName = "TrackPlaceValue")]
public int? TrackPlaceValue { get; set; }
public TrackLocationValue? TrackPlaceValue { get; set; }
/// <summary>
/// 兜底轨迹时区所属发生地参数值

View File

@ -1,5 +1,4 @@
using Fake.Application.Dtos;
using TrackCenter.Domain.Dtos.Common;
using TrackCenter.Domain.Dtos.TrackPush;
namespace TrackCenter.Domain.Aggregates.TrackPushAggregate;
@ -38,7 +37,5 @@ public interface ITrackPushConfigRepository : IBasicRepository<TrackPushConfigEn
Expression<Func<TrackPushContentConfigEntity, bool>> whereExpression);
Task<List<QueryTrackPullMappingsInfoVO>> QueryTrackPullMappingsAsync(QueryTrackPullMappingsInputVO input);
Task<List<GetTrackPushContentListVo>> GetTrackPushContentListAsync(string AppKey, int customerId);
Task<string?> GetServiceCodeByCustomerIdAsync(int customerId);
Task<HashSet<int>> GetConfigTags(GetConfigTagsInputVO inputVo);
Task<List<GetTrackPushContentListVo>> GetTrackPushContentListAsync(string appKey, string customer);
}

View File

@ -1,5 +1,4 @@
using Fake.Domain.Entities.Auditing;
using TrackCenter.Domain.Enums;
using TrackCenter.Domain.SeedWork;
namespace TrackCenter.Domain.Aggregates.TrackPushAggregate;
@ -17,10 +16,10 @@ public class TrackPushConfigEntity : FullAuditedAggregateRoot<int>
public int Id { get; set; }
/// <summary>
/// 客户id(外部主体id)
/// 客户(外部主体id)
/// </summary>
[SugarColumn(ColumnName = "CustomId")]
public int CustomId { get; set; }
[SugarColumn(ColumnName = "Customer")]
public string Customer { get; set; }
/// <summary>
/// 是否自动推送

View File

@ -16,10 +16,10 @@ public class TrackPushContentConfigEntity : FullAuditedEntity<int>
public int Id { get; set; }
/// <summary>
/// 推送单号类型(主数据枚举TrackOrderType)
/// 推送单号类型
/// </summary>
[SugarColumn(ColumnName = "OrderNoType")]
public int OrderNoType { get; set; }
public TrackOrderType OrderNoType { get; set; }
/// <summary>
/// 轨迹内容id

View File

@ -21,11 +21,11 @@ public sealed class CompleteWarningDetailsIndex : IdBaseIndex
//订单信息
public string AppKey { get; set; } //(冗余)应用
//public string AppName { get; set; } //(冗余)应用名称
public int CustomId { get; set; } //(冗余)客户Id
public string Customer { get; set; } //(冗余)客户
//public string CustomName { get; set; } //(冗余)客户名称
public int OrderId { get; set; }
public string OrderNo { get; set; } //订单号
public int OrderType { get; set; } //(冗余)订单类型
public TrackOrderType OrderType { get; set; } //(冗余)订单类型
//public string OrderTypeName { get; set; } //(冗余)订单类型名称
//可变属性

View File

@ -40,9 +40,9 @@ public sealed class CompleteWarningRuleItemEntity : FullAuditedEntity<int>
NotifyUsers = notifyUsers;
}
public HashSet<int> GetRuleOrderTypes()
public HashSet<TrackOrderType> GetRuleOrderTypes()
{
return OrderTypes.Split(',').Select(int.Parse).ToHashSet();
return OrderTypes.Split(',').Select(Enum.Parse<TrackOrderType>).ToHashSet();
}
public List<HashSet<int>> GetRequireTrackStatusIdGroups()
@ -54,7 +54,7 @@ public sealed class CompleteWarningRuleItemEntity : FullAuditedEntity<int>
}
// 查看是否能命中这个规则
public bool CanHitRule(int orderType, HashSet<int> trackStatusIds)
public bool CanHitRule(TrackOrderType orderType, HashSet<int> trackStatusIds)
{
var orderTypes = GetRuleOrderTypes();
// 没有命中订单类型
@ -70,7 +70,7 @@ public sealed class CompleteWarningRuleItemEntity : FullAuditedEntity<int>
}
// 是否完成,不缺失轨迹了
public bool IsDone(int orderType, HashSet<int> trackStatusIds)
public bool IsDone(TrackOrderType orderType, HashSet<int> trackStatusIds)
{
var orderTypes = GetRuleOrderTypes();
// 没有命中订单类型

View File

@ -1,7 +1,6 @@
using TrackCenter.Domain.Aggregates.WarningAggregate.Complete;
using TrackCenter.Domain.Aggregates.WarningAggregate.Return;
using TrackCenter.Domain.Aggregates.WarningAggregate.Transport;
using TrackCenter.Domain.Enums;
namespace TrackCenter.Domain.Aggregates.WarningAggregate;
@ -13,10 +12,10 @@ public interface IWarningRuleRepository : IBasicRepository<WarningRuleEntity>
#region 规则主体
// 检查名称是否重复
Task<bool> CheckNameDuplicateAsync(int id, string appKey, int customId, string name, WarningRuleType warningType);
Task<bool> CheckNameDuplicateAsync(int id, string appKey, string customer, string name, WarningRuleType warningType);
// 检查是同一【应用+客户+类型】是否有多个启用的预警规则主体
Task<bool> CheckEnableDuplicateAsync(int warningId, string appKey, int customId, WarningRuleType warningType);
Task<bool> CheckEnableDuplicateAsync(int warningId, string appKey, string customer, WarningRuleType warningType);
// 新增/更新预警规则主体,并返回id
Task<int> UpsertReturnIdAsync(WarningRuleEntity entity);
@ -25,13 +24,13 @@ public interface IWarningRuleRepository : IBasicRepository<WarningRuleEntity>
Task<string> UpdateVersionAsync(WarningRuleEntity entity);
// 模糊查询预警规则主体
Task<List<WarningRuleEntity>> GetWarningRuleListAsync(string? appKey, int? customId, string? kpiname, bool? isEnabled, int? warningType);
Task<List<WarningRuleEntity>> GetWarningRuleListAsync(string? appKey, string? customer, string? kpiname, bool? isEnabled, int? warningType);
// 获取启用的预警规则主体
Task<WarningRuleEntity?> GetWarningRuleForEnabledAsync(string appKey, int customId, WarningRuleType warningType);
Task<WarningRuleEntity?> GetWarningRuleForEnabledAsync(string appKey, string customer, WarningRuleType warningType);
// 获取启用的预警规则主体
Task<IReadOnlyDictionary<int, WarningRuleEntity>> GetWarningRuleForEnabledAsync(HashSet<(string AppKey, int CustomId)> conditions, WarningRuleType warningType);
Task<IReadOnlyDictionary<int, WarningRuleEntity>> GetWarningRuleForEnabledAsync(HashSet<(string AppKey, string Customer)> conditions, WarningRuleType warningType);
// 获取预警规则主体根据id
Task<WarningRuleEntity?> GetWarningRuleByIdAsync(int id, WarningRuleType? warningType = null);

View File

@ -23,11 +23,10 @@ public class ReturnWarningDetailsIndex : IdBaseIndex
//订单信息
public string AppKey { get; set; } //(冗余)应用
//public string AppName { get; set; } //(冗余)应用名称
public int CustomId { get; set; } //(冗余)客户Id
//public string CustomName { get; set; } //(冗余)客户名称
public string Customer { get; set; } //(冗余)客户
public int OrderId { get; set; }
public string OrderNo { get; set; } //订单号
public int OrderType { get; set; } //(冗余)订单类型
public TrackOrderType OrderType { get; set; } //(冗余)订单类型
//public string OrderTypeName { get; set; } //(冗余)订单类型名称

View File

@ -3,7 +3,6 @@ using Nest;
using TrackCenter.Domain.Aggregates.KPIAreaAggregate;
using TrackCenter.Domain.Aggregates.TrackDetailsAggregate;
using TrackCenter.Domain.Consts;
using TrackCenter.Domain.Enums;
using TrackCenter.Domain.SeedWork;
namespace TrackCenter.Domain.Aggregates.WarningAggregate.Transport;
@ -32,12 +31,12 @@ public sealed class TransportWarningDetailsIndex : IdBaseIndex
public string AppKey { get; set; } //(冗余)应用
// public string AppName { get; set; } //(冗余)应用名称
public int CustomId { get; set; } //(冗余)客户Id
public string Customer { get; set; } //(冗余)客户
// public string CustomName { get; set; } //冗余 客户简称(用于查询条件)
public int OrderId { get; set; }
public string OrderNo { get; set; } //订单号
public int OrderType { get; set; } //(冗余)订单类型
public TrackOrderType OrderType { get; set; } //(冗余)订单类型
// public string OrderTypeName { get; set; } //(冗余)订单类型名称
//轨迹信息-起始(更新用例:新增轨迹时,场景/规则项变更并且重新命中)

View File

@ -5,7 +5,7 @@ namespace TrackCenter.Domain.Aggregates.WarningAggregate;
// 预警规则主体
[SugarTable("t_warning", TableDescription = "预警规则主体")]
[SugarIndex("IDX_CustomId_AppKey", nameof(CustomId), OrderByType.Asc, nameof(AppKey), OrderByType.Asc)]
[SugarIndex("IDX_Customer_AppKey", nameof(Customer), OrderByType.Asc, nameof(AppKey), OrderByType.Asc)]
public sealed class WarningRuleEntity : FullAuditedAggregateRoot<int>
{
[SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)]
@ -14,8 +14,8 @@ public sealed class WarningRuleEntity : FullAuditedAggregateRoot<int>
[SugarColumn(ColumnName = "AppKey", ColumnDescription = "应用")]
public string AppKey { get; set; } //应用
[SugarColumn(ColumnName = "CustomId", ColumnDescription = "客户id")]
public int CustomId { get; set; } //客户id
[SugarColumn(ColumnName = "Customer", ColumnDescription = "客户")]
public string Customer { get; set; } //客户
// [SugarColumn(ColumnName = "CustomName", ColumnDescription = "客户名称")]
// public string CustomName { get; set; } //冗余客户简称,用于查询
@ -36,31 +36,31 @@ public sealed class WarningRuleEntity : FullAuditedAggregateRoot<int>
{
}
public WarningRuleEntity(int id, string name, string AppKey, int customId, bool isEnabled, int warningType, string version)
public WarningRuleEntity(int id, string name, string AppKey, string customer, bool isEnabled, int warningType, string version)
{
Id = id;
Name = name;
AppKey = AppKey;
CustomId = customId;
Customer = customer;
IsEnabled = isEnabled;
WarningType = warningType;
Version = version;
}
public WarningRuleEntity(int id, string name, string AppKey, int customId, bool isEnabled, int warningType)
public WarningRuleEntity(int id, string name, string AppKey, string customer, bool isEnabled, int warningType)
{
Id = id;
Name = name;
AppKey = AppKey;
CustomId = customId;
Customer = customer;
IsEnabled = isEnabled;
WarningType = warningType;
Version = VersionGenerate.GenVersion();
}
// 应用+客户id确定命中规则主体
public bool CanHitRule(string AppKey, int customId)
public bool CanHitRule(string AppKey, string customer)
{
return AppKey == AppKey && CustomId == customId;
return AppKey == AppKey && Customer == customer;
}
}

View File

@ -3,7 +3,6 @@ namespace TrackCenter.Domain.Consts;
public partial class GlobalConst
{
public const string MainDataKey_OrderType = "TrackOrderType";
public const string MainDataKey_TrackQuestionType = "TrackQuestionType";
public const string SystemUser = "系统";
public const string EmptyString = "--";
public const int ChunkSize = 100;

View File

@ -10,17 +10,17 @@ public class GetPageTrackOrderInputVO : PageInfoInput
/// <summary>
/// 当tab选中 0 全部 1 异常 2 警告
/// </summary>
public int TabType { get; set; }
public TrackProblemType TabType { get; set; }
/// <summary>
/// 订单类型
/// </summary>
public int? TrackOrderType { get; set; }
public TrackOrderType? TrackOrderType { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int? CustomerId { get; set; }
public string? Customer { get; set; }
///// <summary>
///// 单号
@ -56,7 +56,7 @@ public class TrackOrderVO
/// <summary>
/// 订单类型id
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 订单类型名称
@ -68,21 +68,10 @@ public class TrackOrderVO
/// </summary>
public string? OrderNumber { get; set; }
/// <summary>
/// 客户简称
/// 客户
/// </summary>
public string? CustomerShortName { get; set; }
/// <summary>
/// 客户代码
/// </summary>
public string? CustomerCode { get; set; }
/// <summary>
/// 客户id
/// </summary>
public int CustomerId { get; set; }
public string Customer { get; set; }
///// <summary>
///// 订单明细(json)
@ -142,7 +131,7 @@ public class TrackOrderVO
/// <summary>
/// 问题类型(主数据枚举TrackQuestionType)
/// </summary>
public int QuestionType { get; set; }
public TrackProblemType QuestionType { get; set; }
/// <summary>
/// 问题类型名称

View File

@ -20,7 +20,7 @@ public class LinkedOrderVO
/// <summary>
/// 订单类型(主数据枚举TrackOrderType)
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 应用
@ -28,7 +28,7 @@ public class LinkedOrderVO
public string AppKey { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int CustomId { get; set; }
public string Customer { get; set; }
}

View File

@ -5,7 +5,7 @@ namespace TrackCenter.Domain.Dtos.Order;
/// </summary>
public readonly struct OrderIdentifier
{
public OrderIdentifier(int orderType, string orderNo)
public OrderIdentifier(TrackOrderType orderType, string orderNo)
{
OrderType = orderType;
OrderNo = orderNo;
@ -14,7 +14,7 @@ public readonly struct OrderIdentifier
/// <summary>
/// 订单类型
/// </summary>
public int OrderType { get; }
public TrackOrderType OrderType { get; }
/// <summary>
/// 订单号

View File

@ -5,9 +5,9 @@ public class OrderWithServiceProviderVO
public string OrderNo { get; set; } = null!;
/// <summary>
/// 订单类型(主数据枚举TrackOrderType)
/// 订单类型
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 服务商code

View File

@ -1,3 +1,5 @@
using InterfaceForward.Domain.Shared.Helpers;
namespace TrackCenter.Domain.Dtos.TrackPull;
public class GetTrackPullContentPageOutputVO
@ -42,7 +44,9 @@ public class GetTrackPullContentPageOutputVO
/// <summary>
/// 轨迹发生地
/// </summary>
public string? TrackPlaceValue { get; set; }
public TrackLocationValue? TrackPlaceValue { get; set; }
public string? TrackPlaceValueName => TrackPlaceValue?.GetDescription();
/// <summary>
/// 拉取轨迹状态

View File

@ -1,20 +1,13 @@
using TrackCenter.Domain.Enums;
namespace TrackCenter.Domain.Dtos.TrackPush;
namespace TrackCenter.Domain.Dtos.TrackPush;
public class GetTrackPushConfigDetailOutputVO
{
public int Id { get; set; }
/// <summary>
/// 客户id
/// </summary>
public int CustomId { get; set; }
/// <summary>
/// 客户
/// </summary>
public string CustomName { get; set; }
public string Customer { get; set; }
/// <summary>
/// 是否自动推送

View File

@ -10,14 +10,14 @@ public class GetTrackPushConfigPageOutputVO
/// <summary>
/// 客户名称
/// </summary>
public string CustomName { get; set; }
public string Customer { get; set; }
public int Id { get; set; }
/// <summary>
/// 应用名称
/// </summary>
public string App { get; set; }
public string AppName { get; set; }
/// <summary>
/// 应用

View File

@ -12,7 +12,7 @@ public class GetTrackPushContentListVo
/// <summary>
/// 推送单号类型
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 服务商轨迹代码

View File

@ -10,5 +10,5 @@ public class GetTrackPushContentPageInputVO : PageInfoInput
/// <summary>
/// 配置单号类型,当为空时查所有,不区分单号类型
/// </summary>
public int? OrderNoType { get; set; }
public TrackOrderType? OrderNoType { get; set; }
}

View File

@ -1,4 +1,6 @@
namespace TrackCenter.Domain.Dtos.TrackPush;
using InterfaceForward.Domain.Shared.Helpers;
namespace TrackCenter.Domain.Dtos.TrackPush;
public class GetTrackPushContentPageOutputVO
{
@ -32,7 +34,12 @@ public class GetTrackPushContentPageOutputVO
/// <summary>
/// 推送单号类型
/// </summary>
public string OrderNoType { get; set; }
public string OrderNoTypeName => OrderNoType.GetDescription();
/// <summary>
/// 推送单号类型
/// </summary>
public TrackOrderType OrderNoType { get; set; }
/// <summary>
/// 推送排序

View File

@ -13,7 +13,7 @@ public class QueryTrackPullMappingsInfoVO
/// <summary>
/// 订单类型
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 服务商轨迹代码
@ -47,7 +47,7 @@ public class QueryTrackPullMappingsInputVO
public string AppKey { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int CustomerId { get; set; }
public string Customer { get; set; }
}

View File

@ -55,7 +55,7 @@ public class TrackPushContentConfigVO
/// <summary>
/// 推送单号类型(主数据枚举TrackOrderType)
/// </summary>
public int OrderType { get; set; }
public TrackOrderType OrderType { get; set; }
/// <summary>
/// 轨迹代码参数值

View File

@ -8,9 +8,9 @@ public class GetPageTrackTemplateListInputVo : PageInfoInput
public string AppKey { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int? CustomerId { get; set; }
public string? Customer { get; set; }
/// <summary>
/// 模版分类

View File

@ -36,9 +36,9 @@ public class GetTrackTemplateDetailVO
public int CategoryId { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int CustomerId { get; set; }
public string Customer { get; set; }
}
/// <summary>

View File

@ -8,9 +8,9 @@ public class GetTrackTemplateListInputVo
public string AppKey { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int? CustomerId { get; set; }
public string? Customer { get; set; }
/// <summary>
/// 模版分类

View File

@ -1,5 +1,3 @@
using TrackCenter.Domain.Enums;
namespace TrackCenter.Domain.Dtos.Warning;
public class BulkCloseCompleteWarningDetailsVO

View File

@ -1,5 +1,3 @@
using TrackCenter.Domain.Enums;
namespace TrackCenter.Domain.Dtos.Warning;
public class BulkCloseReturnWarningDetailsVO

View File

@ -1,5 +1,3 @@
using TrackCenter.Domain.Enums;
namespace TrackCenter.Domain.Dtos.Warning;
public class BulkCloseTransportWarningDetailsVO

View File

@ -1,5 +1,3 @@
using TrackCenter.Domain.Enums;
namespace TrackCenter.Domain.Dtos.Warning;
public class GetCompleteWarningDetailsVO

View File

@ -24,9 +24,9 @@ public class GetPageCompleteWarningDetailsInputVO : PageInfoInput
public int? Status { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int? CustomId { get; set; }
public string Customer { get; set; }
/// <summary>
/// 缺失轨迹状态id

View File

@ -27,9 +27,9 @@ public class GetPageReturnWarningDetailsInputVO : PageInfoInput
public int? Status { get; set; }
/// <summary>
/// 客户id
/// 客户
/// </summary>
public int? CustomId { get; set; }
public string Customer { get; set; }
/// <summary>
/// 轨迹状态id

View File

@ -26,9 +26,9 @@ public class GetPageTransportWarningDetailsInputVO : PageInfoInput
public int? Status { get; set; }
/// <summary>
/// 客户Id
/// 客户
/// </summary>
public int? CustomId { get; set; }
public string Customer { get; set; }
/// <summary>
/// 预警名称

View File

@ -1,5 +1,3 @@
using TrackCenter.Domain.Enums;
namespace TrackCenter.Domain.Dtos.Warning;
public class GetReturnWarningDetailsVO

View File

@ -1,5 +1,3 @@
using TrackCenter.Domain.Enums;
namespace TrackCenter.Domain.Dtos.Warning;
public class GetTransportWarningDetailsVO

View File

@ -1,24 +0,0 @@
using System.ComponentModel;
namespace TrackCenter.Domain.Enums;
/// <summary>
/// 枚举属性
/// </summary>
public enum EnumPropertyEnums
{
/// <summary>
/// 节点
/// </summary>
[Description("ServiceNode")] 节点,
/// <summary>
/// 单号类型
/// </summary>
[Description("TrackOrderType")] 单号类型,
/// <summary>
/// 轨迹发生地
/// </summary>
[Description("TrackLocationValue")] 轨迹发生地
}

Some files were not shown because too many files have changed in this diff Show More