change:轨迹code相同,时间、发生地不同的,允许存在多条

This commit is contained in:
xiaolipro 2024-08-06 16:53:47 +08:00
parent 0b47412077
commit 3127a3a38e
15 changed files with 160 additions and 171 deletions

View File

@ -18,5 +18,5 @@ public class TrackDetail
public string? OriginContent { get; set; } public string? OriginContent { get; set; }
public string Location { get; set; } = null!; public string Location { get; set; } = null!;
public DateTime Time { get; set; } public DateTime Time { get; set; }
public float TimeZone { get; set; } public float? TimeZone { get; set; }
} }

View File

@ -13,13 +13,13 @@ public struct TrackRefreshStruct
public string? OriginTrackContent { get; set; } public string? OriginTrackContent { get; set; }
/// <summary> /// <summary>
/// 原轨迹报文 /// 原轨迹报文hash(刷新轨迹重复性校验使用)
/// </summary> /// </summary>
public string? OriginTrackData { get; set; } public string? OriginTrackDataHash { get; set; }
/// <summary> /// <summary>
/// 表示订单是否完成(只由轨迹刷新配置决定) /// 表示订单是否完成(只由轨迹刷新配置决定)
/// tips:能够使得IsCompleted为true的点,全局只有一个:轨迹刷新 /// todo:能够使得IsCompleted为true的点,全局只有一个:轨迹刷新??
/// </summary> /// </summary>
public bool IsCompleted { get; set; } public bool IsCompleted { get; set; }
} }

View File

@ -1,9 +1,8 @@
using System.Security.Cryptography; using DotNetCore.CAP.Filter;
using System.Text;
using DotNetCore.CAP.Filter;
using SJZY.Expand.ABP.Core; using SJZY.Expand.ABP.Core;
using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.Logger;
using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Expand.ABP.Core.PublicMethords;
using SJZY.Track.Application.Helpers;
using SJZY.Track.Domain.Consts; using SJZY.Track.Domain.Consts;
namespace SJZY.Track.Application.CAP; namespace SJZY.Track.Application.CAP;
@ -33,7 +32,7 @@ public class CapFilter : SubscribeFilter
context.DeliverMessage.Headers.TryGetValue("sjzy-arguments-hash", out var hash); context.DeliverMessage.Headers.TryGetValue("sjzy-arguments-hash", out var hash);
if (hash.IsNullOrEmpty()) // 计算参数hash if (hash.IsNullOrEmpty()) // 计算参数hash
{ {
hash = GetHash(argumentJsonStr); hash = StringHelper.GetHash(argumentJsonStr);
context.DeliverMessage.Headers["sjzy-arguments-hash"] = hash; context.DeliverMessage.Headers["sjzy-arguments-hash"] = hash;
} }
@ -76,22 +75,4 @@ public class CapFilter : SubscribeFilter
return Task.CompletedTask; return Task.CompletedTask;
} }
/// <summary>获取字符串的hash值</summary>
/// <param name="str"></param>
/// <returns></returns>
public static string GetHash(string str)
{
// 将字符串转换为字节
byte[] data = Encoding.UTF8.GetBytes(str);
// 创建SHA256实例
using SHA256 sha256 = SHA256.Create();
// 计算哈希值
byte[] hash = sha256.ComputeHash(data);
// 将哈希值转换为16进制字符串
return BitConverter.ToString(hash);
}
} }

View File

