add-interface:增加轨迹推送记录高级查询接口
This commit is contained in:
parent
555baa259d
commit
4eb1a9872f
@ -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; }
|
||||
}
|
||||
|
||||
@ -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; }
|
||||
}
|
||||
@ -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>
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@ -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, "操作成功");
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user