Merge branch 'S06' into test

This commit is contained in:
hardstylewyl 2024-12-17 17:51:47 +08:00
commit d09f1362fa
3 changed files with 204 additions and 34 deletions

View File

@ -72,23 +72,26 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
case OptionType.无:
return;
case OptionType.新增:
await DoPushAsync(@event);
//获取接口参数名称,稍后将用于轨迹扩展字段提取填充请求
var paramsNames1 = await GetExtraParamNamesAsync(@event.SubSystemCode);
await DoPushAsync(@event, paramsNames1);
break;
case OptionType.删除:
break;
case OptionType.修改:
await DoUpdateAsync(@event);
//获取接口参数名称,稍后将用于轨迹扩展字段提取填充请求
var paramsNames2 = await GetExtraParamNamesAsync(@event.SubSystemCode);
await DoUpdateAsync(@event, paramsNames2);
break;
default:
throw new ArgumentOutOfRangeException();
}
}
private async Task DoPushAsync(TrackPushEvent @event)
private async Task DoPushAsync(TrackPushEvent @event, List<string> paramNames)
{
var items = new List<object>();
TrackPushContentConfigDto? config;
if (@event.OperationMan == null)
{
foreach (var order in _orders)
@ -115,6 +118,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
};
var item = await BuiltPushItem(config, log);
item.Log = JsonConvert.SerializeObject(log);
//根据轨迹扩展内容填充
item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames));
items.Add(item);
}
}
@ -154,6 +159,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
};
var item = await BuiltPushItem(config, log);
item.Log = JsonConvert.SerializeObject(log);
//根据轨迹扩展内容填充
item.Data.ForEach(dict => FillExtraParam(track.Extra, dict, paramNames));
items.Add(item);
}
}
@ -176,7 +183,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
}
}
private async Task DoUpdateAsync(TrackPushEvent @event)
private async Task DoUpdateAsync(TrackPushEvent @event, List<string> paramNames)
{
var config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode);
if (config == null || !config.IsCanUpdate) return;
@ -199,6 +206,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
};
var item = BuiltUpdateItem(config, log);
item.Log = JsonConvert.SerializeObject(log);
//根据轨迹扩展内容填充
item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames));
items.Add(item);
}
@ -225,24 +234,36 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
var trackDatetime = log.TrackTime.AddHours(config.TrackTimeZone ?? log.TrackTimeZone - log.TrackTimeZone);
var trackDateStr = DateTimeFormat(trackDatetime, config.TrackTimeZone ?? log.TrackTimeZone, config);
var track = new TrackItem
{
// 推真实的发生地和发生时间(时间是计算后的)
Location = log.TrackPlace,
Date = trackDateStr,
TimeZone = config.TrackTimeZone ?? log.TrackTimeZone,
Description = config.TrackEnContentValue,
DescriptionCn = config.TrackContentValue,
Code = config.TrackContentCodeValue,
Status = config.TrackStatusValue,
Extra = config.ExpandFieldsValue
};
// var track = new TrackItem
// {
// // 推真实的发生地和发生时间(时间是计算后的)
// Location = log.TrackPlace,
// Date = trackDateStr,
// TimeZone = config.TrackTimeZone ?? log.TrackTimeZone,
// Description = config.TrackEnContentValue,
// DescriptionCn = config.TrackContentValue,
// Code = config.TrackContentCodeValue,
// Status = config.TrackStatusValue,
// Extra = config.ExpandFieldsValue
// };
var body = new TrackUpdateInput
{
OrderNo = log.OrderNo,
};
body.Data.Add(track);
var dict = new Dictionary<string, object>()
{
// 推真实的发生地和发生时间(时间是计算后的)
{ "Location", log.TrackPlace },
{ "Date", trackDateStr },
{ "TimeZone", config.TrackTimeZone ?? log.TrackTimeZone },
{ "Description", config.TrackEnContentValue },
{ "DescriptionCn", config.TrackContentValue },
{ "Code", config.TrackContentCodeValue },
{ "Status", config.TrackStatusValue },
{ "Extra", config.ExpandFieldsValue }
};
body.Data.Add(dict);
log.PushContent = body.ToJson();
return body;
@ -253,24 +274,36 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
var trackDatetime = log.TrackTime.AddHours(config.TrackTimeZone ?? log.TrackTimeZone - log.TrackTimeZone);
var trackDateStr = DateTimeFormat(trackDatetime, config.TrackTimeZone ?? log.TrackTimeZone, config);
var track = new TrackItem
{
// 推真实的发生地和发生时间(时间是计算后的)
Location = log.TrackPlace,
Date = trackDateStr,
TimeZone = config.TrackTimeZone ?? log.TrackTimeZone,
Description = config.TrackEnContentValue,
DescriptionCn = config.TrackContentValue,
Code = config.TrackContentCodeValue,
Status = config.TrackStatusValue,
Extra = config.ExpandFieldsValue
};
// var track = new TrackItem
// {
// // 推真实的发生地和发生时间(时间是计算后的)
// Location = log.TrackPlace,
// Date = trackDateStr,
// TimeZone = config.TrackTimeZone ?? log.TrackTimeZone,
// Description = config.TrackEnContentValue,
// DescriptionCn = config.TrackContentValue,
// Code = config.TrackContentCodeValue,
// Status = config.TrackStatusValue,
// Extra = config.ExpandFieldsValue
// };
var body = new TrackPushInput
{
OrderNo = log.OrderNo,
};
body.Data.Add(track);
var dict = new Dictionary<string, object>()
{
// 推真实的发生地和发生时间(时间是计算后的)
{ "Location", log.TrackPlace },
{ "Date", trackDateStr },
{ "TimeZone", config.TrackTimeZone ?? log.TrackTimeZone },
{ "Description", config.TrackEnContentValue },
{ "DescriptionCn", config.TrackContentValue },
{ "Code", config.TrackContentCodeValue },
{ "Status", config.TrackStatusValue },
{ "Extra", config.ExpandFieldsValue }
};
body.Data.Add(dict);
if (config.IsAllPush)
{
@ -278,7 +311,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
if (history != default)
{
body = JsonConvert.DeserializeObject<TrackPushInput>(history.PushContent);
body!.Data.Add(track);
body!.Data.Add(dict);
}
}
@ -335,4 +368,44 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
return dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffK");
}
/// <summary>
/// 获取来源系统接口的参数名
/// </summary>
/// <param name="subSystemCode"></param>
/// <returns></returns>
private async Task<List<string>> GetExtraParamNamesAsync(string subSystemCode)
{
using (Track2InterfaceRelaySubSystemContext.Use(
new Track2InterfaceRelaySubSystemContext(subSystemCode)))
{
var res = await _httpClientProxy.Service.GetSystemInterfaceByIdAsync(_options.CurrentValue.PushTrackInterfaceId);
if (res == null) return new List<string>();
return res.InParameterList
.Where(x => x.Alias.StartsWith(_options.CurrentValue.PushTrackItemParamAliasPrefix))
.Select(x => x.Name)
.ToList();
}
}
/// <summary>
/// 填充来源于轨迹扩展字段的参数
/// </summary>
/// <param name="trackExtra">轨迹明细扩展字段</param>
/// <param name="dict">要扩展的参数字典</param>
/// <param name="paramNames">来源扩展字段的参数名</param>
/// <returns></returns>
private void FillExtraParam(Dictionary<string, object>? trackExtra, Dictionary<string, object>? dict, List<string>? paramNames)
{
if (paramNames == null || paramNames.Count == 0) return;
if (dict == null) return;
if (trackExtra == null || trackExtra.Count == 0) return;
foreach (var item in
trackExtra.Where(x => x.Value != null && paramNames.Contains(x.Key)))
{
dict.TryAdd(item.Key, item.Value);
}
}
}

