全量推送

This commit is contained in:
李鹏军 2024-04-01 16:07:35 +08:00
parent 3ebbe620af
commit e85e3244bf
6 changed files with 86 additions and 99 deletions

View File

@ -1,4 +1,6 @@
using DotNetCore.CAP;
using Newtonsoft.Json.Linq;
using SJZY.Expand.ABP.Core.PublicMethords;
using SJZY.InterfaceRelay.Application.Contracts;
using SJZY.Track.Application.Contract.Dtos.TrackPush;
using SJZY.Track.Application.Contract.Events;
@ -37,17 +39,36 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
var order = await _orderRepository.GetFirstAsync(x =>
x.Id == @event.OrderId, x => new
{
x.SubSystemId, x.LatestPushTrackCode, x.CustomId, x.OrderType
x.SubSystemId, x.LatestPushTrackCode, x.CustomId
});
if (order == null) return;
TrackPushContentConfigDto? config = null;
var log = new TrackPushRecordIndex
{
IndexName = $"{GlobalConst.TrackPushRecordsIndex}-{DateTime.Now:yyyy.MM.dd}",
RequestId = res.RequestId,
Message = res.Msg,
OptionType = @event.OptionType.ToString(),
OrderId = @event.OrderId,
TrackStatus = @event.TrackStatus,
TrackCode = @event.TrackCode,
TrackContent = @event.TrackContent,
TrackPlace = @event.TrackPlace,
TrackTime = @event.TrackTime,
TrackTimeZone = @event.TrackTimeZone,
CreateUser = @event.OperationMan ?? GlobalConst.SystemUser,
CreateTime = DateTime.Now
};
var allPush = false;
switch (@event.OptionType)
{
case OptionType.无:
return;
case OptionType.新增:
if (@event.OperationMan == null) // 系统推送需要推断
if (@event.OperationMan == null)
{
// 推送新增,需要根据上一次的推送 推断 本次推送 是否可行
config = await _trackPushCacheService.IsValidPushAsync(order.SubSystemId, order.CustomId,
@ -55,16 +76,16 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
}
else
{
// 手工推送不推断,直接无脑推
// 手工推送单条不推断,直接无脑推
config = await _trackPushCacheService.GetPushContentConfigAsync(order.SubSystemId, order.CustomId,
@event.TrackCode);
if (config is { IsAllPush: true })
{
}
}
if (config == null) return;
// 当前发生的轨迹不是要推送的,直接结束
if (config.TrackCode != @event.TrackCode) return;
res = await DoAddAsync(@event, config);
await DoAddAsync(@event, config, log, allPush);
break;
case OptionType.删除:
break;
@ -72,41 +93,16 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
config = await _trackPushCacheService.GetPushContentConfigAsync(order.SubSystemId, order.CustomId,
@event.TrackCode);
if (config == null || !config.IsCanUpdate) return;
res = await DoUpdateAsync(@event, config);
await DoUpdateAsync(@event, config, log);
break;
default:
throw new ArgumentOutOfRangeException();
}
var isSuccess = res.Code == InterfaceRelayConst.SuccessCode;
if (config == null) return;
// 往es 写推送日志
await _trackPushRecordsRepository.AddAsync(new TrackPushRecordIndex
{
IndexName = $"{GlobalConst.TrackPushRecordsIndex}-{DateTime.Now:yyyy.MM.dd}",
RequestId = res.RequestId,
Message = res.Msg,
OptionType = @event.OptionType.ToString(),
OrderId = @event.OrderId,
OrderType = order.OrderType,
OrderNo = @event.OrderNo,
TrackStatus = @event.TrackStatus,
TrackCode = @event.TrackCode,
TrackContent = @event.TrackContent,
TrackPlace = @event.TrackPlace,
TrackTime = @event.TrackTime,
TrackTimeZone = @event.TrackTimeZone,
TrackContentCodeValue = config.TrackContentCodeValue,
TrackContentValue = config.TrackContentValue,
TrackEnContentValue = config.TrackEnContentValue,
TrackStatusValue = config.TrackStatusValue,
ExpandFieldsValue = config.ExpandFieldsValue,
IsSuccess = isSuccess,
CreateUser = @event.OperationMan ?? GlobalConst.SystemUser,
CreateTime = DateTime.Now
});
await _trackPushRecordsRepository.AddAsync(log);
// 同步去更新订单主表
await TrackPushAfterUpdateOrderAsync(new TrackPushAfterUpdateOrderDto
@ -114,7 +110,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
OptionType = @event.OptionType,
OrderId = @event.OrderId,
TrackCode = @event.TrackCode,
IsSuccess = isSuccess,
IsSuccess = log.IsSuccess,
Message = res.Msg
});
}
@ -149,15 +145,10 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
});
}
private async Task<InterfaceRelayUnifyResultDto> DoAddAsync(TrackPushEvent @event,
TrackPushContentConfigDto config)
private async Task DoAddAsync(TrackPushEvent @event,
TrackPushContentConfigDto config, TrackPushRecordIndex log, bool allPush)
{
var data = new
{
orderNo = @event.OrderNo,
data = new[]
{
new
var track = new
{
// 推真实的发生地和发生时间(时间是计算后的)
location = @event.TrackPlace,
@ -169,19 +160,33 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
code = config.TrackContentCodeValue,
status = config.TrackStatusValue,
extra = config.ExpandFieldsValue
}
}
};
JObject body = JObject.FromObject(new
{
orderNo = @event.OrderNo,
data = new[] { track }
});
var res = await _httpClientProxy.Service.ForwardWithSubscribeAsync(InterfaceRelayConst.PushTrackInterfaceCode,
config.ServiceProviderCode, data);
return res;
if (allPush)
{
var history = await _trackPushRecordsRepository.GetLatestTrackPushRecordAsync(@event.OrderId);
if (history != default)
{
body = JObject.Parse(history.PushContent);
((JArray)body["data"]!).Add(track);
}
}
private async Task<InterfaceRelayUnifyResultDto> DoUpdateAsync(TrackPushEvent @event,
TrackPushContentConfigDto config)
var res = await _httpClientProxy.Service.ForwardWithSubscribeAsync(InterfaceRelayConst.PushTrackInterfaceCode,
config.ServiceProviderCode, body);
log.PushContent = body.ToJson();
log.IsSuccess = res.Code == InterfaceRelayConst.SuccessCode;
}
private async Task DoUpdateAsync(TrackPushEvent @event,
TrackPushContentConfigDto config, TrackPushRecordIndex log)
{
var data = new
{
@ -208,6 +213,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
var res = await _httpClientProxy.Service.ForwardWithSubscribeAsync(InterfaceRelayConst.TrackUpdateInterfaceCode,
config.ServiceProviderCode, data);
return res;
log.PushContent = data.ToJson();
log.IsSuccess = res.Code == InterfaceRelayConst.SuccessCode;
}
}

