using System.Text; using Fake.DependencyInjection; using InterfaceForward.Domain.Shared.Helpers; using TrackCenter.Application.Dtos.TrackPush; using TrackCenter.Application.Events; using TrackCenter.Application.Rabbit; namespace TrackCenter.Application.Services.Broadcasting; /// /// 广播服务 /// public class BroadcastingService : ITransientDependency { private readonly RabbitClient _rabbitClient; public BroadcastingService(RabbitClient rabbitClient) { _rabbitClient = rabbitClient; } /// /// 轨迹变更广播 /// /// /// 轨迹内容中的是否对外 /// 子系统代码 /// 轨迹状态代码 /// public void TrackChangePublicTopic(TrackUpsertEvent eto, bool contentIsExternal, string subSystemCode, string trackStatusCode) { var data = new TrackChangeEto { EstimatedDeliveryDate = eto.EstimatedDeliveryDate, DestinationTimeZone = eto.DestinationTimeZone, 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, IsExternal = eto.IsExternal ?? contentIsExternal, TrackTimeZone = eto.TrackTimeZone, TrackTime = eto.NewTrackTime ?? eto.TrackTime, TrackPlace = eto.TrackPlace, TrackStatusCode = trackStatusCode, OrderNo = eto.OrderIdentifiers.First().OrderNo, EnStatus = eto.EnStatus, Content = eto.Content, TrackCode = eto.TrackCode, OperationMan = eto.OperationMan, OrderIdentifiers = eto.OrderIdentifiers, CustomId = eto.CustomId, SubSystemId = eto.SubSystemId, Extra = eto.NewExtra ?? eto.Extra }; if (eto.IsAdd) data.Option = 1; else data.Option = 3; _rabbitClient.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{subSystemCode}", Encoding.UTF8.GetBytes(data.ToJson()), prop => { prop.Persistent = true; }); } public void TrackChangePublicTopic(TrackChangeEto eto, string subSystemCode) { eto.Option = 2; _rabbitClient.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{subSystemCode}", Encoding.UTF8.GetBytes(eto.ToJson()), prop => { prop.Persistent = true; }); } /// /// 轨迹推送完成广播(批量) /// /// /// public void TrackPushCompletedPublicTopic(List list) { var datas = list .Select(TrackPushRecordDtoToEvent) .Select(x => Encoding.UTF8.GetBytes(x.ToJson())); var log = list.First(); _rabbitClient.Publish(GlobalConst.TrackPushExchange, $"TrackPush.{log.SubSystemCode}", datas, prop => { prop.Persistent = true; }); } /// /// 轨迹推送完成广播 /// /// /// public void TrackPushCompletedPublicTopic(TrackPushRecordDto log) { var data = TrackPushRecordDtoToEvent(log); _rabbitClient.PublishByConfirmSelect(GlobalConst.TrackPushExchange, $"TrackPush.{log.SubSystemCode}", Encoding.UTF8.GetBytes(data.ToJson()), prop => { prop.Persistent = true; }); } /// /// 轨迹推送失败广播 /// /// public void TrackPushFailedPubilcTopic(TrackPushRecordDto log) { //暂时使用推送完成模型,后续可能会出现有区分度的模型 TrackPushCompletedPublicTopic(log); } private static TrackPushCompletedEvent TrackPushRecordDtoToEvent(TrackPushRecordDto log) { return new TrackPushCompletedEvent { RequestId = log.RequestId, IsSuccess = log.IsSuccess, Message = log.Message, OperationMan = log.OperationMan, PushTime = log.PushTime, OptionType = log.OptionType, IsManualPush = log.IsManualPush, //操作人不为系统用户,则认为是人推送 PushContent = log.PushContent, OrderNo = log.OrderNo, TrackStatus = log.TrackStatus, TrackContent = log.TrackContent, TrackTimeZone = log.TrackTimeZone, TrackTime = log.TrackTime, TrackPlace = log.TrackPlace, TrackCode = log.TrackCode, Extra = log.Extra, InterfaceRelayData = log.InterfaceRelayData }; } }