add-interface:增加轨迹推送记录高级查询接口

This commit is contained in:
hardstylewyl 2025-06-05 11:33:09 +08:00
parent 555baa259d
commit 4eb1a9872f
8 changed files with 251 additions and 44 deletions

View File

@ -1,75 +1,130 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace SJZY.Track.Application.Contract.Dtos.TrackOrder;
public class TrackPushRecordOutput
{
/// <summary>
/// 订单Id
/// </summary>
/// <summary> 订单Id </summary>
public int OrderId { get; set; }
/// <summary>
/// 接口通请求Id
/// </summary>
/// <summary> 订单号 </summary>
public string OrderNo { get; set; }
/// <summary> 接口通请求Id </summary>
public Guid RequestId { get; set; }
/// <summary>
/// 信息
/// </summary>
/// <summary> 接口通返回信息 </summary>
public string Message { get; set; } = null!;
/// <summary>
/// 操作类型
/// </summary>
/// <summary> 操作类型(新增/修改) </summary>
public string OptionType { get; set; } = null!;
/// <summary>
/// 轨迹状态
/// </summary>
/// <summary> 轨迹状态 </summary>
public string TrackStatus { get; set; } = null!;
/// <summary>
/// 轨迹内容代码
/// </summary>
/// <summary> 轨迹内容代码 </summary>
public string TrackCode { get; set; } = null!;
/// <summary>
/// 轨迹内容
/// </summary>
/// <summary> 轨迹内容 </summary>
public string TrackContent { get; set; } = null!;
/// <summary>
/// 轨迹发生地
/// </summary>
/// <summary> 轨迹发生地 </summary>
public string TrackPlace { get; set; } = null!;
/// <summary>
/// 轨迹发生时间
/// </summary>
/// <summary> 轨迹发生时间 </summary>
public DateTime TrackTime { get; set; }
/// <summary>
/// 轨迹发生时区
/// </summary>
/// <summary> 轨迹发生时区 </summary>
public float TrackTimeZone { get; set; }
/// <summary>
/// 轨迹发生时区
/// </summary>
/// <summary> 轨迹发生时区(GMT表示字符串) </summary>
public string TrackGTMTimeZone { get; set; } = null!;
/// <summary>
/// 是否成功
/// </summary>
/// <summary> 推送是否成功 </summary>
public bool IsSuccess { get; set; }
/// <summary>
/// 推送内容(json)
/// </summary>
/// <summary> 实际推送内容(json)</summary>
public string PushContent { get; set; } = null!;
/// <summary>创建人</summary>
/// <summary> 创建人 </summary>
public string? CreateUser { get; set; }
/// <summary>创建时间</summary>
/// <summary> 创建时间 </summary>
public DateTime CreateTime { get; set; }
/// <summary> 子系统代码 </summary>
public string SubSystemCode { get; set; }
/// <summary> 是否广播 </summary>
public bool IsToMq { get; set; }
/// <summary> 轨迹扩展信息json 可以直接反序列化为你的扩展模型 </summary>
public string? Extra { get; set; }
private static readonly JsonSerializerOptions _options = new()
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
};
/// <summary>
/// 获取实际推送内容
/// (请求接口通的,服务商收到的)
/// </summary>
/// <returns></returns>
public PushContent GetContentObj()
{
return JsonSerializer.Deserialize<PushContent>(PushContent, _options)!;
}
}
public class PushContent
{
public string OrderNo { get; set; }
// 如果不是全量推,则每个订单至多有一条轨迹数据
public List<TrackPushData> Data { get; set; }
public string Log { get; set; }
}
public class TrackPushData
{
// 轨迹EsId(预警功能可用后会有此字段)
[JsonPropertyName("_track_id")]
public string? TrackEsId { get; set; }
// 轨迹版本号(预警功能可用后会有此字段)
[JsonPropertyName("_track_version")]
public long? TrackVersion { get; set; }
[JsonPropertyName("location")]
public string? TrackPlace { get; set; }
// 根据推送配置的时间样式格式化后的
[JsonPropertyName("date")]
public string? TrackTimeStr { get; set; }
// 优先使用配置中的时区,配置无时区则使用轨迹的时区
[JsonPropertyName("timeZone")]
public float? TimeZone { get; set; }
// 轨迹内容英文
[JsonPropertyName("description")]
public string? TrackEnContent { get; set; }
// 轨迹内容中文
[JsonPropertyName("descriptionCn")]
public string? TrackContent { get; set; }
// 轨迹实际推送的code,在推送映射配置中的
[JsonPropertyName("code")]
public string? TrackContentCode { get; set; }
// 轨迹实际推送的状态,在推送映射配置中的
[JsonPropertyName("status")]
public string? TrackStatus { get; set; }
// 扩展字段,和外部的Extra数据相同
[JsonPropertyName("extra")]
public Dictionary<string, object?> Extra { get; set; }
}

