using DotNetCore.CAP; using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Services.ProvideServices; using SJZY.Track.Application.Services.Warning.Handlers; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.UserCenter.HttpApi.Services; namespace SJZY.Track.Application.Services.ProvideServices; /// /// 订单服务 /// [ApiExplorerSettings(GroupName = "提供接口")] [Route("/ProviderService")] public partial class OrderService : ApplicationService, IOrderService { private readonly IOrderOperationRecordEsRepository _orderOperationRecordEsRepository; private readonly IOrderRepository _orderRepository; private readonly IServiceProvider _serviceProvider; public OrderService( IOrderRepository orderRepository, ICapPublisher capPublisher, ITrackDetailsEsRepository trackDetailsEsRepository, IOrderOperationRecordEsRepository orderOperationRecordEsRepository, IServiceProvider serviceProvider ) { _orderRepository = orderRepository; _orderOperationRecordEsRepository = orderOperationRecordEsRepository; _serviceProvider = serviceProvider; _trackDetailsEsRepository = trackDetailsEsRepository; _capPublisher = capPublisher; } /// /// 新增、更新订单(存在就更新) /// /// /// [HttpPost("Order/Upsert")] public async Task> UpsertAsync(UpsertOrderInput input) { // 校验预计到达时间是否不是同时存在或同时不存在 if ((input.EstimatedDeliveryDate.HasValue && input.DestinationTimeZone.HasValue == false) || (input.EstimatedDeliveryDate.HasValue == false && input.DestinationTimeZone.HasValue)) { throw new BusinessException(message: "【预计签收时间】和【签收地时区】必须同时输入"); } var currentUser = CurrentUserRequest.CurrentUser; // 校验订单是否已存在,存在则更新 var order = await _orderRepository.GetFirstAsync(x => x.SubSystemId == input.SubSystemId && x.OrderType == input.OrderType && x.OrderNo == input.OrderNo); if (order != default) { // 订单已存在则视为更新 await UpdateOrderAsync(input, order); var index = new OrderOperationRecordIndex { OrderId = order.Id, OrderNo = input.OrderNo, OptionType = OrderOperationType.修改订单.ToString(), Content = input.ToJson(), CreateUserId = currentUser.UserId, CreateUserName = currentUser.Name, }; _ = _orderOperationRecordEsRepository.AddAsync(index); return new UnifyResultDto(true, new IdBaseDto { Id = order.Id }); } order = ObjectMapper.Map(input); order.SubSystemId = input.SubSystemId; order.OrderFlights = ObjectMapper.Map, List>(input.FlightInfos); order.OrderPullStatus = BuiltOrderPullStatus(input.PullConfigInfos); order.OrderPlatformNumbers = BuiltOrderPlatformNumbers(input.PullConfigInfos); order.TemplateCodes = input.TemplateCodes == null ? null : string.Join(',', input.TemplateCodes); order.SetThirdPartyOrderNumber(order.OrderPlatformNumbers); var orderId = await _orderRepository.CreateOrderAsync(order); // 写入操作日志 var indexForAdd = new OrderOperationRecordIndex { OrderId = orderId, OrderNo = input.OrderNo, OptionType = OrderOperationType.创建订单.ToString(), Content = input.ToJson(), CreateUserId = currentUser.UserId, CreateUserName = currentUser.Name, CreateTime = DateTime.Now }; _ = _orderOperationRecordEsRepository.AddAsync(indexForAdd); return new UnifyResultDto(true, new IdBaseDto { Id = orderId }); } /// /// 删除订单 /// /// /// /// [HttpPost("Order/Delete")] public async Task> DeleteOrderAsync(DeleteOrderInput input) { var order = await _orderRepository.GetFirstAsync(x => x.SubSystemId == input.SubSystemId && x.OrderType == input.OrderType && x.OrderNo == input.OrderNo); if (order == null) { throw new BusinessException(message: $"订单:{input.OrderNo}不存在"); } await _orderRepository.DeleteOrderAsync(order.Id); // todo:预警计算 WarningCalc_OrderDeletedOrCompleted(order); return new UnifyResultDto(true, new IdBaseDto { Id = order.Id }); } private async Task UpdateOrderAsync(UpdateOrderInput input, OrderEntity order) { order = ObjectMapper.Map(input, order); order.OrderFlights = ObjectMapper.Map, List>(input.FlightInfos); order.OrderPullStatus = BuiltOrderPullStatus(input.PullConfigInfos); order.OrderPlatformNumbers = BuiltOrderPlatformNumbers(input.PullConfigInfos); order.TemplateCodes = input.TemplateCodes == null ? null : string.Join(',', input.TemplateCodes); order.SetThirdPartyOrderNumber(order.OrderPlatformNumbers); await _orderRepository.UpdateOrderAsync(order); } private List BuiltOrderPullStatus(List? pullConfigInfos) { if (pullConfigInfos == null) return new List(); return pullConfigInfos.Select(x => { var status = new OrderPullStatusEntity { ServiceProviderCode = x.ServiceCode, OrderNo = x.OrderNo, PullStatus = TrackPullStatus.Init, StartTrackCode = x.StartCode ?? GlobalConst.EmptyString, EndTrackCode = x.EndCode ?? GlobalConst.EmptyString, SilenceBeforeStart = x.SilenceTime, SilenceAfterEnd = x.StopTime, StartTime = GlobalConst.MaxDateTime, EndTime = GlobalConst.MaxDateTime, }; // 没有开始轨迹则立即进入拉取前静默期 if (x.StartCode == null) { status.PullStatus = TrackPullStatus.SilenceBeforeStart; // 会被定时任务扫描到并启动 status.StartTime = DateTime.Now.AddHours(x.SilenceTime); } return status; }).ToList(); } private List BuiltOrderPlatformNumbers(List? pullConfigInfos) { if (pullConfigInfos == null) return new List(); return pullConfigInfos.Select(x => { var status = new OrderPlatformNumberEntity { //三方单号 OrderNumber = x.OrderNo, //三方平台名称,目前认为是服务商code Platform = x.ServiceCode, }; return status; }).ToList(); } private void WarningCalc_OrderDeletedOrCompleted(OrderEntity order) { order.IsDeleted = true; _ = Task.Run(async () => { var scope = _serviceProvider.CreateAsyncScope(); try { var handler = scope.ServiceProvider.GetRequiredService(); await handler.HandleOrderDeletedOrCompletedAsync(order); } catch (Exception ex) { LogHelper.Error(ex); } finally { await scope.DisposeAsync(); } }); } }