From 8b05958ec5d3ede05b7d3734a2b8fe73b0555905 Mon Sep 17 00:00:00 2001
From: hardstylewyl <827778732@qq.com>
Date: Thu, 29 May 2025 18:06:03 +0800
Subject: [PATCH] =?UTF-8?q?add-interface:=E5=A2=9E=E5=8A=A0=E8=BD=A8?=
=?UTF-8?q?=E8=BF=B9=E6=8E=A8=E9=80=81=E8=AE=B0=E5=BD=95=E9=AB=98=E7=BA=A7?=
=?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Dtos/TrackOrder/TrackPushRecordOutput.cs | 137 ++++++++++++------
.../Dtos/TrackPush/QueryPushRecordInput.cs | 42 ++++++
.../ProvideServices/ITrackPushService.cs | 7 +
.../Helpers/StringHelper.cs | 20 +++
.../ProvideServices/TrackPushService.cs | 59 ++++++++
.../ITrackPushRecordEsRepository.cs | 18 +++
.../TrackPushRecordEsRepository.cs | 10 +-
7 files changed, 250 insertions(+), 43 deletions(-)
create mode 100644 src/SJZY.Track.Application.Contract/Dtos/TrackPush/QueryPushRecordInput.cs
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/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;