View File

@ -0,0 +1,42 @@
using System.ComponentModel.DataAnnotations;
namespace SJZY.Track.Application.Contract.Dtos.TrackPush;
public class QueryPushRecordInput
{
/// <summary> 子系统id </summary>
[Required]
[Range(1, int.MaxValue)]
public int SubSystemId { get; set; }
/// <summary> 订单类型 </summary>
[Required]
[Range(1, int.MaxValue)]
public int OrderType { get; set; }
/// <summary> 订单号集合 </summary>
[Required]
[MaxLength(500)]
public List<string> OrderNos { get; set; } = new();
/// <summary> 结果类型 0:全部,1:只获取成功推送,2:只获取失败推送 </summary>
public int ResultType { get; set; }
/// <summary> 轨迹内容中文(推送映射配置的内容) </summary>
public string? PushContentCn { get; set; }
/// <summary> 轨迹内容英文(推送映射配置的内容)</summary>
public string? PushContentEn { get; set; }
/// <summary> 轨迹发生时间起始 </summary>
public DateTime? TrackTimeStart { get; set; }
/// <summary> 轨迹发生时间结束 </summary>
public DateTime? TrackTimeEnd { get; set; }
/// <summary> 轨迹推送时间起始(得到推送结果的时间) </summary>
public DateTime? TrackPushTimeStart { get; set; }
/// <summary> 轨迹推送时间结束(得到推送结果的时间) </summary>
public DateTime? TrackPushTimeEnd { get; set; }
}

View File

@ -5,7 +5,7 @@
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<GenerateDocumentationFile>True</GenerateDocumentationFile>
<Version>7.0.19</Version>
<Version>7.0.20</Version>
<GenerateDocumentationFile>True</GenerateDocumentationFile>
</PropertyGroup>
<ItemGroup>

View File

@ -28,4 +28,11 @@ public interface ITrackPushService : IRemoteService
/// <param name="input"></param>
/// <returns></returns>
public Task<UnifyResultDto<List<TrackPushRecordOutput>>> GetTrackPushRecordsAsync(OrderNoInfo input);
/// <summary>
/// 获取推送记录(批量)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public Task<UnifyResultDto<List<TrackPushRecordOutput>>> QueryTrackPushRecordsAsync(QueryPushRecordInput input);
}

View File

@ -46,4 +46,24 @@ public class StringHelper
return sb.ToString();
}
/// <summary>
/// 将字符串转换为Unicode转义字符串
/// </summary>
public static string ToUnicodeEscapeString(string input)
{
var sb = new StringBuilder();
foreach (char c in input)
{
if (c > 127)
{
sb.AppendFormat("\\u{0:x4}", (int)c);
}
else
{
sb.Append(c);
}
}
return sb.ToString();
}
}

View File

