Merge branch 'S06' into test

# Conflicts:
#	src/SJZY.Track.Api/appsettings.json
This commit is contained in:
hardstylewyl 2024-12-26 10:52:05 +08:00
commit c763e2a1d5
11 changed files with 231 additions and 433 deletions

View File

@ -8,9 +8,9 @@
"AppId": "SJZY.Track.Configuration",
"Env": "DEV",
"Namespace": "test",
"MetaServer": "http://apollo-service-test-apollo-configservice.apollo.svc.cluster.local:8080",
"MetaServer": "https://apollo.test.shijizhongyun.com",
"ConfigServer": [
"http://apollo-service-test-apollo-configservice.apollo.svc.cluster.local:8080"
"https://apollo.test.shijizhongyun.com"
]
}
},

View File

@ -0,0 +1,82 @@
namespace SJZY.Track.Application.Contract.Events;
/// <summary>
/// 轨迹推送广播模型
/// </summary>
public class TrackPushCompletedEvent
{
/// <summary>
/// 是否为手动推送
/// </summary>
public bool IsManualPush { get; set; }
/// <summary>
/// 推送时间
/// </summary>
public DateTime PushTime { get; set; }
/// <summary>
/// 操作人
/// </summary>
public string? OperationMan { get; set; }
/// <summary>
/// 订单号
/// </summary>
public string OrderNo { get; set; } = null!;
/// <summary>
/// 接口通请求Id
/// </summary>
public Guid RequestId { get; set; }
/// <summary>
/// 信息
/// </summary>
public string Message { get; set; } = null!;
/// <summary>
/// 操作类型
/// </summary>
public string OptionType { get; set; } = null!;
/// <summary>
/// 轨迹状态
/// </summary>
public string TrackStatus { get; set; } = null!;
/// <summary>
/// 轨迹内容代码
/// </summary>
public string TrackCode { get; set; } = null!;
/// <summary>
/// 轨迹内容
/// </summary>
public string TrackContent { get; set; } = null!;
/// <summary>
/// 轨迹发生地
/// </summary>
public string TrackPlace { get; set; } = null!;
/// <summary>
/// 轨迹发生时间
/// </summary>
public DateTime TrackTime { get; set; }
/// <summary>
/// 轨迹发生时区
/// </summary>
public float TrackTimeZone { get; set; }
/// <summary>
/// 是否成功
/// </summary>
public bool IsSuccess { get; set; }
/// <summary>
/// 推送内容(json)
/// </summary>
public string PushContent { get; set; } = null!;
}

View File