@ -1,50 +0,0 @@
using DotNetCore.CAP;
using SJZY.Track.Application.Contract.Events;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Consts;
using Volo.Abp.DependencyInjection;
namespace SJZY.Track.Application.CAP.EventHandlers;
public class TrackInsertForNotMappedEventHandler : ITransientDependency, ICapSubscribe
{
private readonly ITrackDetailsRepository _trackDetailsRepository;
public TrackInsertForNotMappedEventHandler(ITrackDetailsRepository trackDetailsRepository)
{
_trackDetailsRepository = trackDetailsRepository;
}
[CapSubscribe(GlobalConst.TrackInsertForNotMappedEventSubscribe)]
public async Task ConsumerAsync(TrackInsertForNotMappedEvent @event)
{
if (await _trackDetailsRepository.AnyAsync(@event.OrderId, @event.TrackTime))
{
return;
}
// 新增服务商轨迹到es
var track = new TrackDetailsIndex
{
IndexName = $"{GlobalConst.TrackIndex}-{DateTime.Now:yyyy.MM.dd}",
OrderId = @event.OrderId,
OrderNo = @event.OrderNo,
OrderType = @event.OrderType,
TrackPlace = @event.TrackPlace,
TrackTime = @event.TrackTime,
TrackTimeZone = @event.TrackTimeZone,
ServiceProviderName = @event.ServiceProviderName,
OriginTrackContent = @event.OriginTrackContent,
OriginTrackData = @event.OriginTrackData,
CreateUser = GlobalConst.SystemUser,
CreateTime = DateTime.Now
};
track.TrackCode = GlobalConst.EmptyString;
track.TrackStatus = GlobalConst.EmptyString;
track.TrackContent = GlobalConst.EmptyString;
track.TrackEnContent = GlobalConst.EmptyString;
track.ZeroTrackTime = track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone));
await _trackDetailsRepository.AddAsync(track);
}
}

View File

