还原鹏军推送逻辑
This commit is contained in:
parent
4473936577
commit
0b6e20da3f
@ -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)!;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user