@ -1,159 +0,0 @@
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
namespace SJZY.Track.Application.Contract.Events;
/// <summary>
/// 轨迹推送广播模型
/// </summary>
public class TrackPushEto
{
/// <summary>
/// 是否新增
/// </summary>
public OptionType Option { get; set; }
/// <summary>
/// 是否为手动推送
/// </summary>
public bool IsManualPush { get; set; }
/// <summary>
/// 推送是否失败
/// </summary>
public bool IsFailure { get; set; }
/// <summary>
/// 失败原因
/// </summary>
public string? FailureReason { get; set; }
/// <summary>
/// 推送时间
/// </summary>
public DateTime PushTime { get; set; }
/// <summary>
/// 操作人
/// </summary>
public string? OperationMan { get; set; }
/// <summary>
/// 子系统id
/// </summary>
public int SubSystemId { get; set; }
/// <summary>
/// 单号
/// </summary>
public string OrderNo { get; set; }
/// <summary>
/// 客户id
/// </summary>
public int CustomId { get; set; }
/// <summary>
/// 订单id
/// </summary>
public OrderIdentifier[] OrderIdentifiers { get; set; } = null!;
/// <summary>
/// 轨迹内容代码
/// </summary>
public string TrackCode { get; set; } = null!;
/// <summary>
/// 轨迹内容
/// </summary>
public string? Content { get; set; }
/// <summary>
/// 轨迹内容英文
/// </summary>
public string? EnStatus { get; set; }
/// <summary>
/// 轨迹状态代码
/// </summary>
public string TrackStatusCode { get; set; }
/// <summary>
/// 轨迹发生地
/// </summary>
public string TrackPlace { get; set; } = null!;
/// <summary>
/// 轨迹发生时间
/// </summary>
public DateTime TrackTime { get; set; }
/// <summary>
/// 轨迹发生地时区
/// </summary>
public float TrackTimeZone { get; set; }
/// <summary>
/// 客户是否可见
/// </summary>
public bool IsVisibility { get; set; }
/// <summary>
/// 数据来源:1外部服务商创建,2内部系统创建,3人工创建
/// </summary>
public int Source { get; set; }
/// <summary>
/// 轨迹备注
/// </summary>
public string? Remarks { get; set; }
/// <summary>
/// 附件集合
/// </summary>
public List<FileItemDto>? Files { get; set; }
/// <summary>
/// 轨迹发生地(城市)
/// </summary>
public string? TrackPlaceCity { get; set; }
/// <summary>
/// 轨迹发生地(城市)Id
/// </summary>
public int? TrackPlaceCityId { get; set; }
/// <summary>
/// 轨迹发生地(省/州)
/// </summary>
public string? TrackPlaceProvince { get; set; }
/// <summary>
///轨迹发生地(省/州)Id
/// </summary>
public int? TrackPlaceProvinceId { get; set; }
/// <summary>
/// 轨迹发生地(国家/地区)
/// </summary>
public string? TrackPlaceNation { get; set; }
/// <summary>
/// 轨迹发生地(国家/地区)Id
/// </summary>
public int? TrackPlaceNationId { get; set; }
/// <summary>
/// 轨迹发生地邮编
/// </summary>
public string? TrackPlacePostcode { get; set; }
/// <summary>
/// 预计到达时间
/// </summary>
public DateTime? EstimatedDeliveryDate { get; set; }
/// <summary>
/// 扩展信息字段,用与轨迹推送的附加字段
/// </summary>
public string? Extra { get; set; }
}

View File

@ -46,6 +46,11 @@ public class TrackPushEvent
/// 是否强制推送
/// </summary>
public bool ForcedPush { get; set; }
/// <summary>
/// 是否发送到mq
/// </summary>
public bool IsToMq { get; set; }
}
public struct SystemPushStruct

View File

@ -276,7 +276,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
OrderId = order.Id,
OrderNo = order.OrderNo,
OptionType = OrderOperationType.删除轨迹.ToString(),
Content = deleteTracks?.Where(m => m.OrderId == order.Id).ToList().ToJson(),
Content = deleteTracks.Where(m => m.OrderId == order.Id).ToList().ToJson(),
CreateUserId = @event.OperationManId,
CreateUserName = @event.OperationMan ?? "",
CreateTime = DateTime.Now

View File

