diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackOrder/TrackPushRecordOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackOrder/TrackPushRecordOutput.cs index 0dbf4bc9..fc841591 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackOrder/TrackPushRecordOutput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackOrder/TrackPushRecordOutput.cs @@ -1,75 +1,130 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + namespace SJZY.Track.Application.Contract.Dtos.TrackOrder; public class TrackPushRecordOutput { - /// - /// 订单Id - /// + /// 订单Id public int OrderId { get; set; } - /// - /// 接口通请求Id - /// + /// 订单号 + public string OrderNo { get; set; } + + /// 接口通请求Id public Guid RequestId { get; set; } - /// - /// 信息 - /// + /// 接口通返回信息 public string Message { get; set; } = null!; - /// - /// 操作类型 - /// + /// 操作类型(新增/修改) public string OptionType { get; set; } = null!; - /// - /// 轨迹状态 - /// + /// 轨迹状态 public string TrackStatus { get; set; } = null!; - /// - /// 轨迹内容代码 - /// + /// 轨迹内容代码 public string TrackCode { get; set; } = null!; - /// - /// 轨迹内容 - /// + /// 轨迹内容 public string TrackContent { get; set; } = null!; - /// - /// 轨迹发生地 - /// + /// 轨迹发生地 public string TrackPlace { get; set; } = null!; - /// - /// 轨迹发生时间 - /// + /// 轨迹发生时间 public DateTime TrackTime { get; set; } - /// - /// 轨迹发生时区 - /// + /// 轨迹发生时区 public float TrackTimeZone { get; set; } - /// - /// 轨迹发生时区 - /// + /// 轨迹发生时区(GMT表示字符串) public string TrackGTMTimeZone { get; set; } = null!; - /// - /// 是否成功 - /// + /// 推送是否成功 public bool IsSuccess { get; set; } - /// - /// 推送内容(json) - /// + /// 实际推送内容(json) public string PushContent { get; set; } = null!; - /// 创建人 + /// 创建人 public string? CreateUser { get; set; } - /// 创建时间 + /// 创建时间 public DateTime CreateTime { get; set; } + + /// 子系统代码 + public string SubSystemCode { get; set; } + + /// 是否广播 + public bool IsToMq { get; set; } + + /// 轨迹扩展信息json 可以直接反序列化为你的扩展模型 + public string? Extra { get; set; } + + private static readonly JsonSerializerOptions _options = new() + { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, + }; + /// + /// 获取实际推送内容 + /// (请求接口通的,服务商收到的) + /// + /// + public PushContent GetContentObj() + { + return JsonSerializer.Deserialize(PushContent, _options)!; + } +} + +public class PushContent +{ + public string OrderNo { get; set; } + + // 如果不是全量推,则每个订单至多有一条轨迹数据 + public List 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 Extra { get; set; } } diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/QueryPushRecordInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/QueryPushRecordInput.cs new file mode 100644 index 00000000..3957baf0 --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/QueryPushRecordInput.cs @@ -0,0 +1,42 @@ +using System.ComponentModel.DataAnnotations; + +namespace SJZY.Track.Application.Contract.Dtos.TrackPush; + +public class QueryPushRecordInput +{ + /// 子系统id + [Required] + [Range(1, int.MaxValue)] + public int SubSystemId { get; set; } + + /// 订单类型 + [Required] + [Range(1, int.MaxValue)] + public int OrderType { get; set; } + + /// 订单号集合 + [Required] + [MaxLength(500)] + public List OrderNos { get; set; } = new(); + + /// 结果类型 0:全部,1:只获取成功推送,2:只获取失败推送 + public int ResultType { get; set; } + + /// 轨迹内容中文(推送映射配置的内容) + public string? PushContentCn { get; set; } + + /// 轨迹内容英文(推送映射配置的内容) + public string? PushContentEn { get; set; } + + /// 轨迹发生时间起始 + public DateTime? TrackTimeStart { get; set; } + + /// 轨迹发生时间结束 + public DateTime? TrackTimeEnd { get; set; } + + /// 轨迹推送时间起始(得到推送结果的时间) + public DateTime? TrackPushTimeStart { get; set; } + + /// 轨迹推送时间结束(得到推送结果的时间) + public DateTime? TrackPushTimeEnd { get; set; } +} diff --git a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj index de96bb40..e8268247 100644 --- a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj +++ b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj @@ -5,7 +5,7 @@ net7.0 True - 7.0.19 + 7.0.20 True diff --git a/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackPushService.cs b/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackPushService.cs index b7029aa6..660dca49 100644 --- a/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackPushService.cs +++ b/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackPushService.cs @@ -28,4 +28,11 @@ public interface ITrackPushService : IRemoteService /// /// public Task>> GetTrackPushRecordsAsync(OrderNoInfo input); + + /// + /// 获取推送记录(批量) + /// + /// + /// + public Task>> QueryTrackPushRecordsAsync(QueryPushRecordInput input); } diff --git a/src/SJZY.Track.Application/Helpers/StringHelper.cs b/src/SJZY.Track.Application/Helpers/StringHelper.cs index 32fca43e..713445b5 100644 --- a/src/SJZY.Track.Application/Helpers/StringHelper.cs +++ b/src/SJZY.Track.Application/Helpers/StringHelper.cs @@ -46,4 +46,24 @@ public class StringHelper return sb.ToString(); } + + /// + /// 将字符串转换为Unicode转义字符串 + /// + 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(); + } } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs index e0f58e74..af36f1a7 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs @@ -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>(records); return new UnifyResultDto>(true, res, "操作成功"); } + + /// + /// 高级查询推送日志 + /// + /// + /// + /// + [HttpPost("Track/QueryTrackPushRecords")] + [CustomerResult] + public async Task>> 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(1) + { + true, + false + }, + 1 => new HashSet(1) + { + true + }, + 2 => new HashSet(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>(true, new List(), "操作成功"); + + var res = ObjectMapper.Map, List>(records); + + return new UnifyResultDto>(true, res, "操作成功"); + } } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordEsRepository.cs index 6124a832..95b336d3 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordEsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordEsRepository.cs @@ -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; + + /// 轨迹内容中文(推送映射配置的内容) + public string? PushContentCn { get; set; } + + /// 轨迹内容英文(推送映射配置的内容) + public string? PushContentEn { get; set; } + + /// 轨迹发生时间起始 + public DateTime? TrackTimeStart { get; set; } + + /// 轨迹发生时间结束 + public DateTime? TrackTimeEnd { get; set; } + + /// 轨迹推送时间起始(得到推送结果的时间) + public DateTime? TrackPushTimeStart { get; set; } + + /// 轨迹推送时间结束(得到推送结果的时间) + public DateTime? TrackPushTimeEnd { get; set; } } public interface ITrackPushRecordEsRepository diff --git a/src/SJZY.Track.Repository/Repositories/TrackPushRecordEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackPushRecordEsRepository.cs index 1eb9aa68..75c4fa56 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackPushRecordEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackPushRecordEsRepository.cs @@ -96,9 +96,15 @@ public class TrackPushRecordEsRepository : ElasticSearchContextAbstract 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 r;