using DotNetCore.CAP; using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Events; using SJZY.Track.Application.Contract.Services; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Queries; namespace SJZY.Track.Application.Services.ProvideServices; /// /// 轨迹服务 /// [ApiExplorerSettings(GroupName = "提供接口")] [Route("/ProviderService")] public partial class TrackService : ApplicationService, ITrackService { private readonly IOrderRepository _orderRepository; private readonly IProvideQueries _provideQueries; private readonly ICapPublisher _capPublisher; public TrackService(IOrderRepository orderRepository, IProvideQueries provideQueries, ICapPublisher capPublisher, ITrackDetailsRepository trackDetailsRepository) { _orderRepository = orderRepository; _provideQueries = provideQueries; _provideQueries = provideQueries; _capPublisher = capPublisher; _trackDetailsRepository = trackDetailsRepository; } /// /// 新增、更新轨迹(存在就更新) /// /// /// /// [HttpPost("Track/Upsert")] public async Task UpsertTrackAsync(UpsertTrackInput input) { var order = await _orderRepository.GetFirstAsync(x => x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, x => new { x.Id, x.SubSystemId, x.IsPushCompleted, x.CustomId }); if (order == default) { throw new BusinessException(message: $"订单:{input.OrderNo}不存在"); } // 新增/更新轨迹 var @event = ObjectMapper.Map(input); @event.OrderId = order.Id; @event.SubSystemId = order.SubSystemId; @event.IsPushCompleted = order.IsPushCompleted; @event.CustomId = order.CustomId; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); return true; } /// /// 批量新增、更新轨迹 /// /// /// /// [HttpPost("Track/BatchUpsert")] public async Task BatchUpsertTrackAsync(BatchUpsertTrackInput input) { input.OrderNos = input.OrderNos.Where(x => !x.IsNullOrWhiteSpace()).Distinct().ToList(); // 单号去重、去空 if (input.OrderNos.Count == 0) { throw new BusinessException(message: "订单一个都不存在"); } var orders = await _orderRepository.GetListAsync(x => x.OrderType == input.OrderType && input.OrderNos.Contains(x.OrderNo), x => new { x.Id, x.OrderNo, x.SubSystemId, x.IsPushCompleted, x.CustomId }); foreach (var order in orders) { // 新增/更新轨迹 var @event = new TrackUpsertEvent { TrackCode = input.TrackCode, TrackPlace = input.TrackPlace, TrackTime = input.TrackTime, TrackTimeZone = input.TrackTimeZone, OrderType = input.OrderType, OrderNo = order.OrderNo, OrderId = order.Id, SubSystemId = order.SubSystemId, IsPushCompleted = order.IsPushCompleted, CustomId = order.CustomId }; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event); } return true; } /// /// 删除轨迹 /// /// /// /// [HttpPost("Track/Delete")] public async Task DeleteTrackAsync(DeleteTrackInput input) { var order = await _orderRepository.GetFirstAsync(x => x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, x => new { x.Id, x.SubSystemId }); if (order == default) { throw new BusinessException(message: $"订单:{input.OrderNo}不存在"); } var codes = await _provideQueries.GetCanDeleteTrackCodesAsync(new List { order.Id }, input.TrackCodes); if (codes.Count == 0) { throw new BusinessException(message: "没有一个轨迹代码是可删的"); } // 删除轨迹 var @event = new TrackDeleteEvent { OrderId = order.Id, TrackCodes = codes.Select(x => x.TrackCode).ToList(), SubSystemId = order.SubSystemId, }; await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, @event); return true; } /// /// 批量删除轨迹 /// /// /// /// [HttpPost("Track/BatchDelete")] public async Task BatchDeleteTrackAsync(BatchDeleteTrackInput input) { var orders = await _orderRepository.GetListAsync(x => x.OrderType == input.OrderType && input.OrderNos.Contains(x.OrderNo) && !x.IsPushCompleted , x => new { x.Id, x.SubSystemId }); var codes = await _provideQueries.GetCanDeleteTrackCodesAsync( orders.Select(x => x.Id).ToList(), input.TrackCodes ); if (codes.Count == 0) { throw new BusinessException(message: "没有一个轨迹代码是可删的"); } // 删除轨迹 foreach (var group in codes.GroupBy(x => x.OrderId)) { var @event = new TrackDeleteEvent { OrderId = group.Key, TrackCodes = codes.Select(x => x.TrackCode).ToList(), SubSystemId = orders.First(x => x.Id == group.Key).SubSystemId, }; await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, @event); } return true; } }