还原鹏军推送逻辑

This commit is contained in:
hardstylewyl 2025-01-15 11:11:55 +08:00
parent 4473936577
commit 0b6e20da3f

View File

@ -352,103 +352,35 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
if (config.IsAllPush)
{
var history = await _trackPushRecordEsRepository.GetLatestTrackPushRecordAsync(log.OrderId);
//找到历史中推送成功的轨迹
var trackPushRecords = await _trackPushRecordEsRepository.GetHistorySuccessTrackPushRecordAsync(log.OrderId);
//构建标识符,code+比较字段的值(如果提供的比较字段,否则使用轨迹时间)
var pushIdentitySuccess = trackPushRecords.Select(x =>
{
//寻找映射配置
var code = _pushConfigs.First(y => y.TrackCode == x.TrackCode).TrackContentCodeValue;
if (string.IsNullOrWhiteSpace(compareFields))
return code;
//尝试从扩展中提取目标值
var extraValue = TextJsonHelper.ExtractValue(x.Extra, compareFields);
return code + extraValue;
}).ToHashSet();
if (history != default)
{
body = TextJsonHelper.Deserialize<TrackPushInput>(history.PushContent);
//todo-test:在历史选出推送成功的历史轨迹
body!.Data = body.Data.Where(x =>
{
var code = ((JsonElement) x["code"]!).GetString();
if (string.IsNullOrWhiteSpace(compareFields))
return pushIdentitySuccess.Contains(code);
var isMatch = ((JsonElement) x["extra"]!).TryGetProperty(compareFields, out var jsonElement);
var extraValue = isMatch ? TextJsonHelper.GetString(jsonElement) : null;
return pushIdentitySuccess.Contains(code + extraValue);
}).ToList();
//添加当前要推送的轨迹
body.Data.Add(cur);
if (config.IsAllPushWithLatest)
{
//历史轨迹中同一个code+比较字段联合作为key最新的一个
var dict = new Dictionary<string, (string dateStr, object dict)>();
//todo-test:根据code和比较字段值分组,在每组里选出一个创建时间最新的
foreach (var x in body.Data)
//同code同比较字段保证唯一
var old = body!.Data
.Where(x =>
{
//反序列化出的JsonElement和字典字符串类型做比较
var a = ((JsonElement) x["code"]!).GetString();
var b = cur["code"]!.ToString(); //tips: 需要要将object类型的字符串转为string类型,否则使用的是引用比较,反序列化出的string一定和本地string引用不同
return a == b;
}).WhereIf(!compareFields.IsNullOrWhiteSpace(), x =>
{
if (x["extra"] == null || log.Extra == null) return false;
return TextJsonHelper.EqByJsonElementField(x["extra"]!, TextJsonHelper.Deserialize<JsonElement>(log.Extra), compareFields!);
})
.FirstOrDefault();
if (old != null)
{
var code = string.Empty;
var dateStr = string.Empty;
var key = string.Empty;
if (x["code"] is JsonElement codeEl) code = codeEl.GetString()!;
else code = x["code"]!.ToString();
if (x["date"] is JsonElement dateEl) dateStr = dateEl.GetString()!;
else dateStr = x["date"]!.ToString();
if (string.IsNullOrWhiteSpace(compareFields))
key = code;
else
{
var isMatch = ((JsonElement) x["extra"]!).TryGetProperty(compareFields, out var jsonElement);
var extraValue = isMatch ? TextJsonHelper.GetString(jsonElement) : null;
key = code + extraValue;
}
//只保留最新的一条数据
if (dict.TryGetValue(key, out var tuple))
{
//如果当前值创建时间大于历史值,则替换历史值
if (DateTime.Parse(dateStr) > DateTime.Parse(tuple.dateStr))
dict[key] = (dateStr, x);
}
else
dict[key] = (dateStr, x);
body.Data.Remove(old);
}
// //同code同比较字段保证唯一
// var old = body!.Data
// .Where(x =>
// {
// //反序列化出的JsonElement和字典字符串类型做比较
// var a = ((JsonElement) x["code"]!).GetString();
// var b = cur["code"]!.ToString(); //tips: 需要要将object类型的字符串转为string类型,否则使用的是引用比较,反序列化出的string一定和本地string引用不同
// return a == b;
// }).WhereIf(!compareFields.IsNullOrWhiteSpace(), x =>
// {
// if (x["extra"] == null || log.Extra == null) return false;
// return TextJsonHelper.EqByJsonElementField(x["extra"]!, TextJsonHelper.Deserialize<JsonElement>(log.Extra), compareFields!);
// })
// .FirstOrDefault();
//
// if (old != null)
// {
// body.Data.Remove(old);
// }
//选出每个组最新的轨迹
body.Data = dict.Values.Select(x => x.dict).Cast<Dictionary<string, object?>>().ToList();
}
// //添加当前要推送的轨迹
// body.Data.Add(cur);
body!.Data.Add(cur);
}
//todo-test:按推送映射顺序排序
}
log.PushContent = TextJsonHelper.Serialize(body)!;