@ -1,10 +1,8 @@
using System.Text.Json;
using DotNetCore.CAP;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using SJZY.Expand.ABP.Core.PublicMethords;
using SJZY.InterfaceRelay.Application.Contracts;
using SJZY.OTel;
using SJZY.Track.Application.Contract.Dtos.TrackPush;
using SJZY.Track.Application.Contract.Events;
using SJZY.Track.Application.Contract.Services;
@ -126,6 +124,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
TrackTime = @event.SystemPushInfo.TrackTime,
TrackTimeZone = @event.SystemPushInfo.TrackTimeZone,
CreateUser = GlobalConst.SystemUser,
SubSystemCode = @event.SubSystemCode,
IsToMq = @event.IsToMq
};
var item = await BuiltPushItem(config, log, @event.SystemPushInfo.Extra);
item.Log = JsonConvert.SerializeObject(log);
@ -172,6 +172,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
TrackTime = track.TrackTime,
TrackTimeZone = track.TrackTimeZone,
CreateUser = @event.OperationMan,
SubSystemCode = @event.SubSystemCode,
IsToMq = @event.IsToMq
};
var item = await BuiltPushItem(config, log, track.Extra);
item.Log = JsonConvert.SerializeObject(log);
@ -181,20 +183,6 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
if (items.Count == 0) return;
//获取参数结构名称
// var paramNames = await GetExtraParamNamesAsync(@event.SubSystemCode);
//
// //如果为系统推送,则从事件中取出轨迹扩展内容填充
// foreach (var item in items)
// {
// //根据事件中轨迹扩展内容填充
// if (isSystemPush)
// item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames));
// //根据查出的轨迹中扩展内容填充
// else
// item.Data.ForEach(dict => FillExtraParam(trackPushInputDict[item].Extra, dict, paramNames));
// }
using (Track2InterfaceRelaySubSystemContext.Use(
new Track2InterfaceRelaySubSystemContext(@event.SubSystemCode)))
{
@ -234,6 +222,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
TrackTime = @event.SystemPushInfo.TrackTime,
TrackTimeZone = @event.SystemPushInfo.TrackTimeZone,
CreateUser = GlobalConst.SystemUser,
SubSystemCode = @event.SubSystemCode,
IsToMq = @event.IsToMq
};
var item = BuiltUpdateItem(config, log, @event.SystemPushInfo.Extra);
item.Log = JsonConvert.SerializeObject(log);
@ -242,13 +232,6 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
if (items.Count == 0) return;
// //获取参数结构名称
// var paramNames = await GetExtraParamNamesAsync(@event.SubSystemCode);
//
// //根据事件中轨迹扩展内容填充请求
// foreach (var item in items)
// item.Data.ForEach(dict => FillExtraParam(@event.SystemPushInfo.Extra, dict, paramNames));
using (Track2InterfaceRelaySubSystemContext.Use(
new Track2InterfaceRelaySubSystemContext(@event.SubSystemCode)))
{
@ -383,107 +366,9 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
{
return obj == null ? string.Empty : System.Text.Json.JsonSerializer.Serialize(obj);
}
private T? DeserializeForTextJson<T>(string? json)
{
return string.IsNullOrWhiteSpace(json) ? default : System.Text.Json.JsonSerializer.Deserialize<T>(json);
}
/// <summary>
/// 获取来源系统接口的参数名
/// </summary>
/// <param name="subSystemCode"></param>
/// <returns></returns>
private async Task<List<string>> GetExtraParamNamesAsync(string subSystemCode)
{
using var span = ActivityHelper.CreateSpanActivity("开始请求接口通,接口结构");
using (Track2InterfaceRelaySubSystemContext.Use(
new Track2InterfaceRelaySubSystemContext(subSystemCode)))
{
var res = await _httpClientProxy.Service.GetSystemInterfaceByIdAsync(_options.CurrentValue.PushTrackInterfaceCode, _options.CurrentValue.PushTrackInterfaceId);
if (res == null) return new List<string>();
span.SetTag("request-GetSystemInterfaceByIdAsync", $"PushTrackInterfaceCode[{subSystemCode}]," +
$"PushTrackInterfaceCode:[{_options.CurrentValue.PushTrackInterfaceCode}]," +
$"PushTrackInterfaceId:[{_options.CurrentValue.PushTrackInterfaceId}]," +
$"PushTrackItemParamAliasPrefix:[{_options.CurrentValue.PushTrackItemParamAliasPrefix}]");
span.SetTag("response-GetSystemInterfaceByIdAsync", res.ToJson());
return res.InParameterList
.Where(x => x.Alias.StartsWith(_options.CurrentValue.PushTrackItemParamAliasPrefix))
.Select(x => x.Name)
.ToList();
}
}
/// <summary>
/// 填充来源于轨迹扩展字段的参数
/// </summary>
/// <param name="trackExtraJson">轨迹明细扩展字段Json</param>
/// <param name="dict">要扩展的参数字典</param>
/// <param name="paramNames">来源扩展字段的参数名</param>
/// <returns></returns>
private void FillExtraParam(string? trackExtraJson, Dictionary<string, object>? dict, List<string>? paramNames)
{
if (paramNames == null || paramNames.Count == 0) return;
if (dict == null) return;
if (string.IsNullOrWhiteSpace(trackExtraJson)) return;
var trackExtra = ExtractTrackExtraDict(trackExtraJson);
if (trackExtra.Count == 0) return;
foreach (var item in
trackExtra.Where(x => x.Value != null && paramNames.Contains(x.Key)))
{
dict.TryAdd(item.Key, item.Value);
}
}
private Dictionary<string, object> ExtractTrackExtraDict(string trackExtraStr)
{
var dict = new Dictionary<string, object>();
var trackExtra = JsonConvert.DeserializeObject<Dictionary<string, object>>(trackExtraStr);
if (trackExtra == null) return dict;
foreach (var pair in trackExtra)
{
if (pair.Value is JsonElement jEl)
{
object? objVal = null;
switch (jEl.ValueKind)
{
case JsonValueKind.String:
objVal = jEl.GetString();
// 处理字符串值
break;
case JsonValueKind.Number:
objVal = jEl.GetDouble();
// 处理数值
break;
case JsonValueKind.True:
case JsonValueKind.False:
objVal = jEl.GetBoolean();
// 处理布尔值
break;
case JsonValueKind.Object:
// 处理对象
break;
case JsonValueKind.Array:
// 处理数组
break;
case JsonValueKind.Null:
// 处理空值
break;
default:
// 处理未知类型
break;
}
if (objVal == null) continue;
dict.TryAdd(pair.Key, objVal);
continue;
}
dict.TryAdd(pair.Key, pair.Value);
}
return dict;
}
}

