还原鹏军推送逻辑
This commit is contained in:
parent
4473936577
commit
0b6e20da3f
@ -352,103 +352,35 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
if (config.IsAllPush)
|
if (config.IsAllPush)
|
||||||
{
|
{
|
||||||
var history = await _trackPushRecordEsRepository.GetLatestTrackPushRecordAsync(log.OrderId);
|
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)
|
if (history != default)
|
||||||
{
|
{
|
||||||
body = TextJsonHelper.Deserialize<TrackPushInput>(history.PushContent);
|
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)
|
if (config.IsAllPushWithLatest)
|
||||||
{
|
{
|
||||||
//历史轨迹中同一个code+比较字段联合作为key最新的一个
|
//同code同比较字段保证唯一
|
||||||
var dict = new Dictionary<string, (string dateStr, object dict)>();
|
var old = body!.Data
|
||||||
//todo-test:根据code和比较字段值分组,在每组里选出一个创建时间最新的
|
.Where(x =>
|
||||||
foreach (var x in body.Data)
|
|
||||||
{
|
{
|
||||||
var code = string.Empty;
|
//反序列化出的JsonElement和字典字符串类型做比较
|
||||||
var dateStr = string.Empty;
|
var a = ((JsonElement) x["code"]!).GetString();
|
||||||
var key = string.Empty;
|
var b = cur["code"]!.ToString(); //tips: 需要要将object类型的字符串转为string类型,否则使用的是引用比较,反序列化出的string一定和本地string引用不同
|
||||||
if (x["code"] is JsonElement codeEl) code = codeEl.GetString()!;
|
return a == b;
|
||||||
else code = x["code"]!.ToString();
|
}).WhereIf(!compareFields.IsNullOrWhiteSpace(), x =>
|
||||||
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);
|
if (x["extra"] == null || log.Extra == null) return false;
|
||||||
var extraValue = isMatch ? TextJsonHelper.GetString(jsonElement) : null;
|
return TextJsonHelper.EqByJsonElementField(x["extra"]!, TextJsonHelper.Deserialize<JsonElement>(log.Extra), compareFields!);
|
||||||
key = code + extraValue;
|
})
|
||||||
}
|
.FirstOrDefault();
|
||||||
|
|
||||||
//只保留最新的一条数据
|
if (old != null)
|
||||||
if (dict.TryGetValue(key, out var tuple))
|
|
||||||
{
|
{
|
||||||
//如果当前值创建时间大于历史值,则替换历史值
|
body.Data.Remove(old);
|
||||||
if (DateTime.Parse(dateStr) > DateTime.Parse(tuple.dateStr))
|
|
||||||
dict[key] = (dateStr, x);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
dict[key] = (dateStr, x);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// //同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)!;
|
log.PushContent = TextJsonHelper.Serialize(body)!;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user