View File

@ -109,6 +109,13 @@ public class TrackPushService : ApplicationService
[HttpGet("Track/GetTrackPushRecords")]
public async Task<List<TrackPushRecordIndex>> GetTrackPushRecordsAsync(OrderNoInfo input)
{
return await _trackPushRecordsRepository.GetTrackPushRecordsAsync(input.OrderNo, input.OrderType);
var orderId = await _orderRepository.GetFirstAsync(x =>
x.OrderType == input.OrderType && input.OrderNo == x.OrderNo, x => x.Id);
if (orderId == default)
{
throw new BusinessException(message: "订单不存在");
}
return await _trackPushRecordsRepository.GetTrackPushRecordsAsync(orderId);
}
}

View File

@ -66,7 +66,7 @@ public class TrackPushCacheService : ITrackPushCacheService
}
}
return matched != null && matched.TrackCode == trackCode ? matched : default;
return matched != null && matched.TrackCode == trackCode && matched.IsAutoPush ? matched : default;
}
public async Task<List<TrackPushContentConfigDto>?> SetPushContentConfigsAsync(int? id = null,

View File

@ -16,5 +16,10 @@ public interface ITrackPushRecordsRepository
/// <returns></returns>
Task<List<TrackPushRecordIndex>> GetTrackPushRecordsAsync(int orderId);
Task<List<TrackPushRecordIndex>> GetTrackPushRecordsAsync(string inputOrderNo, int inputOrderType);
/// <summary>
/// 获取最新轨迹推送记录
/// </summary>
/// <param name="orderId"></param>
/// <returns></returns>
Task<TrackPushRecordIndex?> GetLatestTrackPushRecordAsync(int orderId);
}

View File

@ -17,16 +17,6 @@ public class TrackPushRecordIndex : IdBaseIndex
/// </summary>
public int OrderId { get; set; }
/// <summary>
/// 订单号
/// </summary>
public string OrderNo { get; set; } = null!;
/// <summary>
/// 订单类型(主数据枚举TrackOrderType)
/// </summary>
public int OrderType { get; set; }
/// <summary>
/// 接口通请求Id
/// </summary>
@ -78,29 +68,9 @@ public class TrackPushRecordIndex : IdBaseIndex
public bool IsSuccess { get; set; }
/// <summary>
/// 轨迹代码参数值
/// 推送内容(json)
/// </summary>
public string? TrackContentCodeValue { get; set; }
/// <summary>
/// 轨迹内容参数值
/// </summary>
public string? TrackContentValue { get; set; }
/// <summary>
/// 轨迹内容英文参数值
/// </summary>
public string? TrackEnContentValue { get; set; }
/// <summary>
/// 轨迹状态参数值
/// </summary>
public string? TrackStatusValue { get; set; }
/// <summary>
/// 扩展字段参数值
/// </summary>
public string? ExpandFieldsValue { get; set; }
public string PushContent { get; set; } = null!;
/// <summary>创建人</summary>
public string? CreateUser { get; set; }

View File

@ -41,17 +41,16 @@ public class TrackPushRecordsRepository : ElasticSearchContextAbstract<TrackDeta
return data.Documents.ToList();
}
public async Task<List<TrackPushRecordIndex>> GetTrackPushRecordsAsync(string orderNo, int orderType)
public async Task<TrackPushRecordIndex?> GetLatestTrackPushRecordAsync(int orderId)
{
var data = await Context.SearchAsync<TrackPushRecordIndex>(x => x
.Index(GlobalConst.TrackPushRecordsIndex)
.Query(q =>
q.Term(t => t.OrderNo.Suffix("keyword"), orderNo)
&& q.Term(f => f.OrderType, orderType)
q.Term(t => t.OrderId, orderId)
)
.Size(1000)
.Sort(s => s.Field(f => f.CreateTime, SortOrder.Descending)));
return data.Documents.ToList();
return data.Documents.FirstOrDefault();
}
}