View File

@ -1,9 +1,8 @@
using System.Text;
using BSI.Stack.Rabbit;
using DotNetCore.CAP;
using SJZY.Expand.ABP.Core.Logger;
using SJZY.Expand.ABP.Core.PublicMethords;
using SJZY.Track.Application.Contract.Events;
using SJZY.Track.Application.Services.Broadcasting;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Dtos.TrackContents;
@ -20,7 +19,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
private readonly IOrderRepository _orderRepository;
private readonly IProvideQueries _provideQueries;
private readonly ITrackDetailsEsRepository _trackDetailsEsRepository;
private readonly RabbitClientBus _rabbitClientBus;
private readonly BroadcastingService _broadcastingService;
private readonly IOrderOperationRecordEsRepository _orderOperationRecordEsRepository;
public TrackUpsertEventHandler(
@ -28,15 +27,15 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
ICapPublisher capPublisher,
IProvideQueries provideQueries,
ITrackDetailsEsRepository trackDetailsEsRepository,
RabbitClientBus rabbitClientBus,
IOrderOperationRecordEsRepository orderOperationRecordEsRepository)
IOrderOperationRecordEsRepository orderOperationRecordEsRepository,
BroadcastingService broadcastingService)
{
_orderRepository = orderRepository;
_capPublisher = capPublisher;
_provideQueries = provideQueries;
_trackDetailsEsRepository = trackDetailsEsRepository;
_rabbitClientBus = rabbitClientBus;
_orderOperationRecordEsRepository = orderOperationRecordEsRepository;
_broadcastingService = broadcastingService;
}
[CapSubscribe(GlobalConst.TrackUpsertSubscribe, Group = GlobalConst.TrackUpsertSubscribe)]
@ -50,60 +49,14 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
var content = await HandleTrackAsync(@event, canNextOrderIds);
// 处理广播事件
PublicTrackTopic(@event, content);
if (content is { IsToMq: true })
await _broadcastingService.TrackChangePublicTopicAsync(@event, content);
if (canNextOrderIds.Count == 0) return;
// 根据订单关联关系异步向下刷(异步)
await DownByOrderLink(@event, canNextOrderIds);
}
/// <summary>
/// 发送轨迹广播
/// </summary>
/// <param name="eto"></param>
/// <param name="content"></param>
private void PublicTrackTopic(TrackUpsertEvent eto, TrackContentVO? content)
{
// var trackStatus = await _trackStatusRepository.GetFirstAsync(m => m.Code == content.TrackStatusCode);
if (content == null || !content.IsToMq)
return;
var data = new TrackChangeEto()
{
EstimatedDeliveryDate = eto.EstimatedDeliveryDate,
TrackPlacePostcode = eto.TrackPlacePostcode,
TrackPlaceNation = eto.TrackPlaceNation,
TrackPlaceNationId = eto.TrackPlaceNationId,
TrackPlaceProvince = eto.TrackPlaceProvince,
TrackPlaceProvinceId = eto.TrackPlaceProvinceId,
TrackPlaceCity = eto.TrackPlaceCity,
TrackPlaceCityId = eto.TrackPlaceCityId,
Files = eto.Files,
Remarks = eto.Remarks,
Source = eto.Source,
IsVisibility = eto.IsVisibility,
TrackTimeZone = eto.TrackTimeZone,
TrackTime = eto.TrackTime,
TrackPlace = eto.TrackPlace,
TrackStatusCode = content.TrackStatusCode,
EnStatus = eto.EnStatus,
Content = eto.Content,
TrackCode = eto.TrackCode,
OperationMan = eto.OperationMan,
OrderIdentifiers = eto.OrderIdentifiers,
CustomId = eto.CustomId,
SubSystemId = eto.SubSystemId,
Extra = eto.Extra
};
if (eto.IsAdd)
data.Option = 1;
else
data.Option = 3;
_rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{content.SubSystemCode}", Encoding.UTF8.GetBytes(data.ToJson()));
}
private async Task DownByOrderLink(TrackUpsertEvent @event, List<int> canNextOrderIds)
{
// 根据订单关联关系异步向下刷(异步)
@ -246,7 +199,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
DestinationTimeZone = @event.DestinationTimeZone,
EstimatedDeliveryDate = @event.EstimatedDeliveryDate
});
// 触发轨迹推送事件(异步)
var trackPushEvent = new TrackPushEvent
{
@ -265,7 +218,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
TrackTimeZone = @event.TrackTimeZone,
Extra = @event.Extra
},
ForcedPush = @event.ForcedPush
ForcedPush = @event.ForcedPush,
IsToMq = trackContent.IsToMq
};
await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, trackPushEvent);