@ -107,9 +107,12 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
private async Task HandleTrackAsync(JToken trackToken, TrackPullParamWithContentConfigDto paramWithContentConfig, private async Task HandleTrackAsync(JToken trackToken, TrackPullParamWithContentConfigDto paramWithContentConfig,
TrackRefreshContext context) TrackRefreshContext context)
{ {
var originTrackData = JsonConvert.SerializeObject(trackToken); var originTrackDataHash = StringHelper.GetHash(JsonConvert.SerializeObject(trackToken));
// 如果已经存在一模一样的报文了说明处理过了,直接return // 如果已经存在一模一样的报文了说明处理过了,直接return
if (await _trackDetailsRepository.AnyAsync(context.OrderId, originTrackData)) return; if (await _trackDetailsRepository.AnyAsync(context.OrderId, originTrackDataHash))
{
return;
}
var paramConfig = paramWithContentConfig.ParamConfig; var paramConfig = paramWithContentConfig.ParamConfig;
var contentConfigs = paramWithContentConfig.ContentConfigs; var contentConfigs = paramWithContentConfig.ContentConfigs;
@ -178,10 +181,10 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
? null ? null
: trackToken[paramConfig.TrackPlaceName]?.Value<string>(); : trackToken[paramConfig.TrackPlaceName]?.Value<string>();
var hasPlaceBottomLine = false; //执行了兜底但是没有兜底住,需要记录 var hasPlaceBottomLine = false; //执行了兜底但是没有兜底住,需要记录
if (trackPlace.IsNullOrWhiteSpace() && matchedContentConfig?.TrackPlaceValue != null && matchedContentConfig.TrackPlaceValue.HasValue) if (trackPlace.IsNullOrWhiteSpace() && matchedContentConfig?.TrackPlaceValue is not null)
{ {
//兜底没配置的就不需要兜底,拉取的发生地没就没 //兜底没配置的就不需要兜底,拉取的发生地没就没
trackPlace = await GetPlaceByOrder(matchedContentConfig!.TrackPlaceValue.Value,context.OrderId); trackPlace = await GetPlaceByOrder(matchedContentConfig.TrackPlaceValue.Value, context.OrderId);
hasPlaceBottomLine = string.IsNullOrWhiteSpace(trackPlace); hasPlaceBottomLine = string.IsNullOrWhiteSpace(trackPlace);
} }
@ -199,31 +202,16 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
if (!trackTimeZone.HasValue && matchedContentConfig?.TrackZonePlaceValue is not null) if (!trackTimeZone.HasValue && matchedContentConfig?.TrackZonePlaceValue is not null)
{ {
//兜底没配置的就不需要兜底,拉取的发生地没就没 //兜底没配置的就不需要兜底,拉取的发生地没就没
var timezone= await GetTimezone(matchedContentConfig,context.OrderId); var timezone = await GetTimezone(matchedContentConfig, context.OrderId);
trackTimeZone = timezone; trackTimeZone = timezone;
hasTimezoneBottomLine = !timezone.HasValue; hasTimezoneBottomLine = !timezone.HasValue;
} }
// 没匹配上,新增服务商轨迹
if (matchedContentConfig is null) if (matchedContentConfig is null)
{ {
var notMappedEvent = new TrackInsertForNotMappedEvent await InsertNotMappedTrackAsync(trackToken, context, trackPlace, trackTime, trackTimeZone, paramConfig);
{
OrderId = context.OrderId,
OrderType = context.OrderType,
OrderNo = context.OrderNo,
ServiceProviderName = context.ServiceProviderName,
OriginTrackData = JsonConvert.SerializeObject(trackToken),
TrackPlace = trackPlace ?? GlobalConst.EmptyString,
TrackTime = trackTime ?? DateTime.Now,
TrackTimeZone = trackTimeZone ?? GlobalConst.NoneTrackTimeZone,
};
if (paramConfig.TrackContentName != null)
{
notMappedEvent.OriginTrackContent = trackToken[paramConfig.TrackContentName]?.Value<string>();
}
await _capPublisher.PublishAsync(GlobalConst.TrackInsertForNotMappedEventSubscribe, notMappedEvent);
return; return;
} }
@ -253,7 +241,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
TrackRefreshData = new TrackRefreshStruct TrackRefreshData = new TrackRefreshStruct
{ {
ServiceProviderName = context.ServiceProviderName, ServiceProviderName = context.ServiceProviderName,
OriginTrackData = originTrackData, OriginTrackDataHash = originTrackDataHash,
IsCompleted = matchedContentConfig.IsCompleted, IsCompleted = matchedContentConfig.IsCompleted,
OriginTrackContent = paramConfig.TrackContentName != null OriginTrackContent = paramConfig.TrackContentName != null
? trackToken[paramConfig.TrackContentName]?.Value<string>() ? trackToken[paramConfig.TrackContentName]?.Value<string>()
@ -263,22 +251,50 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
TrackCode = matchedContentConfig.TrackContentCode, TrackCode = matchedContentConfig.TrackContentCode,
TrackPlace = trackPlace ?? GlobalConst.EmptyString, TrackPlace = trackPlace ?? GlobalConst.EmptyString,
TrackTime = trackTime ?? DateTime.Now, TrackTime = trackTime ?? DateTime.Now,
TrackTimeZone = trackTimeZone ?? 8, TrackTimeZone = trackTimeZone ?? GlobalConst.NoneTrackTimeZone,
DeficiencyTagValue = deficiencyTagValue DeficiencyTagValue = deficiencyTagValue,
IsAdd = true,
}; };
trackUpsertEvent.IsAdd =
!await _trackDetailsRepository.AnyByCodeAsync(context.OrderId, matchedContentConfig.TrackContentCode);
await _capPublisher.PublishAsync(GlobalConst.TrackUpsertForRefreshSubscribe, trackUpsertEvent); await _capPublisher.PublishAsync(GlobalConst.TrackUpsertForRefreshSubscribe, trackUpsertEvent);
} }
private async Task InsertNotMappedTrackAsync(JToken trackToken, TrackRefreshContext context, string? trackPlace,
DateTime? trackTime, float? trackTimeZone, TrackPullParamConfigDto paramConfig)
{
// 新增服务商轨迹到es
var track = new TrackDetailsIndex
{
IndexName = $"{GlobalConst.TrackIndex}-{DateTime.Now:yyyy.MM.dd}",
OrderId = context.OrderId,
OrderType = context.OrderType,
OrderNo = context.OrderNo,
TrackPlace = trackPlace ?? GlobalConst.EmptyString,
TrackTime = trackTime ?? DateTime.Now,
TrackTimeZone = trackTimeZone ?? GlobalConst.NoneTrackTimeZone,
ServiceProviderName = context.ServiceProviderName,
OriginTrackDataHash = StringHelper.GetHash(JsonConvert.SerializeObject(trackToken)),
CreateUser = GlobalConst.SystemUser,
CreateTime = DateTime.Now
};
if (!paramConfig.TrackContentName.IsNullOrWhiteSpace())
{
track.OriginTrackContent =
trackToken[paramConfig.TrackContentName!]?.Value<string>() ?? GlobalConst.EmptyString;
}
track.ZeroTrackTime = track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone));
await _trackDetailsRepository.AddAsync(track);
}
/// <summary> /// <summary>
/// 根据订单id获取兜底位置 /// 根据订单id获取兜底位置
/// </summary> /// </summary>
/// <param name="trackValue"></param> /// <param name="trackValue"></param>
/// <param name="orderId"></param> /// <param name="orderId"></param>
/// <returns></returns> /// <returns></returns>
private Task<string?> GetPlaceByOrder(int trackValue,int orderId) private Task<string?> GetPlaceByOrder(int trackValue, int orderId)
{ {
Expression<Func<OrderEntity, string?>> resultExpression = Expression<Func<OrderEntity, string?>> resultExpression =
(TrackLocationValue)trackValue switch (TrackLocationValue)trackValue switch
@ -300,13 +316,12 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
/// <param name="matchedContentConfig"></param> /// <param name="matchedContentConfig"></param>
/// <param name="orderId"></param> /// <param name="orderId"></param>
/// <returns></returns> /// <returns></returns>
private async Task<float?> GetTimezone(TrackPullContentConfigDto matchedContentConfig,int orderId ) private async Task<float?> GetTimezone(TrackPullContentConfigDto matchedContentConfig, int orderId)
{ {
var placeOrCode = await GetPlaceByOrder(matchedContentConfig!.TrackZonePlaceValue.Value,orderId); var placeOrCode = await GetPlaceByOrder(matchedContentConfig!.TrackZonePlaceValue.Value, orderId);
string timezone = null; string timezone = null;
if (!string.IsNullOrEmpty(placeOrCode)) if (!string.IsNullOrEmpty(placeOrCode))
{ {
if (matchedContentConfig!.TrackZonePlaceValue.Value == (int)TrackLocationValue.ArrivalPort if (matchedContentConfig!.TrackZonePlaceValue.Value == (int)TrackLocationValue.ArrivalPort
|| matchedContentConfig!.TrackZonePlaceValue.Value == (int)TrackLocationValue.LeavePort) || matchedContentConfig!.TrackZonePlaceValue.Value == (int)TrackLocationValue.LeavePort)
{ {

View File

@ -2,11 +2,9 @@
using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.Logger;
using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Expand.ABP.Core.PublicMethords;
using SJZY.Track.Application.Contract.Events; using SJZY.Track.Application.Contract.Events;
using SJZY.Track.Application.Contract.Services;
using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Consts; using SJZY.Track.Domain.Consts;
using SJZY.Track.Domain.Dtos.Order;
using SJZY.Track.Domain.Queries; using SJZY.Track.Domain.Queries;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using OrderIdentifier = SJZY.Track.Application.Contract.Events.OrderIdentifier; using OrderIdentifier = SJZY.Track.Application.Contract.Events.OrderIdentifier;
@ -61,7 +59,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
{ {
ServiceProviderName = @event.TrackRefreshData.ServiceProviderName, ServiceProviderName = @event.TrackRefreshData.ServiceProviderName,
OriginTrackContent = @event.TrackRefreshData.OriginTrackContent, OriginTrackContent = @event.TrackRefreshData.OriginTrackContent,
OriginTrackData = @event.TrackRefreshData.OriginTrackData, OriginTrackDataHash = @event.TrackRefreshData.OriginTrackDataHash,
// tips:一定要重置为false,父级订单的完成不会使得关联订单完成,关联单也必须由刷新来完成或手动设置完成!! // tips:一定要重置为false,父级订单的完成不会使得关联订单完成,关联单也必须由刷新来完成或手动设置完成!!
IsCompleted = false IsCompleted = false
}; };
@ -113,14 +111,20 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
var orderIds = @event.OrderIdentifiers.Select(x => x.OrderId).ToArray(); var orderIds = @event.OrderIdentifiers.Select(x => x.OrderId).ToArray();
var tracks = await _trackDetailsRepository.GetListAsync(orderIds, @event.TrackCode, true); var tracks = await _trackDetailsRepository.GetListAsync(orderIds, @event.TrackCode, true);
var newOrderIds = orderIds.Except(tracks.Select(x => x.OrderId)).ToArray(); // important:轨迹code相同,时间、发生地不同的,允许存在多条!!
var newOrderIds = orderIds
.Except(tracks
.Where(x => x.TrackTime == @event.TrackTime && x.TrackPlace == @event.TrackPlace)
.Select(x => x.OrderId)
).ToArray();
var trackContents = await _provideQueries.MatchTrackContentAsync(newOrderIds, @event.TrackCode); var trackContents = await _provideQueries.MatchTrackContentAsync(newOrderIds, @event.TrackCode);
var insertTracks = new List<TrackDetailsIndex>(); var insertTracks = new List<TrackDetailsIndex>();
foreach (var order in @event.OrderIdentifiers) foreach (var order in @event.OrderIdentifiers)
{ {
var track = tracks.FirstOrDefault(x => x.OrderId == order.OrderId); var track = tracks.FirstOrDefault(x =>
x.OrderId == order.OrderId && x.TrackTime == @event.TrackTime && x.TrackPlace == @event.TrackPlace);
if (track == null && !@event.IsAdd) continue; // 不存在不让改 if (track == null && !@event.IsAdd) continue; // 不存在不让改
if (track != null && @event.IsAdd) continue; // 存在不让创建 if (track != null && @event.IsAdd) continue; // 存在不让创建
@ -138,8 +142,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
TrackTimeZone = @event.TrackTimeZone, TrackTimeZone = @event.TrackTimeZone,
ServiceProviderName = @event.TrackRefreshData.ServiceProviderName ?? GlobalConst.EmptyString, ServiceProviderName = @event.TrackRefreshData.ServiceProviderName ?? GlobalConst.EmptyString,
OriginTrackContent = @event.TrackRefreshData.OriginTrackContent ?? GlobalConst.EmptyString, OriginTrackContent = @event.TrackRefreshData.OriginTrackContent ?? GlobalConst.EmptyString,
OriginTrackData = @event.TrackRefreshData.OriginTrackData ?? GlobalConst.EmptyString, OriginTrackDataHash = @event.TrackRefreshData.OriginTrackDataHash ?? GlobalConst.EmptyString,
IsCanDelete = false,
CreateUser = @event.OperationMan ?? GlobalConst.SystemUser, CreateUser = @event.OperationMan ?? GlobalConst.SystemUser,
CreateTime = DateTime.Now CreateTime = DateTime.Now
}; };
@ -157,8 +160,9 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
track.TrackContent = trackContent.Content; track.TrackContent = trackContent.Content;
track.TrackEnContent = trackContent.EnContent; track.TrackEnContent = trackContent.EnContent;
track.IsCanDelete = trackContent.IsCanDelete; track.IsCanDelete = trackContent.IsCanDelete;
track.ZeroTrackTime = track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone)); track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1
? track.TrackTime
: track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone));
insertTracks.Add(track); insertTracks.Add(track);
} }
else else
@ -166,6 +170,9 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
track.TrackPlace = @event.TrackPlace; track.TrackPlace = @event.TrackPlace;
track.TrackTime = @event.TrackTime; track.TrackTime = @event.TrackTime;
track.TrackTimeZone = @event.TrackTimeZone; track.TrackTimeZone = @event.TrackTimeZone;
track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1
? track.TrackTime
: track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone));
track.UpdateUser = @event.OperationMan ?? GlobalConst.SystemUser; track.UpdateUser = @event.OperationMan ?? GlobalConst.SystemUser;
track.UpdateTime = DateTime.Now; track.UpdateTime = DateTime.Now;