@ -5,6 +5,7 @@ using SJZY.Track.Application.Contract.Dtos.TrackOrder;
using SJZY.Track.Application.Contract.Dtos.TrackPush;
using SJZY.Track.Application.Contract.Events;
using SJZY.Track.Application.Contract.Services.ProvideServices;
using SJZY.Track.Application.Helpers;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Aggregates.TrackPushAggregate;
@ -205,4 +206,62 @@ public class TrackPushService : ApplicationService, ITrackPushService
var res = ObjectMapper.Map<List<TrackPushRecordIndex>, List<TrackPushRecordOutput>>(records);
return new UnifyResultDto<List<TrackPushRecordOutput>>(true, res, "操作成功");
}
/// <summary>
/// 高级查询推送日志
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="BusinessException"></exception>
[HttpPost("Track/QueryTrackPushRecords")]
[CustomerResult]
public async Task<UnifyResultDto<List<TrackPushRecordOutput>>> QueryTrackPushRecordsAsync(QueryPushRecordInput input)
{
var orderIds = await _orderRepository.GetListAsync(
x => x.SubSystemId == input.SubSystemId
&& x.OrderType == input.OrderType
&& input.OrderNos.Contains(x.OrderNo),
y => y.Id
);
if (orderIds.Count == 0) throw new BusinessException(message: "订单一个都不存在");
var isSuccess = input.ResultType switch
{
0 => new HashSet<bool>(1)
{
true,
false
},
1 => new HashSet<bool>(1)
{
true
},
2 => new HashSet<bool>(1)
{
false
},
_ => throw new BusinessException(message: "结果类型值只能取0,1,2")
};
var records = await _trackPushRecordEsRepository.GetTrackPushRecordsAsync(new GetTrackPushRecordsVO
{
OrderIds = orderIds.ToHashSet(),
IsSuccess = isSuccess,
// unicode转义之后
PushContentCn = string.IsNullOrWhiteSpace(input.PushContentCn) ? null : StringHelper.ToUnicodeEscapeString(input.PushContentCn),
PushContentEn = input.PushContentEn,
TrackTimeStart = input.TrackTimeStart,
TrackTimeEnd = input.TrackTimeEnd,
// 补正成GMT时间
TrackPushTimeStart = input.TrackPushTimeStart?.AddHours(-8),
TrackPushTimeEnd = input.TrackPushTimeEnd?.AddHours(-8),
});
if (records.Count == 0) return new UnifyResultDto<List<TrackPushRecordOutput>>(true, new List<TrackPushRecordOutput>(), "操作成功");
var res = ObjectMapper.Map<List<TrackPushRecordIndex>, List<TrackPushRecordOutput>>(records);
return new UnifyResultDto<List<TrackPushRecordOutput>>(true, res, "操作成功");
}
}

View File

@ -15,6 +15,24 @@ public class GetTrackPushRecordsVO
public bool HasEsIds => EsIds?.Count > 0;
public bool HasOrderIds => OrderIds?.Count > 0;
public bool HasEsIdVersionDict => EsIdVersionDict?.Count > 0;
/// <summary> 轨迹内容中文(推送映射配置的内容) </summary>
public string? PushContentCn { get; set; }
/// <summary> 轨迹内容英文(推送映射配置的内容)</summary>
public string? PushContentEn { get; set; }
/// <summary> 轨迹发生时间起始 </summary>
public DateTime? TrackTimeStart { get; set; }
/// <summary> 轨迹发生时间结束 </summary>
public DateTime? TrackTimeEnd { get; set; }
/// <summary> 轨迹推送时间起始(得到推送结果的时间) </summary>
public DateTime? TrackPushTimeStart { get; set; }
/// <summary> 轨迹推送时间结束(得到推送结果的时间) </summary>
public DateTime? TrackPushTimeEnd { get; set; }
}
public interface ITrackPushRecordEsRepository

View File

@ -96,9 +96,15 @@ public class TrackPushRecordEsRepository : ElasticSearchContextAbstract<TrackPus
isShouldQuery = true;
}
else if (input.HasOrderIds)
else
{
musts.Add(c => c.Terms(t => t.Field(f => f.OrderId).Terms(input.OrderIds)));
musts.AddIf(x => x.HasOrderIds, c => c.Terms(t => t.Field(f => f.OrderId).Terms(input.OrderIds)));
musts.AddIf(x => !string.IsNullOrWhiteSpace(x.PushContentCn), c => c.MatchPhrase(m => m.Field(f => f.PushContent).Query(input.PushContentCn)));
musts.AddIf(x => !string.IsNullOrWhiteSpace(x.PushContentEn), c => c.MatchPhrase(m => m.Field(f => f.PushContent).Query(input.PushContentEn)));
musts.AddIf(x => x.TrackTimeStart.HasValue, c => c.DateRange(r => r.Field(f => f.TrackTime).GreaterThanOrEquals(input.TrackTimeStart)));
musts.AddIf(x => x.TrackTimeEnd.HasValue, c => c.DateRange(r => r.Field(f => f.TrackTime).LessThanOrEquals(input.TrackTimeEnd)));
musts.AddIf(x => x.TrackPushTimeStart.HasValue, c => c.DateRange(r => r.Field(f => f.CreateTime).GreaterThanOrEquals(input.TrackPushTimeStart)));
musts.AddIf(x => x.TrackPushTimeEnd.HasValue, c => c.DateRange(r => r.Field(f => f.CreateTime).LessThanOrEquals(input.TrackPushTimeEnd)));
}
ISearchResponse<TrackPushRecordIndex> r;