|
|
|
@ -1351,141 +1351,136 @@ namespace Myshipping.Application
|
|
|
|
|
/// <param name="model">订舱、截单EDI请求</param>
|
|
|
|
|
/// <returns>返回回执</returns>
|
|
|
|
|
[HttpPost("/BookingOrder/SendBookingOrClosingEDI")]
|
|
|
|
|
public async Task<CommonWebApiResult> SendBookingOrClosingEDI(BookingOrClosingEDIOrderDto model)
|
|
|
|
|
public async Task<string> SendBookingOrClosingEDI(BookingOrClosingEDIOrderDto model)
|
|
|
|
|
{
|
|
|
|
|
CommonWebApiResult result = new CommonWebApiResult();
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
/*
|
|
|
|
|
发送订舱和截单EDI的流程
|
|
|
|
|
1、通过订单号获取订单信息。
|
|
|
|
|
2、检查订单的必填信息。
|
|
|
|
|
3、根据船公司ID获取对应的路由枚举。
|
|
|
|
|
4、获取EDI转换参数。(集装箱型号、包装方式)
|
|
|
|
|
5、读取EDI的配置信息,获取船公司相关的EDI配置。
|
|
|
|
|
6、检查详细信息。
|
|
|
|
|
7、生成订舱或者截单EDI报文,并返回文件保存绝对路径。
|
|
|
|
|
*/
|
|
|
|
|
if (model.Id == 0)
|
|
|
|
|
throw Oops.Oh("订单Id不能为空");
|
|
|
|
|
/*
|
|
|
|
|
发送订舱和截单EDI的流程
|
|
|
|
|
1、通过订单号获取订单信息。
|
|
|
|
|
2、检查订单的必填信息。
|
|
|
|
|
3、根据船公司ID获取对应的路由枚举。
|
|
|
|
|
4、获取EDI转换参数。(集装箱型号、包装方式)
|
|
|
|
|
5、读取EDI的配置信息,获取船公司相关的EDI配置。
|
|
|
|
|
6、检查详细信息。
|
|
|
|
|
7、生成订舱或者截单EDI报文,并返回文件保存绝对路径。
|
|
|
|
|
*/
|
|
|
|
|
if (model.Id == 0)
|
|
|
|
|
throw Oops.Oh("订单Id不能为空");
|
|
|
|
|
|
|
|
|
|
var order = _rep.FirstOrDefault(a => a.Id == model.Id);
|
|
|
|
|
|
|
|
|
|
var order = _rep.AsQueryable().InSingle(model.Id);
|
|
|
|
|
if (order == null)
|
|
|
|
|
throw Oops.Oh($"获取订单信息失败");
|
|
|
|
|
|
|
|
|
|
if(order == null)
|
|
|
|
|
throw Oops.Oh($"获取订单信息失败");
|
|
|
|
|
CheckBookingOrClosingEDI(order);
|
|
|
|
|
|
|
|
|
|
CheckBookingOrClosingEDI(order);
|
|
|
|
|
EDIRouteEnum ediRouteEnum = GetEDIRoute(order.CARRIERID);
|
|
|
|
|
|
|
|
|
|
EDIRouteEnum ediRouteEnum = GetEDIRoute(order.CARRIERID);
|
|
|
|
|
if (ediRouteEnum == EDIRouteEnum.NULL)
|
|
|
|
|
throw Oops.Oh($"当前船公司没有对应的请求路由配置");
|
|
|
|
|
|
|
|
|
|
if (ediRouteEnum == EDIRouteEnum.NULL)
|
|
|
|
|
throw Oops.Oh($"当前船公司没有对应的请求路由配置");
|
|
|
|
|
//集装箱型
|
|
|
|
|
var ediCtnList = _cache.GetAllMappingCtn().GetAwaiter().GetResult()
|
|
|
|
|
.Where(t => t.Module.Equals(CONST_MAPPING_MODULE, StringComparison.OrdinalIgnoreCase)).ToList();
|
|
|
|
|
|
|
|
|
|
//集装箱型
|
|
|
|
|
var ediCtnList = _cache.GetAllMappingCtn().GetAwaiter().GetResult()
|
|
|
|
|
.Where(t=>t.Module.Equals(CONST_MAPPING_MODULE,StringComparison.OrdinalIgnoreCase)).ToList();
|
|
|
|
|
//包装
|
|
|
|
|
var ediPkgsList = _cache.GetAllMappingPackage().GetAwaiter().GetResult()
|
|
|
|
|
.Where(t => t.Module.Equals(CONST_MAPPING_MODULE, StringComparison.OrdinalIgnoreCase)).ToList();
|
|
|
|
|
|
|
|
|
|
//包装
|
|
|
|
|
var ediPkgsList = _cache.GetAllMappingPackage().GetAwaiter().GetResult()
|
|
|
|
|
.Where(t => t.Module.Equals(CONST_MAPPING_MODULE, StringComparison.OrdinalIgnoreCase)).ToList();
|
|
|
|
|
//EDI SO\SI代码
|
|
|
|
|
var ediSOSICfg = _cache.GetAllMappingCarrier().GetAwaiter().GetResult()
|
|
|
|
|
.FirstOrDefault(t => t.Module.Equals(CONST_MAPPING_MODULE, StringComparison.OrdinalIgnoreCase)
|
|
|
|
|
&& t.Code.Equals(order.CARRIERID, StringComparison.OrdinalIgnoreCase));
|
|
|
|
|
|
|
|
|
|
//EDI SO\SI代码
|
|
|
|
|
var ediSOSICfg = _cache.GetAllMappingCarrier().GetAwaiter().GetResult()
|
|
|
|
|
.FirstOrDefault(t => t.Module.Equals(CONST_MAPPING_MODULE, StringComparison.OrdinalIgnoreCase)
|
|
|
|
|
&& t.Code.Equals(order.CARRIERID, StringComparison.OrdinalIgnoreCase));
|
|
|
|
|
if (ediSOSICfg == null || string.IsNullOrWhiteSpace(ediSOSICfg.MapCode))
|
|
|
|
|
throw Oops.Oh($"CARRIERID={order.CARRIERID} 发送SO(SI)的船公司EDI代码未找到");
|
|
|
|
|
|
|
|
|
|
if(ediSOSICfg == null || string.IsNullOrWhiteSpace(ediSOSICfg.MapCode))
|
|
|
|
|
throw Oops.Oh($"CARRIERID={order.CARRIERID} 发送SO(SI)的船公司EDI代码未找到");
|
|
|
|
|
var ediModel = new EDIBaseModel();
|
|
|
|
|
|
|
|
|
|
var ediModel = new EDIBaseModel();
|
|
|
|
|
var ftpSet = _cache.GetAllEdiSetting().GetAwaiter().GetResult()
|
|
|
|
|
.FirstOrDefault(a => a.EDICODE.Equals(ediRouteEnum.ToString(), StringComparison.OrdinalIgnoreCase));
|
|
|
|
|
|
|
|
|
|
var ftpSet = _cache.GetAllEdiSetting().GetAwaiter().GetResult()
|
|
|
|
|
.FirstOrDefault(a => a.EDICODE.Equals(ediRouteEnum.ToString(), StringComparison.OrdinalIgnoreCase));
|
|
|
|
|
if (ftpSet == null)
|
|
|
|
|
throw Oops.Oh($"获取EDICODE={ediRouteEnum.ToString()}的EDI参数设置失败");
|
|
|
|
|
|
|
|
|
|
if (ftpSet == null)
|
|
|
|
|
throw Oops.Oh($"获取EDICODE={ediRouteEnum.ToString()}的EDI参数设置失败");
|
|
|
|
|
ediModel.SENDCODE = ftpSet.SENDCODE;
|
|
|
|
|
ediModel.SENDNAME = ftpSet.SENDNAME;
|
|
|
|
|
ediModel.RECEIVECODE = ftpSet.RECEIVECODE;
|
|
|
|
|
|
|
|
|
|
ediModel.SENDCODE = ftpSet.SENDCODE;
|
|
|
|
|
ediModel.SENDNAME = ftpSet.SENDNAME;
|
|
|
|
|
ediModel.RECEIVECODE = ftpSet.RECEIVECODE;
|
|
|
|
|
ediModel.filetype = model.sendType; //订舱
|
|
|
|
|
ediModel.filerole = model.fileRole;
|
|
|
|
|
|
|
|
|
|
ediModel.filetype = model.sendType; //订舱
|
|
|
|
|
ediModel.filerole = model.fileRole;
|
|
|
|
|
//读取文件配置
|
|
|
|
|
var fileCfg = App.GetOptions<BookingAttachOptions>();
|
|
|
|
|
|
|
|
|
|
//读取文件配置
|
|
|
|
|
var fileCfg = App.GetOptions<BookingAttachOptions>();
|
|
|
|
|
string filePath = $"{Path.Combine(!string.IsNullOrWhiteSpace(fileCfg.basePath) ? fileCfg.basePath : App.WebHostEnvironment.WebRootPath, fileCfg.relativePath)}/edifiles/{order.BSNO}";
|
|
|
|
|
|
|
|
|
|
string filePath = $"{Path.Combine(!string.IsNullOrWhiteSpace(fileCfg.basePath) ? fileCfg.basePath : App.WebHostEnvironment.WebRootPath,fileCfg.relativePath)}/edifiles/{order.BSNO}";
|
|
|
|
|
ediModel.filerpath = filePath;
|
|
|
|
|
|
|
|
|
|
ediModel.filerpath = filePath;
|
|
|
|
|
ediModel.UseForWarderCode = model.useForwarderCode;
|
|
|
|
|
ediModel.ForWarderCode = model.forwarderCode;
|
|
|
|
|
ediModel.ForWarderName = model.forwarderName;
|
|
|
|
|
|
|
|
|
|
ediModel.UseForWarderCode = model.useForwarderCode;
|
|
|
|
|
ediModel.ForWarderCode = model.forwarderCode;
|
|
|
|
|
ediModel.ForWarderName = model.forwarderName;
|
|
|
|
|
ediModel.BSLIST = new List<MsOpSeaeEDIBaseModel>();
|
|
|
|
|
|
|
|
|
|
ediModel.BSLIST = new List<MsOpSeaeEDIBaseModel>();
|
|
|
|
|
var primaryModel = order.Adapt<MsOpSeaeEDIBaseModel>();
|
|
|
|
|
|
|
|
|
|
var primaryModel = order.Adapt<MsOpSeaeEDIBaseModel>();
|
|
|
|
|
primaryModel.CARRIEREDICODE = ediSOSICfg.MapCode;
|
|
|
|
|
|
|
|
|
|
primaryModel.CARRIEREDICODE = ediSOSICfg.MapCode;
|
|
|
|
|
var ediPkgs = ediPkgsList.FirstOrDefault(x => x.Code.Equals(order.KINDPKGS, StringComparison.OrdinalIgnoreCase));
|
|
|
|
|
|
|
|
|
|
var ediPkgs = ediPkgsList.FirstOrDefault(x => x.Code.Equals(order.KINDPKGS, StringComparison.OrdinalIgnoreCase));
|
|
|
|
|
if (ediPkgs == null || string.IsNullOrWhiteSpace(ediPkgs.MapCode))
|
|
|
|
|
throw Oops.Oh($"包装{order.KINDPKGS}的EDI代码未找到");
|
|
|
|
|
|
|
|
|
|
if (ediPkgs == null || string.IsNullOrWhiteSpace(ediPkgs.MapCode))
|
|
|
|
|
throw Oops.Oh($"包装{order.KINDPKGS}的EDI代码未找到");
|
|
|
|
|
primaryModel.KINDPKGS_EDI_CODE = ediPkgs.MapCode?.Trim();
|
|
|
|
|
|
|
|
|
|
primaryModel.KINDPKGS_EDI_CODE = ediPkgs.MapCode?.Trim();
|
|
|
|
|
//箱信息
|
|
|
|
|
var contaList = _repCtn.AsQueryable().Where(t => t.BILLID == order.Id).ToList();
|
|
|
|
|
|
|
|
|
|
//箱信息
|
|
|
|
|
var contaList =_repCtn.AsQueryable().Where(t => t.BILLID == order.Id).ToList();
|
|
|
|
|
primaryModel.CTNLIST = new List<MsOpSeaeCtnEDIBaseModel>();
|
|
|
|
|
|
|
|
|
|
primaryModel.CTNLIST = new List<MsOpSeaeCtnEDIBaseModel>();
|
|
|
|
|
foreach (var conta in contaList)
|
|
|
|
|
{
|
|
|
|
|
var contaModel = conta.Adapt<MsOpSeaeCtnEDIBaseModel>();
|
|
|
|
|
|
|
|
|
|
foreach (var conta in contaList)
|
|
|
|
|
var currConta = ediCtnList.FirstOrDefault(x => x.Code.Equals(conta.CTNALL, StringComparison.OrdinalIgnoreCase));
|
|
|
|
|
if (currConta != null)
|
|
|
|
|
{
|
|
|
|
|
var contaModel = conta.Adapt<MsOpSeaeCtnEDIBaseModel>();
|
|
|
|
|
|
|
|
|
|
var currConta = ediCtnList.FirstOrDefault(x => x.Code.Equals(conta.CTNALL, StringComparison.OrdinalIgnoreCase));
|
|
|
|
|
if (currConta != null)
|
|
|
|
|
{
|
|
|
|
|
contaModel.CTNALLCODE = currConta.MapCode;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
primaryModel.CTNLIST.Add(contaModel);
|
|
|
|
|
contaModel.CTNALLCODE = currConta.MapCode;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//多品名
|
|
|
|
|
var cargoList = _ctndetailrep.AsQueryable().Where(t => contaList.Select(a => a.Id).ToArray().Contains(t.CTNID.Value)).ToList();
|
|
|
|
|
primaryModel.CTNLIST.Add(contaModel);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
primaryModel.CTNGOODSLIST = new List<MsOpSeaeCtnDetailEDIBaseModel>();
|
|
|
|
|
//多品名
|
|
|
|
|
var cargoList = _ctndetailrep.AsQueryable().Where(t => contaList.Select(a => a.Id).ToArray().Contains(t.CTNID.Value)).ToList();
|
|
|
|
|
|
|
|
|
|
foreach (var cargo in cargoList)
|
|
|
|
|
{
|
|
|
|
|
MsOpSeaeCtnDetailEDIBaseModel cargoModel = cargo.Adapt<MsOpSeaeCtnDetailEDIBaseModel>();
|
|
|
|
|
primaryModel.CTNGOODSLIST = new List<MsOpSeaeCtnDetailEDIBaseModel>();
|
|
|
|
|
|
|
|
|
|
cargoModel.CNTRNO = contaList.FirstOrDefault(a => a.Id == cargo.CTNID.Value).CNTRNO;
|
|
|
|
|
foreach (var cargo in cargoList)
|
|
|
|
|
{
|
|
|
|
|
MsOpSeaeCtnDetailEDIBaseModel cargoModel = cargo.Adapt<MsOpSeaeCtnDetailEDIBaseModel>();
|
|
|
|
|
|
|
|
|
|
var ediDetailPkgs = ediPkgsList.FirstOrDefault(x => x.Code.Equals(cargo.KINDPKGS, StringComparison.OrdinalIgnoreCase));
|
|
|
|
|
if (ediDetailPkgs != null)
|
|
|
|
|
{
|
|
|
|
|
cargoModel.KINDPKGS_EDI_CODE = ediDetailPkgs.MapCode;
|
|
|
|
|
}
|
|
|
|
|
cargoModel.CNTRNO = contaList.FirstOrDefault(a => a.Id == cargo.CTNID.Value).CNTRNO;
|
|
|
|
|
|
|
|
|
|
primaryModel.CTNGOODSLIST.Add(cargoModel);
|
|
|
|
|
var ediDetailPkgs = ediPkgsList.FirstOrDefault(x => x.Code.Equals(cargo.KINDPKGS, StringComparison.OrdinalIgnoreCase));
|
|
|
|
|
if (ediDetailPkgs != null)
|
|
|
|
|
{
|
|
|
|
|
cargoModel.KINDPKGS_EDI_CODE = ediDetailPkgs.MapCode;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ediModel.BSLIST.Add(primaryModel);
|
|
|
|
|
|
|
|
|
|
result = await InnerSendBookingOrClosingEDI(model, ediModel, ediRouteEnum);
|
|
|
|
|
primaryModel.CTNGOODSLIST.Add(cargoModel);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
|
|
|
|
ediModel.BSLIST.Add(primaryModel);
|
|
|
|
|
|
|
|
|
|
var result = await InnerSendBookingOrClosingEDI(model, ediModel, ediRouteEnum);
|
|
|
|
|
|
|
|
|
|
if(!result.succ)
|
|
|
|
|
{
|
|
|
|
|
result.succ = false;
|
|
|
|
|
result.msg = ex.Message;
|
|
|
|
|
throw Oops.Oh(result.msg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
return result.extra.ToString();
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|