View File

@ -4,17 +4,12 @@ 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.Application.Services.Broadcasting;
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;
@ -24,24 +19,15 @@ 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;
private readonly BroadcastingService _broadcastingService;
public TrackPushCompletedEventHandler(IOrderRepository orderRepository,
ITrackPushRecordEsRepository trackPushRecordEsRepository,
ITrackDetailsEsRepository trackDetailsEsRepository,
ITrackStatusRepository trackStatusRepository,
ITrackContentRepository trackContentRepository,
RabbitClientBus rabbitClientBus)
BroadcastingService broadcastingService)
{
_orderRepository = orderRepository;
_trackPushRecordEsRepository = trackPushRecordEsRepository;
_trackDetailsEsRepository = trackDetailsEsRepository;
_trackStatusRepository = trackStatusRepository;
_trackContentRepository = trackContentRepository;
_rabbitClientBus = rabbitClientBus;
_broadcastingService = broadcastingService;
}
public ConsumeOptions Options()
@ -71,7 +57,7 @@ public class TrackPushCompletedEventHandler : ITransientDependency, IRabbitHandl
}
else if (optionType == OptionType.修改.ToString())
{
logStr = JsonConvert.DeserializeObject<List<TrackUpdateInput>>(@event.RequestParams)!.First().Log;;
logStr = JsonConvert.DeserializeObject<List<TrackUpdateInput>>(@event.RequestParams)!.First().Log;
}
if (logStr.IsNullOrEmpty()) throw new InvalidOperationException();
@ -82,15 +68,9 @@ 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);
if (log.IsToMq)
await _broadcastingService.TrackPushCompletedPublicTopicAsync(log);
// 往es 写推送日志
await _trackPushRecordEsRepository.AddAsync(log);
@ -139,70 +119,4 @@ 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

