|
|
|
@ -34,15 +34,20 @@ namespace Myshipping.Application.Service.BookingOrder
|
|
|
|
|
private readonly IDjyWebsiteAccountConfigService _webAccountConfig;
|
|
|
|
|
private readonly ILogger<BookingMSKSPOTAPIService> _logger;
|
|
|
|
|
private readonly ISysDataUserMenu _sysDataUserMenuService;
|
|
|
|
|
private readonly IDjyTenantParamService _djyTenantParamService;
|
|
|
|
|
|
|
|
|
|
const string CONST_MSK_API_COMMODITY_URL = "MSKApiCommodity";
|
|
|
|
|
const string CONST_MSK_API_BOOKING_URL = "MSKApiBooking";
|
|
|
|
|
const string CONST_MSK_SPOT_API_QUERY_SCHEDULE_RATE_URL = "MSKSPOTScheduleRate";
|
|
|
|
|
const string CONST_MSK_SPOT_API_LOCATION_URL = "MSKSPOTApilocation";
|
|
|
|
|
|
|
|
|
|
//租户MSK SPOT的备案注册信息
|
|
|
|
|
const string CONST_MSK_SPOT_COMPANY_INFO = "MSK_SPOT_API_COMPANY_INFO";
|
|
|
|
|
|
|
|
|
|
public BookingMSKSPOTAPIService(ILogger<BookingMSKSPOTAPIService> logger, ISysCacheService cache,
|
|
|
|
|
IDjyWebsiteAccountConfigService webAccountConfig, SqlSugarRepository<BookingDeliveryRecord> bookingDeliveryRecordRep,
|
|
|
|
|
ISysDataUserMenu sysDataUserMenuService,
|
|
|
|
|
IDjyTenantParamService djyTenantParamService,
|
|
|
|
|
SqlSugarRepository<BookingDeliveryRecordCtn> bookingDeliveryRecordCtnRep)
|
|
|
|
|
{
|
|
|
|
|
_logger = logger;
|
|
|
|
@ -51,6 +56,7 @@ namespace Myshipping.Application.Service.BookingOrder
|
|
|
|
|
_bookingDeliveryRecordRep = bookingDeliveryRecordRep;
|
|
|
|
|
_bookingDeliveryRecordCtnRep = bookingDeliveryRecordCtnRep;
|
|
|
|
|
_sysDataUserMenuService = sysDataUserMenuService;
|
|
|
|
|
_djyTenantParamService = djyTenantParamService;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#region 检索始发地、目的港口信息
|
|
|
|
@ -157,9 +163,9 @@ namespace Myshipping.Application.Service.BookingOrder
|
|
|
|
|
/// <param name="model">请求船期详情</param>
|
|
|
|
|
/// <returns>返回船期结果</returns>
|
|
|
|
|
[HttpPost("/BookingMSKSPOTAPI/SearchShipSailingSchedule")]
|
|
|
|
|
public async Task<List<MSKAPISPOTSearchScheduleRateResultDataDto>> SearchShipSailingSchedule(QueryMSKSPOTShipSailingScheduleDto model)
|
|
|
|
|
public async Task<List<MSKAPISPOTScheduleRateResultShowDto>> SearchShipSailingSchedule(QueryMSKSPOTShipSailingScheduleDto model)
|
|
|
|
|
{
|
|
|
|
|
List<MSKAPISPOTSearchScheduleRateResultDataDto> list = new List<MSKAPISPOTSearchScheduleRateResultDataDto>();
|
|
|
|
|
List<MSKAPISPOTScheduleRateResultShowDto> list = new List<MSKAPISPOTScheduleRateResultShowDto>();
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
MSKApiSailingSchedulePoint2Point
|
|
|
|
@ -285,12 +291,155 @@ namespace Myshipping.Application.Service.BookingOrder
|
|
|
|
|
if (resultInfo != null && resultInfo.code == 200
|
|
|
|
|
&& resultInfo.data != null && resultInfo.data.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
list = resultInfo.data;
|
|
|
|
|
foreach (var scheduleModel in resultInfo.data)
|
|
|
|
|
{
|
|
|
|
|
CacheShipSailingSchedule(scheduleModel).GetAwaiter().GetResult();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
list = resultInfo.data.Select(a =>
|
|
|
|
|
{
|
|
|
|
|
MSKAPISPOTScheduleRateResultShowDto showDto = new MSKAPISPOTScheduleRateResultShowDto
|
|
|
|
|
{
|
|
|
|
|
priceID = a.priceID,
|
|
|
|
|
PId = a.PId,
|
|
|
|
|
MD5 = a.MD5,
|
|
|
|
|
totalAmount = a.totalAmount.HasValue ? (decimal)a.totalAmount.Value : 0,
|
|
|
|
|
TotalCurrency = a.totalCurrency,
|
|
|
|
|
orignCarrierCityGeoID = a.originGeoId,
|
|
|
|
|
orignUNLocationCode = a.originUnLocCode,
|
|
|
|
|
orignCityName = a.originCityName,
|
|
|
|
|
originRegionName = a.originRegionName,
|
|
|
|
|
originCountryName = a.originCountryName,
|
|
|
|
|
|
|
|
|
|
deliveryCarrierCityGeoID = a.destinationGeoId,
|
|
|
|
|
deliveryUNLocationCode = a.destinationUnLocCode,
|
|
|
|
|
deliveryCityName = a.destinationCityName,
|
|
|
|
|
deliveryRegionName = a.destinationRegionName,
|
|
|
|
|
deliveryCountryName = a.destinationCountryName,
|
|
|
|
|
|
|
|
|
|
vesselName = a.vesselName,
|
|
|
|
|
carrierDepartureVoyageNumber = a.voyageNumber,
|
|
|
|
|
|
|
|
|
|
foreach (var scheduleModel in list)
|
|
|
|
|
Legs = new List<MSKAPISPOTScheduleRateResultShowLegsDto>()
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//ETD
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(a.departureDate))
|
|
|
|
|
{
|
|
|
|
|
await CacheShipSailingSchedule(scheduleModel);
|
|
|
|
|
DateTime currDate = DateTime.MinValue;
|
|
|
|
|
|
|
|
|
|
if (DateTime.TryParse(a.departureDate, out currDate))
|
|
|
|
|
{
|
|
|
|
|
showDto.ETD = currDate;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
throw Oops.Bah($"查询船期错误,priceID={a.priceID} pid={a.PId} 预计离港日期departureDate={a.departureDate} 格式解析错误");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//ETA
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(a.arrivalDate))
|
|
|
|
|
{
|
|
|
|
|
DateTime currDate = DateTime.MinValue;
|
|
|
|
|
|
|
|
|
|
if (DateTime.TryParse(a.arrivalDate, out currDate))
|
|
|
|
|
{
|
|
|
|
|
showDto.ETA = currDate;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
throw Oops.Bah($"查询船期错误,priceID={a.priceID} pid={a.PId} 预计到达日期 arrivalDate={a.arrivalDate} 格式解析错误");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//计算预计天数
|
|
|
|
|
if (showDto.ETD.HasValue && showDto.ETA.HasValue)
|
|
|
|
|
{
|
|
|
|
|
TimeSpan ts = showDto.ETD.Value.Subtract(showDto.ETA.Value);
|
|
|
|
|
var timeDiff = ts.TotalHours;
|
|
|
|
|
|
|
|
|
|
showDto.days = (int)Math.Ceiling(timeDiff / 24.0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (a.isTransfer.Equals("true", StringComparison.OrdinalIgnoreCase))
|
|
|
|
|
showDto.isTransfer = true;
|
|
|
|
|
|
|
|
|
|
//Legs
|
|
|
|
|
if (a.scheduleDetails != null && a.scheduleDetails.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
var legs = a.scheduleDetails.Select(b =>
|
|
|
|
|
{
|
|
|
|
|
MSKAPISPOTScheduleRateResultShowLegsDto leg = new MSKAPISPOTScheduleRateResultShowLegsDto
|
|
|
|
|
{
|
|
|
|
|
vesselName = b.transport.vessel.longName,
|
|
|
|
|
VoyageNo = b.transport.voyageNumber,
|
|
|
|
|
From = new MSKAPISPOTScheduleRateResultShowLegsLocationDto {
|
|
|
|
|
CityGeoId = b.fromLocation.cityGeoId,
|
|
|
|
|
CityName = b.fromLocation.cityName,
|
|
|
|
|
CountryCode = b.fromLocation.countryCode,
|
|
|
|
|
CountryName = b.fromLocation.countryName,
|
|
|
|
|
rkstCode = b.fromLocation.rkstCode,
|
|
|
|
|
SiteGeoId = b.fromLocation.siteGeoId,
|
|
|
|
|
LocationType = "From",
|
|
|
|
|
RegionName = b.fromLocation.regionName,
|
|
|
|
|
SiteName = b.fromLocation.siteName,
|
|
|
|
|
UnLocCode = b.fromLocation.unLocCode,
|
|
|
|
|
},
|
|
|
|
|
To = new MSKAPISPOTScheduleRateResultShowLegsLocationDto {
|
|
|
|
|
CityGeoId = b.toLocation.cityGeoId,
|
|
|
|
|
CityName = b.toLocation.cityName,
|
|
|
|
|
CountryCode = b.toLocation.countryCode,
|
|
|
|
|
CountryName = b.toLocation.countryName,
|
|
|
|
|
rkstCode = b.toLocation.rkstCode,
|
|
|
|
|
SiteGeoId = b.toLocation.siteGeoId,
|
|
|
|
|
LocationType = "To",
|
|
|
|
|
RegionName = b.toLocation.regionName,
|
|
|
|
|
SiteName = b.toLocation.siteName,
|
|
|
|
|
UnLocCode = b.toLocation.unLocCode,
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//ETD
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(b.fromLocation.date))
|
|
|
|
|
{
|
|
|
|
|
DateTime currDate = DateTime.MinValue;
|
|
|
|
|
|
|
|
|
|
if (DateTime.TryParse($"{b.fromLocation.date} {b.fromLocation.time}", out currDate))
|
|
|
|
|
{
|
|
|
|
|
leg.ETD = currDate;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
throw Oops.Bah($"查询船期错误,航程明细 priceID={a.priceID} pid={a.PId} 预计离港日期fromLocation.date={b.fromLocation.date} {b.fromLocation.time} 格式解析错误");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//ETA
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(b.toLocation.date))
|
|
|
|
|
{
|
|
|
|
|
DateTime currDate = DateTime.MinValue;
|
|
|
|
|
|
|
|
|
|
if (DateTime.TryParse(a.arrivalDate, out currDate))
|
|
|
|
|
{
|
|
|
|
|
leg.ETD = currDate;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
throw Oops.Bah($"查询船期错误,航程明细 priceID={a.priceID} pid={a.PId} 预计到达日期 toLocation.date={b.toLocation.date} {b.toLocation.time} 格式解析错误");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return leg;
|
|
|
|
|
}).ToList();
|
|
|
|
|
showDto.Legs = legs.OrderBy(t=>t.ETD).Select((t,idx)=> {
|
|
|
|
|
t.SortNo = idx + 1;
|
|
|
|
|
return t;
|
|
|
|
|
}).ToList();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return showDto;
|
|
|
|
|
}).ToList();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@ -315,7 +464,7 @@ namespace Myshipping.Application.Service.BookingOrder
|
|
|
|
|
/// <param name="model">船期查询结果明细</param>
|
|
|
|
|
/// <param name="busiType">船期类型 MSKSPOT-马士基即期</param>
|
|
|
|
|
/// <returns>返回主键ID</returns>
|
|
|
|
|
private async Task<long> CacheShipSailingSchedule(MSKAPISPOTSearchScheduleRateResultDataDto model,string busiType = "MSKSPOT")
|
|
|
|
|
private async Task CacheShipSailingSchedule(MSKAPISPOTSearchScheduleRateResultDataDto model,string busiType = "MSKSPOT")
|
|
|
|
|
{
|
|
|
|
|
/*
|
|
|
|
|
1、按照船期明细缓存,并把ID作为缓存的KEY
|
|
|
|
@ -344,8 +493,6 @@ namespace Myshipping.Application.Service.BookingOrder
|
|
|
|
|
{
|
|
|
|
|
await _cache.SetTimeoutAsync(shareKey, Newtonsoft.Json.JsonConvert.SerializeObject(model), expireTimeSpan);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return model.PId;
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
@ -356,7 +503,7 @@ namespace Myshipping.Application.Service.BookingOrder
|
|
|
|
|
/// <param name="model">请求订舱详情</param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
[HttpPost("/BookingMSKSPOTAPI/SendMSKBooking")]
|
|
|
|
|
public async Task<MSKBookingResultDto> SendMSKBooking(MSKBookingDto model)
|
|
|
|
|
public async Task<MSKBookingResultDto> SendMSKBooking(MSKSPOTBookingDto model)
|
|
|
|
|
{
|
|
|
|
|
MSKBookingResultDto result = await InnerSendMSKBooking(model, 0);
|
|
|
|
|
return result;
|
|
|
|
@ -371,7 +518,7 @@ namespace Myshipping.Application.Service.BookingOrder
|
|
|
|
|
/// <param name="currId">当前马士基订舱主键</param>
|
|
|
|
|
/// <param name="isDefaultSave">是否默认保存</param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
private async Task<MSKBookingResultDto> InnerSendMSKBooking(MSKBookingDto model, long currId, bool isDefaultSave = true)
|
|
|
|
|
private async Task<MSKBookingResultDto> InnerSendMSKBooking(MSKSPOTBookingDto model, long currId, bool isDefaultSave = true)
|
|
|
|
|
{
|
|
|
|
|
MSKBookingResultDto result = new MSKBookingResultDto();
|
|
|
|
|
|
|
|
|
@ -686,7 +833,7 @@ namespace Myshipping.Application.Service.BookingOrder
|
|
|
|
|
/// 校验马士基API订舱必填项
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="model"></param>
|
|
|
|
|
private void ValidateMSKAPIData(MSKBookingDto model)
|
|
|
|
|
private void ValidateMSKAPIData(MSKSPOTBookingDto model)
|
|
|
|
|
{
|
|
|
|
|
/*
|
|
|
|
|
马士基API订舱内容校验
|
|
|
|
@ -927,9 +1074,9 @@ namespace Myshipping.Application.Service.BookingOrder
|
|
|
|
|
/// <param name="id">马士基API订舱ID</param>
|
|
|
|
|
/// <returns>返回详情</returns>
|
|
|
|
|
[HttpGet("/BookingMSKSPOTAPI/GetInfo")]
|
|
|
|
|
public async Task<MSKBookingDto> GetInfo(long id)
|
|
|
|
|
public async Task<MSKSPOTBookingDto> GetInfo(long id)
|
|
|
|
|
{
|
|
|
|
|
MSKBookingDto model = null;
|
|
|
|
|
MSKSPOTBookingDto model = null;
|
|
|
|
|
|
|
|
|
|
var entity = await _bookingDeliveryRecordRep.AsQueryable()
|
|
|
|
|
.FirstAsync(a => a.Id == id);
|
|
|
|
@ -937,7 +1084,7 @@ namespace Myshipping.Application.Service.BookingOrder
|
|
|
|
|
if (entity == null)
|
|
|
|
|
throw Oops.Oh($"获取马士基API订舱详情失败,不存在或已作废");
|
|
|
|
|
|
|
|
|
|
model = entity.Adapt<MSKBookingDto>();
|
|
|
|
|
model = entity.Adapt<MSKSPOTBookingDto>();
|
|
|
|
|
|
|
|
|
|
var ctnList = _bookingDeliveryRecordCtnRep.AsQueryable()
|
|
|
|
|
.Where(a => a.RECORD_ID == id && a.IsDeleted == false).ToList();
|
|
|
|
@ -968,7 +1115,7 @@ namespace Myshipping.Application.Service.BookingOrder
|
|
|
|
|
/// <param name="model">请求订舱详情</param>
|
|
|
|
|
/// <returns>返回ID</returns>
|
|
|
|
|
[HttpPost("/BookingMSKSPOTAPI/Save")]
|
|
|
|
|
public async Task<long> Save([FromBody] MSKBookingDto model)
|
|
|
|
|
public async Task<long> Save([FromBody] MSKSPOTBookingDto model)
|
|
|
|
|
{
|
|
|
|
|
return await InnerSave(model);
|
|
|
|
|
}
|
|
|
|
@ -981,7 +1128,7 @@ namespace Myshipping.Application.Service.BookingOrder
|
|
|
|
|
/// <param name="model">API订舱详情</param>
|
|
|
|
|
/// <param name="isSendApi">是否发送API,true-发送需要校验状态;false-不校验状态</param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
private async Task<long> InnerSave(MSKBookingDto model, bool isSendApi = false)
|
|
|
|
|
private async Task<long> InnerSave(MSKSPOTBookingDto model, bool isSendApi = false)
|
|
|
|
|
{
|
|
|
|
|
DateTime nowDate = DateTime.Now;
|
|
|
|
|
|
|
|
|
@ -1256,7 +1403,7 @@ namespace Myshipping.Application.Service.BookingOrder
|
|
|
|
|
/// <param name="model">马士基API批量复制指定数据</param>
|
|
|
|
|
/// <returns>返回执行结果消息</returns>
|
|
|
|
|
[HttpPost("/BookingMSKSPOTAPI/BatchCopy")]
|
|
|
|
|
public async Task<string> BatchCopy(MSKAPIBookingCopyDto model)
|
|
|
|
|
public async Task<string> BatchCopy(MSKAPISPOTBookingCopyDto model)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1450,7 +1597,7 @@ namespace Myshipping.Application.Service.BookingOrder
|
|
|
|
|
/// <param name="model">马士基API批量复制指定数据</param>
|
|
|
|
|
/// <returns>返回提示信息</returns>
|
|
|
|
|
[HttpPost("/BookingMSKSPOTAPI/CheckWarningBatchCopy")]
|
|
|
|
|
public async Task<string> CheckWarningBatchCopy(MSKAPIBookingCopyDto model)
|
|
|
|
|
public async Task<string> CheckWarningBatchCopy(MSKAPISPOTBookingCopyDto model)
|
|
|
|
|
{
|
|
|
|
|
/*
|
|
|
|
|
主要校验内容
|
|
|
|
@ -1534,5 +1681,21 @@ namespace Myshipping.Application.Service.BookingOrder
|
|
|
|
|
return "校验成功";
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 获取初始化页面默认值
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 获取初始化页面默认值
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns>返回详情</returns>
|
|
|
|
|
|
|
|
|
|
public async Task<MSKSPOTBookingInitDto> GetInitInfo()
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
//var paramList = _djyTenantParamService.GetParaCodeWithValue(new[] { CONST_AMENDMENT_DEFAULT_PARAM,
|
|
|
|
|
// CONST_CANCELLATION_DEFAULT_PARAM,
|
|
|
|
|
// CONST_AMENDMENT_DING_DEFAULT_PARAM,
|
|
|
|
|
// CONST_CANCELLATION_DING_DEFAULT_PARAM }).GetAwaiter().GetResult();
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|