View File

@ -1,9 +1,11 @@
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
namespace SJZY.Track.Application.Helpers namespace SJZY.Track.Application.Helpers;
public class StringHelper
{ {
public class StringHelper
{
/// <summary> /// <summary>
/// 只能输入英文字符和键盘上常用的符号 /// 只能输入英文字符和键盘上常用的符号
/// </summary> /// </summary>
@ -20,5 +22,27 @@ namespace SJZY.Track.Application.Helpers
var regex = new Regex(@"^[a-zA-Z\(\)@!#$%^&*_\-+=;:""'/><,.\s]+$"); var regex = new Regex(@"^[a-zA-Z\(\)@!#$%^&*_\-+=;:""'/><,.\s]+$");
return regex.IsMatch(input); return regex.IsMatch(input);
} }
/// <summary>获取字符串的hash值</summary>
/// <param name="str"></param>
/// <returns></returns>
public static string GetHash(string str)
{
// 将字符串转换为字节
byte[] data = Encoding.UTF8.GetBytes(str);
// 创建SHA256实例
using SHA256 sha256 = SHA256.Create();
// 计算哈希值
byte[] hash = sha256.ComputeHash(data);
// 将哈希值转换为16进制字符串
StringBuilder sb = new StringBuilder();
foreach (byte b in hash)
{
sb.Append(b.ToString("x2"));
}
return sb.ToString();
} }
} }

