|
|
using Furion;
|
|
|
using Furion.EventBus;
|
|
|
using Furion.FriendlyException;
|
|
|
using Furion.RemoteRequest.Extensions;
|
|
|
using Mapster;
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
using Myshipping.Application.ConfigOption;
|
|
|
using Myshipping.Application.Entity;
|
|
|
using Myshipping.Application.Service.BookingOrder.Dto;
|
|
|
using Myshipping.Core;
|
|
|
using Myshipping.Core.Entity;
|
|
|
using Myshipping.Core.Service;
|
|
|
using Newtonsoft.Json.Linq;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.IO;
|
|
|
using System.Linq;
|
|
|
using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
namespace Myshipping.Application.Event
|
|
|
{
|
|
|
/// <summary>
|
|
|
/// 订舱同步给客户订舱系统
|
|
|
/// </summary>
|
|
|
public class BookingSyncSubscriber : IEventSubscriber
|
|
|
{
|
|
|
private IServiceProvider _services { get; }
|
|
|
private readonly ILogger<BookingSyncSubscriber> _logger;
|
|
|
|
|
|
public BookingSyncSubscriber(IServiceProvider services, ILogger<BookingSyncSubscriber> logger)
|
|
|
{
|
|
|
_services = services;
|
|
|
_logger = logger;
|
|
|
}
|
|
|
|
|
|
//发送订舱同步数据给客户订舱系统
|
|
|
[EventSubscribe("SendToCustomer:Book")]
|
|
|
public async Task CreateOpLog(EventHandlerExecutingContext context)
|
|
|
{
|
|
|
_logger.LogInformation($"收到订舱同步客户订舱系统请求:{context.Source.Payload}");
|
|
|
var bookId = (long)context.Source.Payload;
|
|
|
using var scope = _services.CreateScope();
|
|
|
var repoCutomerOrder = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<BookingCustomerOrder>>();
|
|
|
var repoOrder = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<BookingOrder>>();
|
|
|
var repoCtn = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<BookingCtn>>();
|
|
|
var repoFile = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<BookingFile>>();
|
|
|
|
|
|
var repoStaLog = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<BookingStatusLog>>();
|
|
|
var repoStaLogDetail = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<BookingStatusLogDetail>>();
|
|
|
var repoGoodsSta = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<BookingGoodsStatus>>();
|
|
|
var repoGoodsStaCfg = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<BookingGoodsStatusConfig>>();
|
|
|
|
|
|
var cacheService = scope.ServiceProvider.GetRequiredService<ISysCacheService>();
|
|
|
|
|
|
var custOrder = await repoCutomerOrder.AsQueryable().Filter(null, true).FirstAsync(x => x.BookingId == bookId);
|
|
|
if (custOrder == null) //非客户订舱系统过来的数据
|
|
|
{
|
|
|
_logger.LogInformation($"ID为 {bookId} 的数据并非来自客户订舱系统,不继续处理数据回推");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
var order = await repoOrder.AsQueryable().Filter(null, true).FirstAsync(x => x.Id == bookId);
|
|
|
var ctns = await repoCtn.AsQueryable().Filter(null, true).Where(x => x.BILLID == bookId).ToListAsync();
|
|
|
var files = await repoFile.AsQueryable().Filter(null, true).Where(x => x.BookingId == bookId).ToListAsync();
|
|
|
var staLogs = await repoStaLog.AsQueryable().Filter(null, true).Where(x => x.BookingId == bookId).ToListAsync();
|
|
|
var staLogDetails = await repoStaLogDetail.AsQueryable().Filter(null, true).Where(x => staLogs.Select(y => y.Id).Contains(x.PId)).ToListAsync();
|
|
|
var goodsLogs = await repoGoodsSta.AsQueryable().Filter(null, true).Where(x => x.bookingId == bookId).ToListAsync();
|
|
|
var goodsLogConfigs = await repoGoodsStaCfg.AsQueryable().Filter(null, true).Where(x => goodsLogs.Select(y => y.ConfigId).Contains(x.Id)).ToListAsync();
|
|
|
|
|
|
//把ID还原为客户订舱系统中的ID
|
|
|
order.Id = Convert.ToInt64(order.BSNO);
|
|
|
order.BSNO = null;
|
|
|
ctns.ForEach(x => x.BILLID = order.Id);
|
|
|
files.ForEach(x => x.BookingId = order.Id);
|
|
|
staLogs.ForEach(x => x.BookingId = order.Id);
|
|
|
goodsLogs.ForEach(x => x.bookingId = order.Id);
|
|
|
|
|
|
|
|
|
var staLogSendList = staLogs.Adapt<List<BookingStatusLogSyncCustomerDto>>();
|
|
|
staLogSendList.ForEach(x =>
|
|
|
{
|
|
|
x.Details = staLogDetails.Where(y => y.PId == x.Id).Adapt<List<BookingStatusLogDetailSyncCustomerDto>>();
|
|
|
});
|
|
|
|
|
|
//发送对象
|
|
|
var sendObj = new BookingCustomerRecDataFeedbackDto()
|
|
|
{
|
|
|
Order = order.Adapt<BookingOrderSyncCustomerDto>(),
|
|
|
Ctns = ctns.Adapt<List<BookingCtnSyncCustomerDto>>(),
|
|
|
Files = files.Adapt<List<BookingFileSyncCustomerDto>>(),
|
|
|
StatusLogs = staLogSendList
|
|
|
};
|
|
|
|
|
|
|
|
|
//文件内容
|
|
|
var opt = App.GetOptions<BookingAttachOptions>();
|
|
|
var dirAbs = opt.basePath;
|
|
|
if (string.IsNullOrEmpty(dirAbs))
|
|
|
{
|
|
|
dirAbs = App.WebHostEnvironment.WebRootPath;
|
|
|
}
|
|
|
|
|
|
foreach (var file in files)
|
|
|
{
|
|
|
var fileFullPath = Path.Combine(dirAbs, file.FilePath);
|
|
|
if (File.Exists(fileFullPath))
|
|
|
{
|
|
|
sendObj.Files.First(x => x.Id == file.Id).FileContent = File.ReadAllBytes(fileFullPath);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//回推回执
|
|
|
var recFeedbackConfig = cacheService.GetAllSysConfig().Result.FirstOrDefault(x => x.Code == "DjyBookingCustomerRecFeedbackURL");
|
|
|
if (recFeedbackConfig == null || string.IsNullOrEmpty(recFeedbackConfig.Value))
|
|
|
{
|
|
|
throw Oops.Bah("回推订舱数据的URL地址未配置,请联系管理员");
|
|
|
}
|
|
|
|
|
|
var recFeedbackUserKey = cacheService.GetAllSysConfig().Result.FirstOrDefault(x => x.Code == "DjyBookingCustomerRecFeedbackUserKey");
|
|
|
if (recFeedbackUserKey == null || string.IsNullOrEmpty(recFeedbackUserKey.Value))
|
|
|
{
|
|
|
throw Oops.Bah("回推订舱数据的用户KEY未配置,请联系管理员");
|
|
|
}
|
|
|
|
|
|
var recFeedbackUserSecret = cacheService.GetAllSysConfig().Result.FirstOrDefault(x => x.Code == "DjyBookingCustomerRecFeedbackUserSecret");
|
|
|
if (recFeedbackUserSecret == null || string.IsNullOrEmpty(recFeedbackUserSecret.Value))
|
|
|
{
|
|
|
throw Oops.Bah("回推订舱数据的用户秘钥未配置,请联系管理员");
|
|
|
}
|
|
|
|
|
|
var feedbackUrl = recFeedbackConfig.Value;
|
|
|
if (!feedbackUrl.EndsWith("/"))
|
|
|
{
|
|
|
feedbackUrl += "/";
|
|
|
}
|
|
|
|
|
|
feedbackUrl += "BookingCustomerOrder/RecBookingDataFeedback";
|
|
|
|
|
|
_logger.LogInformation($"准备发送客户订舱数据同步:{sendObj.ToJsonString()},URL:{feedbackUrl}");
|
|
|
|
|
|
var rtn = await feedbackUrl
|
|
|
.SetHeaders(new Dictionary<string, object> {
|
|
|
{ CommonConst.API_USER_HEADER_KEY, recFeedbackUserKey.Value},
|
|
|
{ CommonConst.API_USER_HEADER_SECRET, recFeedbackUserSecret.Value}
|
|
|
})
|
|
|
.SetBody(sendObj)
|
|
|
.PostAsStringAsync();
|
|
|
|
|
|
_logger.LogInformation($"回推数据同步返回:{rtn}");
|
|
|
|
|
|
var jobjRtn = JObject.Parse(rtn);
|
|
|
if (jobjRtn.GetIntValue("code") != 200)
|
|
|
{
|
|
|
throw Oops.Bah(jobjRtn.GetStringValue("message"));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|