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; using SJZY.Track.Application.Contract.Events; using SJZY.Track.Application.Contract.Services.ProvideServices; using SJZY.Track.Application.Helpers; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Dtos.TrackPush; using SJZY.Track.Domain.Extensions; using SJZY.Track.Domain.Queries; using SJZY.UserCenter.HttpApi.Services.User; using Volo.Abp.Http.Client.DynamicProxying; namespace SJZY.Track.Application.Services.ProvideServices; /// /// 轨迹推送服务 /// [ApiExplorerSettings(GroupName = "提供接口")] [Route("/ProviderService")] public class TrackPushService : ApplicationService, ITrackPushService { private readonly ICapPublisher _capPublisher; private readonly IOrderRepository _orderRepository; private readonly IProvideQueries _provideQueries; private readonly IHttpClientProxy _requestCurrentUserService; private readonly ITrackPushConfigRepository _trackPushConfigRepository; private readonly ITrackPushRecordEsRepository _trackPushRecordEsRepository; private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; public TrackPushService(IOrderRepository orderRepository , ICapPublisher capPublisher , ITrackPushRecordEsRepository trackPushRecordEsRepository , IHttpClientProxy requestCurrentUserService , ITrackPushConfigRepository trackPushConfigRepository, IProvideQueries provideQueries, ITrackDetailsEsRepository trackDetailsEsRepository) { _orderRepository = orderRepository; _capPublisher = capPublisher; _trackPushRecordEsRepository = trackPushRecordEsRepository; _requestCurrentUserService = requestCurrentUserService; _trackPushConfigRepository = trackPushConfigRepository; _provideQueries = provideQueries; _trackDetailsEsRepository = trackDetailsEsRepository; } /// /// 手工推送轨迹 /// /// /// [HttpPost("Track/Push")] [CustomerResult] public async Task PushTrackAsync(PushTrackInput input) { input.OrderNos = input.OrderNos.Where(x => !x.IsNullOrWhiteSpace()).Distinct().ToList(); // 单号去重、去空 var subSystemCode = await _provideQueries.SubSystemId2CodeAsync(input.SubSystemId); var orders = await _orderRepository.GetArrayAsync(x => x.SubSystemId == input.SubSystemId && x.OrderType == input.OrderType && input.OrderNos.Contains(x.OrderNo), x => new { x.Id, x.CustomId }); if (!orders.Any()) { throw new BusinessException(message: "一个订单都不存在"); } var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(); if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null) { throw new BusinessException(message: $"调用用户中心,获取用户信息失败:{userInfo.Msg}"); } var name = userInfo.Data.UserName; //查出可能需要推送的轨迹 var tracks = await _trackDetailsEsRepository.GetListAsync(input.SubSystemId, input.OrderType, input.OrderNos, new List { input.TrackCode }); if (tracks.Count == 0) { throw new BusinessException(message: "没有需要推送的轨迹"); } //存在比较字段,需要做过滤处理 if (!string.IsNullOrWhiteSpace(input.CompareFields)) { //根据输入值来进行过滤,比如选取code1,批次1的轨迹,可能会有多条,下面使用创建时间最新的一条 tracks = tracks.Where(x => { if (string.IsNullOrWhiteSpace(x.Extra)) { throw new BusinessException(message: $"当前轨迹不存在扩展信息,无法利用扩展字段:{input.CompareFields}"); } var extraDict = TextJsonHelper.DeserializeToDictionary(x.Extra); if (extraDict == null || !extraDict.TryGetValue(input.CompareFields, out var compareValue)) { throw new BusinessException(message: $"请检查拓展字段,为什么找不到比较字段:{input.CompareFields}"); } //补充轨迹内容 return TextJsonHelper.EqJsonElementAndObject(compareValue, input.CompareValue); }).ToList(); } // 经过过滤后不存在需要推送的轨迹 if (tracks.Count == 0) { throw new BusinessException(message: "没有需要推送的轨迹"); } // 构建每个单最早的轨迹(已经指定了code) var orderIdTrackDict = tracks.GroupBy(x => x.OrderId) .ToDictionary(x => x.Key, y => y.OrderByDescending(a => a.CreateTime).First()); //不同单可能会有不同的轨迹内容,手动推送只推送最新的一条 foreach (var order in orders) { var track = orderIdTrackDict.GetValueOrDefault(order.Id); if (track == null) continue; var trackPushEvent = new TrackPushEvent { OptionType = OptionType.新增, SubSystemId = input.SubSystemId, SubSystemCode = subSystemCode, CustomId = order.CustomId, OrderIdEsIdVersionDict = new Dictionary> { [order.Id] = KeyValuePair.Create(track.Id, track.Version) }, // OrderIds = new[] { order.Id }, TrackCode = input.TrackCode, OperationMan = name, SystemPushInfo = new SystemPushStruct { TrackStatusId = track.TrackStatusId, TrackStatus = track.TrackStatus, TrackContentId = track.TrackContentId, TrackContent = track.TrackContent, TrackPlace = track.TrackPlace, TrackTime = track.TrackTime, TrackTimeZone = track.TrackTimeZone, CompareFields = input.CompareFields, Extra = track.Extra } }; await _capPublisher.PublishAsync(GlobalConst.TrackManualPushSubscribe, trackPushEvent); } return new UnifyResultDto(true, $"即将推送轨迹代码{input.TrackCode}给{orderIdTrackDict.Count}个订单"); } /// /// 获取轨迹推送内容 /// /// /// /// [HttpGet("Track/GetTrackPushContentList")] [CustomerResult] public async Task>> GetTrackPushContentListAsync(int subSystemId, int customerId) { var list = await _trackPushConfigRepository.GetTrackPushContentListAsync(subSystemId, customerId); var result = ObjectMapper.Map, List>(list); return new UnifyResultDto>(true, result, "操作成功"); } /// /// 获取轨迹推送记录 /// /// /// [HttpGet("Track/GetTrackPushRecords")] [CustomerResult] public async Task>> GetTrackPushRecordsAsync([FromQuery] OrderNoInfo input) { var orderId = await _orderRepository.GetFirstAsync(x => x.SubSystemId == input.SubSystemId && x.OrderType == input.OrderType && input.OrderNo == x.OrderNo, x => x.Id ); if (orderId == default) { throw new BusinessException(message: "订单不存在"); } var records = await _trackPushRecordEsRepository.GetTrackPushRecordsAsync(orderId); var res = ObjectMapper.Map, List>(records); return new UnifyResultDto>(true, res, "操作成功"); } /// /// 高级查询推送日志 /// /// /// /// [HttpPost("Track/QueryTrackPushRecords")] [CustomerResult] public async Task>> QueryTrackPushRecordsAsync(QueryPushRecordInput input) { var orderIds = await _orderRepository.GetListAsync( x => x.SubSystemId == input.SubSystemId && x.OrderType == input.OrderType && input.OrderNos.Contains(x.OrderNo), y => y.Id ); if (orderIds.Count == 0) throw new BusinessException(message: "订单一个都不存在"); var isSuccess = input.ResultType switch { 0 => new HashSet(1) { true, false }, 1 => new HashSet(1) { true }, 2 => new HashSet(1) { false }, _ => throw new BusinessException(message: "结果类型值只能取0,1,2") }; var records = await _trackPushRecordEsRepository.GetTrackPushRecordsAsync(new GetTrackPushRecordsVO { OrderIds = orderIds.ToHashSet(), IsSuccess = isSuccess, // unicode转义之后 PushContentCn = string.IsNullOrWhiteSpace(input.PushContentCn) ? null : StringHelper.ToUnicodeEscapeString(input.PushContentCn), PushContentEn = input.PushContentEn, TrackTimeStart = input.TrackTimeStart, TrackTimeEnd = input.TrackTimeEnd, // 补正成GMT时间 TrackPushTimeStart = input.TrackPushTimeStart?.AddHours(-8), TrackPushTimeEnd = input.TrackPushTimeEnd?.AddHours(-8), }); if (records.Count == 0) return new UnifyResultDto>(true, new List(), "操作成功"); var res = ObjectMapper.Map, List>(records); return new UnifyResultDto>(true, res, "操作成功"); } }