View File

@ -68,9 +68,14 @@ public class TrackPullService : ApplicationService
var attach = Base64Helper.SerializeObject(group.Key); var attach = Base64Helper.SerializeObject(group.Key);
// 批量获取轨迹 // 批量获取轨迹
var _ = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( var res = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync(
InterfaceRelayConst.GetTrackInterfaceCode, serviceProviderCode, data, GlobalConst.TrackRefreshSubscribe, InterfaceRelayConst.GetTrackInterfaceCode, serviceProviderCode, data, GlobalConst.TrackRefreshSubscribe,
attach); attach);
if (res.Code != InterfaceRelayConst.SuccessCode)
{
LogHelper.Error($"刷新轨迹失败:{res.ToJson()}");
}
} }
return true; return true;

View File

@ -42,8 +42,8 @@ public partial class TrackService
Content = x.TrackContent, Content = x.TrackContent,
OriginContent = x.OriginTrackContent, OriginContent = x.OriginTrackContent,
Location = x.TrackPlace, Location = x.TrackPlace,
Time = Math.Abs(x.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 ?x.TrackTime: x.ZeroTrackTime.AddHours(input.TimeZone ?? 8), Time = Math.Abs(x.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 ? x.TrackTime: x.ZeroTrackTime.AddHours(input.TimeZone ?? 8),
TimeZone = input.TimeZone ?? 8 TimeZone = Math.Abs(x.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1? null: input.TimeZone ?? 8
}).ToList(); }).ToList();
res.Add(item); res.Add(item);