@ -0,0 +1,103 @@
using System.Text;
using BSI.Stack.Rabbit;
using SJZY.Expand.ABP.Core.PublicMethords;
using SJZY.Track.Application.Contract.Events;
using SJZY.Track.Domain.Aggregates.TrackPushAggregate;
using SJZY.Track.Domain.Dtos.TrackContents;
using Volo.Abp.DependencyInjection;
namespace SJZY.Track.Application.Services.Broadcasting;
/// <summary>
/// 广播服务
/// </summary>
public class BroadcastingService : ITransientDependency
{
private readonly RabbitClientBus _rabbitClientBus;
public BroadcastingService(RabbitClientBus rabbitClientBus)
{
_rabbitClientBus = rabbitClientBus;
}
/// <summary>
/// 轨迹变更广播
/// </summary>
/// <param name="eto"></param>
/// <param name="content"></param>
/// <returns></returns>
public Task TrackChangePublicTopicAsync(TrackUpsertEvent eto, TrackContentVO content)
{
return Task.Run(() =>
{
var data = new TrackChangeEto
{
EstimatedDeliveryDate = eto.EstimatedDeliveryDate,
TrackPlacePostcode = eto.TrackPlacePostcode,
TrackPlaceNation = eto.TrackPlaceNation,
TrackPlaceNationId = eto.TrackPlaceNationId,
TrackPlaceProvince = eto.TrackPlaceProvince,
TrackPlaceProvinceId = eto.TrackPlaceProvinceId,
TrackPlaceCity = eto.TrackPlaceCity,
TrackPlaceCityId = eto.TrackPlaceCityId,
Files = eto.Files,
Remarks = eto.Remarks,
Source = eto.Source,
IsVisibility = eto.IsVisibility,
TrackTimeZone = eto.TrackTimeZone,
TrackTime = eto.TrackTime,
TrackPlace = eto.TrackPlace,
TrackStatusCode = content.TrackStatusCode,
EnStatus = eto.EnStatus,
Content = eto.Content,
TrackCode = eto.TrackCode,
OperationMan = eto.OperationMan,
OrderIdentifiers = eto.OrderIdentifiers,
CustomId = eto.CustomId,
SubSystemId = eto.SubSystemId,
Extra = eto.Extra
};
if (eto.IsAdd)
data.Option = 1;
else
data.Option = 3;
_rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{content.SubSystemCode}", Encoding.UTF8.GetBytes(data.ToJson()));
return Task.CompletedTask;
});
}
/// <summary>
/// 轨迹推送完成广播
/// </summary>
/// <param name="log"></param>
/// <returns></returns>
public Task TrackPushCompletedPublicTopicAsync(TrackPushRecordIndex log)
{
return Task.Run(() =>
{
var data = new TrackPushCompletedEvent
{
RequestId = log.RequestId,
IsSuccess = log.IsSuccess,
Message = log.Message,
OperationMan = log.CreateUser,
PushTime = DateTime.Now,
OptionType = log.OptionType,
IsManualPush = !string.Equals(log.CreateUser, GlobalConst.SystemUser), //操作人不为系统用户,则认为是仍推送
PushContent = log.PushContent,
OrderNo = log.OrderNo,
TrackStatus = log.TrackStatus,
TrackContent = log.TrackContent,
TrackTimeZone = log.TrackTimeZone,
TrackTime = log.TrackTime,
TrackPlace = log.TrackPlace,
TrackCode = log.TrackCode
};
_rabbitClientBus.Publish(GlobalConst.TrackPushExchange, $"TrackPush.{log.SubSystemCode}", Encoding.UTF8.GetBytes(data.ToJson()));
return Task.CompletedTask;
});
}
}

View File

@ -1,4 +1,5 @@
using DotNetCore.CAP;
using SJZY.Expand.ABP.Core.Common;
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
using SJZY.Track.Application.Contract.Dtos.TrackOrder;
using SJZY.Track.Application.Contract.Dtos.TrackPush;
@ -47,6 +48,7 @@ public class TrackPushService : ApplicationService, ITrackPushService
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("Track/Push")]
[CustomerResult]
public async Task<string> PushTrackAsync(PushTrackInput input)
{
input.OrderNos = input.OrderNos.Where(x => !x.IsNullOrWhiteSpace()).Distinct().ToList(); // 单号去重、去空
@ -101,6 +103,7 @@ public class TrackPushService : ApplicationService, ITrackPushService
/// <param name="customerId"></param>
/// <returns></returns>
[HttpGet("Track/GetTrackPushContentList")]
[CustomerResult]
public async Task<List<TrackPushContentDto>> GetTrackPushContentListAsync(int subSystemId, int customerId)
{
var list = await _trackPushConfigRepository.GetTrackPushContentListAsync(subSystemId, customerId);
@ -116,6 +119,7 @@ public class TrackPushService : ApplicationService, ITrackPushService
/// <returns></returns>
/// <param name="input"></param>
[HttpGet("Track/GetTrackPushRecords")]
[CustomerResult]
public async Task<List<TrackPushRecordOutput>> GetTrackPushRecordsAsync([FromQuery] OrderNoInfo input)
{
var orderId = await _orderRepository.GetFirstAsync(x =>

View File

@ -82,4 +82,14 @@ public class TrackPushRecordIndex : IdBaseIndex
/// <summary>创建时间</summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 子系统代码
/// </summary>
public string SubSystemCode { get; set; }
/// <summary>
/// 是否广播
/// </summary>
public bool IsToMq { get; set; }
}