View File

@ -4,11 +4,17 @@ using BSI.Stack.Rabbit.Handler;
using Newtonsoft.Json;
using RabbitMQ.Client.Events;
using SJZY.Expand.ABP.Core.Logger;
using SJZY.Expand.ABP.Core.PublicMethords;
using SJZY.InterfaceRelay.Application.Contracts;
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
using SJZY.Track.Application.Contract.Dtos.TrackPush;
using SJZY.Track.Application.Contract.Events;
using SJZY.Track.Application.Helpers;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackContentAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Aggregates.TrackPushAggregate;
using SJZY.Track.Domain.Aggregates.TrackStatusAggregate;
using SJZY.Track.Domain.Enums;
using Volo.Abp.DependencyInjection;
@ -18,12 +24,24 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl
{
private readonly IOrderRepository _orderRepository;
private readonly ITrackPushRecordEsRepository _trackPushRecordEsRepository;
private readonly ITrackDetailsEsRepository _trackDetailsEsRepository;
private readonly ITrackStatusRepository _trackStatusRepository;
private readonly ITrackContentRepository _trackContentRepository;
private readonly RabbitClientBus _rabbitClientBus;
public TrackPushCompletedEventHandler(IOrderRepository orderRepository,
ITrackPushRecordEsRepository trackPushRecordEsRepository)
ITrackPushRecordEsRepository trackPushRecordEsRepository,
ITrackDetailsEsRepository trackDetailsEsRepository,
ITrackStatusRepository trackStatusRepository,
ITrackContentRepository trackContentRepository,
RabbitClientBus rabbitClientBus)
{
_orderRepository = orderRepository;
_trackPushRecordEsRepository = trackPushRecordEsRepository;
_trackDetailsEsRepository = trackDetailsEsRepository;
_trackStatusRepository = trackStatusRepository;
_trackContentRepository = trackContentRepository;
_rabbitClientBus = rabbitClientBus;
}
public ConsumeOptions Options()
@ -64,6 +82,16 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl
log.Message = @event.Message;
log.RequestId = @event.RequestId;
//查出推送轨迹,写入推送广播
var tracks = await _trackDetailsEsRepository
.GetListAsync(new[] { log.OrderId }, new List<string>
{
log.TrackCode
});
// 推送广播
await PublicTrackPushTopicAsync(tracks.First(), log, !log.IsSuccess, log.Message);
// 往es 写推送日志
await _trackPushRecordEsRepository.AddAsync(log);
@ -111,4 +139,70 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl
});
}
}
/// <summary>
/// 轨迹推送广播
/// </summary>
private async Task PublicTrackPushTopicAsync(TrackDetailsIndex track, TrackPushRecordIndex pushRecord, bool isFailure = false, string? errorMsg = null)
{
var statusList = await _trackStatusRepository.GetListAsync(m => m.SubSystemId == track.SubSystemId);
if (statusList == null)
return;
var contentList = await _trackContentRepository.GetTrackContentBySyetemIdAsync(track.SubSystemId);
if (contentList == null)
return;
var status = statusList.FirstOrDefault(m => m.Code == track.TrackStatusCode);
if (status == null || !status.IsToMq)
return;
var content = contentList.FirstOrDefault(m => m.TrackContentCode == track.TrackCode);
var data = new TrackPushEto
{
Option = pushRecord.OptionType == OptionType.新增.ToString() ? OptionType.新增 : OptionType.修改,
IsManualPush = !string.Equals(pushRecord.CreateUser, GlobalConst.SystemUser), //操作人不为系统用户,则认为是仍推送
IsFailure = isFailure,
FailureReason = errorMsg,
PushTime = DateTime.Now,
OperationMan = pushRecord.CreateUser,
EstimatedDeliveryDate = track.EstimatedDeliveryDate,
TrackPlacePostcode = track.TrackPlacePostcode,
TrackPlaceNation = track.TrackPlaceNation,
TrackPlaceNationId = track.TrackPlaceNationId,
TrackPlaceProvince = track.TrackPlaceProvince,
TrackPlaceProvinceId = track.TrackPlaceProvinceId,
TrackPlaceCity = track.TrackPlaceCity,
TrackPlaceCityId = track.TrackPlaceCityId,
Files = track.Files?.Select(x => new FileItemDto
{
OssKey = x.OssKey,
FileName = x.FileName
}).ToList(),
Remarks = track.Remarks,
Source = track.Source,
IsVisibility = track.IsVisibility,
TrackTimeZone = track.TrackTimeZone,
TrackTime = track.TrackTime,
TrackPlace = track.TrackPlace,
TrackStatusCode = track.TrackStatusCode,
EnStatus = track.TrackEnContent,
Content = track.TrackContent,
TrackCode = track.TrackCode,
SubSystemId = track.SubSystemId,
OrderNo = track.OrderNo,
OrderIdentifiers = new OrderIdentifier[]
{
new OrderIdentifier
{
OrderId = track.OrderId,
OrderNo = track.OrderNo,
OrderType = track.OrderType
}
},
Extra = track.Extra
};
_rabbitClientBus.Publish(GlobalConst.TrackPushExchange, $"TrackPush.{content.SubSystemCode}", Encoding.UTF8.GetBytes(data.ToJson()));
}
}

View File

@ -57,5 +57,8 @@ public partial class GlobalConst
/// </summary>
public const string TrackChangeExchange = "sjzy.track.on_track_change_ex";
/// <summary>
/// 轨迹推送通知交换机
/// </summary>
public const string TrackPushExchange = "sjzy.track.on_track_push_ex";
}