View File

@ -5,6 +5,7 @@ using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackContentAggregate; using SJZY.Track.Domain.Aggregates.TrackContentAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Aggregates.TrackPushAggregate;
using SJZY.Track.Domain.Consts;
using SJZY.Track.Domain.Dtos.Order; using SJZY.Track.Domain.Dtos.Order;
using SJZY.Track.Domain.Dtos.TrackTemplate; using SJZY.Track.Domain.Dtos.TrackTemplate;
using SJZY.Track.Domain.Enums; using SJZY.Track.Domain.Enums;
@ -87,6 +88,10 @@ public class TrackOrderService : ApplicationService
{ {
a.TrackTimeZone = "GTM +00:00"; a.TrackTimeZone = "GTM +00:00";
} }
else if (Math.Abs(a.TrackTimeZoneValue - GlobalConst.NoneTrackTimeZone) < 1)
{
a.TrackTimeZone = "--";
}
else else
{ {
// 将小数形式的小时转换为时区偏移量 // 将小数形式的小时转换为时区偏移量

View File

@ -10,7 +10,7 @@ public interface ITrackDetailsRepository
Task<bool> AnyAsync(int orderId, DateTime trackTime); Task<bool> AnyAsync(int orderId, DateTime trackTime);
Task<bool> AnyAsync(int orderId, string originTrackData); Task<bool> AnyAsync(int orderId, string originTrackDataHash);
Task<bool> AnyByCodeAsync(int orderId, string trackCode); Task<bool> AnyByCodeAsync(int orderId, string trackCode);

View File

@ -30,37 +30,37 @@ public class TrackDetailsIndex : IdBaseIndex
/// <summary> /// <summary>
/// 轨迹状态 /// 轨迹状态
/// </summary> /// </summary>
public string TrackStatus { get; set; } = null!; public string TrackStatus { get; set; } = GlobalConst.EmptyString;
/// <summary> /// <summary>
/// 轨迹内容代码 /// 轨迹内容代码
/// </summary> /// </summary>
public string TrackCode { get; set; } = null!; public string TrackCode { get; set; } = GlobalConst.EmptyString;
/// <summary> /// <summary>
/// 轨迹内容 /// 轨迹内容
/// </summary> /// </summary>
public string TrackContent { get; set; } = null!; public string TrackContent { get; set; } = GlobalConst.EmptyString;
/// <summary>
/// 服务商
/// </summary>
public string? ServiceProviderName { get; set; }
/// <summary>
/// 原轨迹内容
/// </summary>
public string? OriginTrackContent { get; set; }
/// <summary>
/// 原轨迹报文
/// </summary>
public string? OriginTrackData { get; set; }
/// <summary> /// <summary>
/// 轨迹内容英文 /// 轨迹内容英文
/// </summary> /// </summary>
public string TrackEnContent { get; set; } = null!; public string TrackEnContent { get; set; } = GlobalConst.EmptyString;
/// <summary>
/// 服务商
/// </summary>
public string ServiceProviderName { get; set; } = null!;
/// <summary>
/// 原轨迹内容
/// </summary>
public string OriginTrackContent { get; set; } = null!;
/// <summary>
/// 原轨迹报文hash(刷新轨迹重复性校验使用)
/// </summary>
public string OriginTrackDataHash { get; set; } = null!;
/// <summary> /// <summary>
/// 轨迹发生地 /// 轨迹发生地

View File

@ -5,7 +5,7 @@ namespace SJZY.Track.Domain.VEntities;
/// <summary> /// <summary>
/// 空港 /// 空港
/// </summary> /// </summary>
[SugarTable("t_airport", "空港")] [SugarTable("v_airport", "空港")]
public class VAirportEntity : IFullAuditedBasicEntitys public class VAirportEntity : IFullAuditedBasicEntitys
{ {
[SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)] [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)]

View File

@ -3,7 +3,7 @@ using System;
namespace SJZY.Track.Domain.VEntities; namespace SJZY.Track.Domain.VEntities;
[SugarTable("t_city")] [SugarTable("v_city")]
public class VCityEntity : IFullAuditedBasicEntitys public class VCityEntity : IFullAuditedBasicEntitys
{ {
/// <summary> /// <summary>

View File

@ -34,6 +34,8 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
.Source(s2 => s2.Includes(fd => fd .Source(s2 => s2.Includes(fd => fd
.Field(f => f.IndexName) .Field(f => f.IndexName)
.Field(f => f.OrderId) .Field(f => f.OrderId)
.Field(f => f.TrackTime)
.Field(f => f.TrackPlace)
)) ))
.Size(1000) .Size(1000)
.Query(q => q .Query(q => q
@ -123,13 +125,13 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
return r.Hits.Count > 0; return r.Hits.Count > 0;
} }
public async Task<bool> AnyAsync(int orderId, string originTrackData) public async Task<bool> AnyAsync(int orderId, string originTrackDataHash)
{ {
var r = await Context.SearchAsync<TrackDetailsIndex>(x => x var r = await Context.SearchAsync<TrackDetailsIndex>(x => x
.Source(s => s.Includes(fd => fd.Field(f => f.TrackCode))) .Source(s => s.Includes(fd => fd.Field(f => f.TrackCode)))
.Query(q => .Query(q =>
q.Term(f => f.OrderId, orderId) q.Term(f => f.OrderId, orderId)
&& q.Term(f => f.OriginTrackData.Suffix("keyword"), originTrackData) && q.Term(f => f.OriginTrackDataHash.Suffix("keyword"), originTrackDataHash)
) )
); );