|
|
|
@ -70,6 +70,8 @@ namespace Myshipping.Application
|
|
|
|
|
private readonly SqlSugarRepository<SysUser> _repUser;
|
|
|
|
|
private readonly SqlSugarRepository<BookingOrderUrl> _repOrderUrl;
|
|
|
|
|
private readonly SqlSugarRepository<BookingOrderContact> _repOrderContact;
|
|
|
|
|
private readonly SqlSugarRepository<DjyUserMailAccount> _repUserMail;
|
|
|
|
|
private readonly SqlSugarRepository<SysTenant> _repTenant;
|
|
|
|
|
|
|
|
|
|
const string CONST_MAPPING_MODULE = "BOOK_OR_CLOSING";
|
|
|
|
|
|
|
|
|
@ -80,7 +82,8 @@ namespace Myshipping.Application
|
|
|
|
|
SqlSugarRepository<SysDictData> dicdata, SqlSugarRepository<BookingStatusLog> statuslog, SqlSugarRepository<BookingStatusLogDetail> statuslogdetail,
|
|
|
|
|
ILogger<BookingOrderService> logger, ISysCacheService cache,
|
|
|
|
|
SqlSugarRepository<BookingPrintTemplate> repPrintTemplate, SqlSugarRepository<BookingLetteryard> repLetterYard, SqlSugarRepository<SysUser> repUser,
|
|
|
|
|
SqlSugarRepository<BookingOrderUrl> repOrderUrl, SqlSugarRepository<BookingOrderContact> repOrderContact)
|
|
|
|
|
SqlSugarRepository<BookingOrderUrl> repOrderUrl, SqlSugarRepository<BookingOrderContact> repOrderContact, SqlSugarRepository<DjyUserMailAccount> repUserMail,
|
|
|
|
|
SqlSugarRepository<SysTenant> repTenant)
|
|
|
|
|
{
|
|
|
|
|
this._logger = logger;
|
|
|
|
|
this._rep = rep;
|
|
|
|
@ -101,6 +104,8 @@ namespace Myshipping.Application
|
|
|
|
|
this._repUser = repUser;
|
|
|
|
|
this._repOrderUrl = repOrderUrl;
|
|
|
|
|
this._repOrderContact = repOrderContact;
|
|
|
|
|
this._repUserMail = repUserMail;
|
|
|
|
|
this._repTenant = repTenant;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#region 主表和箱信息
|
|
|
|
@ -534,7 +539,6 @@ namespace Myshipping.Application
|
|
|
|
|
FilePath = fileRelaPath,
|
|
|
|
|
TypeCode = dto.TypeCode,
|
|
|
|
|
TypeName = dto.TypeName,
|
|
|
|
|
TenantId = Convert.ToInt16(UserManager.TENANT_ID),
|
|
|
|
|
TenantName = UserManager.TENANT_NAME,
|
|
|
|
|
};
|
|
|
|
|
await _bookingfile.InsertAsync(newFile);
|
|
|
|
@ -743,7 +747,101 @@ namespace Myshipping.Application
|
|
|
|
|
throw Oops.Oh("放舱信息未找到,请先保存数据");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var mailAcc = await _repUserMail.FirstOrDefaultAsync(x => x.CreatedUserId == UserManager.UserId && x.SmtpPort > 0 && x.SmtpServer != null && x.SmtpServer != "");
|
|
|
|
|
if (mailAcc == null)
|
|
|
|
|
{
|
|
|
|
|
throw Oops.Oh("用户邮箱未设置或smtp未正确配置");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var orderUrl = await _repOrderUrl.FirstOrDefaultAsync(u => u.BookingId == bookingId);
|
|
|
|
|
if (orderUrl == null)
|
|
|
|
|
{
|
|
|
|
|
throw Oops.Oh("未生成链接信息,请重新保存数据");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#region 保存放舱文件,并挂载到订舱附件
|
|
|
|
|
var fileBytes = await LetterYardFile(bookingId);
|
|
|
|
|
var opt = App.GetOptions<BookingAttachOptions>();
|
|
|
|
|
var fileSaveName = $"放舱_{order.MBLNO}_{DateTime.Now.Ticks}.pdf"; // 文件原始名称
|
|
|
|
|
var dirAbs = string.Empty;
|
|
|
|
|
if (string.IsNullOrEmpty(opt.basePath))
|
|
|
|
|
{
|
|
|
|
|
dirAbs = Path.Combine(App.WebHostEnvironment.WebRootPath, opt.relativePath);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
dirAbs = Path.Combine(opt.basePath, opt.relativePath);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!Directory.Exists(dirAbs))
|
|
|
|
|
Directory.CreateDirectory(dirAbs);
|
|
|
|
|
|
|
|
|
|
var fileRelaPath = Path.Combine(opt.relativePath, fileSaveName).ToLower();
|
|
|
|
|
var fileAbsPath = Path.Combine(dirAbs, fileSaveName).ToLower();
|
|
|
|
|
|
|
|
|
|
File.WriteAllBytes(fileAbsPath, fileBytes);
|
|
|
|
|
|
|
|
|
|
var newFile = new BookingFile
|
|
|
|
|
{
|
|
|
|
|
FileName = fileSaveName,
|
|
|
|
|
FilePath = fileRelaPath,
|
|
|
|
|
TypeCode = "ruhuotongzhi",
|
|
|
|
|
TypeName = ".pdf",
|
|
|
|
|
TenantName = UserManager.TENANT_NAME,
|
|
|
|
|
};
|
|
|
|
|
await _bookingfile.InsertAsync(newFile);
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
//货运动态
|
|
|
|
|
var bsl = new BookingStatusLog();
|
|
|
|
|
bsl.BookingId = bookingId;
|
|
|
|
|
bsl.Status = $"放舱给客户";
|
|
|
|
|
bsl.OpTime = DateTime.Now;
|
|
|
|
|
bsl.Category = "ship";
|
|
|
|
|
bsl.MBLNO = order.MBLNO;
|
|
|
|
|
await _repStatuslog.InsertAsync(bsl);
|
|
|
|
|
|
|
|
|
|
#region 发送邮件
|
|
|
|
|
var user = await _repUser.FirstOrDefaultAsync(u => u.Id == order.CreatedUserId);
|
|
|
|
|
var tenant = await _repTenant.FirstOrDefaultAsync(t => t.Id == order.TenantId);
|
|
|
|
|
|
|
|
|
|
var mailSubject = $"放舱信息:{order.MBLNO}/{order.CARRIERID}/{order.VESSEL}/{order.VOYNO}/PO:{order.PONO}/{order.TenantName}";
|
|
|
|
|
|
|
|
|
|
var extContent = string.Empty;
|
|
|
|
|
if (order.CARGOID == "R") //冻柜
|
|
|
|
|
{
|
|
|
|
|
extContent = $"温度:{order.TEMPSET}{order.TEMPID} <br/>通风:{order.REEFERF} <br/>湿度:{order.HUMIDITY}<br/>";
|
|
|
|
|
}
|
|
|
|
|
else if (order.CARGOID == "D") //危险品
|
|
|
|
|
{
|
|
|
|
|
extContent = $"危险品等级:{order.DCLASS} <br/>危险品编号:{order.DUNNO}<br/>";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var mailContent = $@"TO:{order.CUSTOMERNAME} 贵司委托我司代理订舱出口的货物信息如下,详情请见附件,谢谢!<br/>
|
|
|
|
|
提单号:{order.MBLNO}<br/>
|
|
|
|
|
船名航次:{order.VESSEL}/{order.VOYNO}<br/>
|
|
|
|
|
目的港:{order.PORTDISCHARGE}<br/>
|
|
|
|
|
预计船期:{(order.ETD.HasValue ? order.ETD.Value.Date.ToString("yyyy-MM-dd") : "")}<br/>
|
|
|
|
|
场站:{order.YARD}<br/>
|
|
|
|
|
船代:{order.SHIPAGENCY}<br/>
|
|
|
|
|
预计截港时间:{order.CLOSINGDATE}<br/>
|
|
|
|
|
预计截单时间:{order.CLOSEDOCDATE}<br/>
|
|
|
|
|
截VGM时间:{order.CLOSEVGMDATE}<br/>
|
|
|
|
|
{extContent}
|
|
|
|
|
备注:{order.YARDREMARK}<br/>
|
|
|
|
|
提箱小票链接:<a href='{orderUrl.UrlTxxp}'>{orderUrl.UrlTxxp}</a><br/>
|
|
|
|
|
提交VGM链接:<a href='{orderUrl.UrlVgm}'>{orderUrl.UrlVgm}</a><br/>
|
|
|
|
|
<br/>
|
|
|
|
|
<span style='color:red;'>温馨提示:</span><br/>
|
|
|
|
|
<span style='color:red;'>如果分票报关,请回箱前通知场站及我司。</span><br/>
|
|
|
|
|
<span style='color:red;'>开船及截港时间以码头具体计划为准。</span><br/>
|
|
|
|
|
<span style='color:red;'>若贵司自输VGM,请不要通过VGM链接提交数据,否则我司收取相关VGM申报费用。</span><br/>
|
|
|
|
|
<br/>
|
|
|
|
|
订舱代理联系人:{UserManager.Name}<br/>
|
|
|
|
|
电话:{user.Tel} 手机:{user.Phone}<br/>
|
|
|
|
|
邮箱:{user.Email}
|
|
|
|
|
<br/>";
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -754,7 +852,10 @@ namespace Myshipping.Application
|
|
|
|
|
[HttpGet("/BookingOrder/letteryardpdf")]
|
|
|
|
|
public async Task<IActionResult> LetterYardPdf(long bookingId)
|
|
|
|
|
{
|
|
|
|
|
return await LetterYardFile(bookingId, 1);
|
|
|
|
|
var bs = await LetterYardFile(bookingId, 1);
|
|
|
|
|
var fileName = HttpUtility.UrlEncode($"{bookingId}_{DateTime.Now.Ticks}.pdf", Encoding.GetEncoding("UTF-8"));
|
|
|
|
|
var result = new FileContentResult(bs, "application/octet-stream") { FileDownloadName = fileName };
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -765,7 +866,10 @@ namespace Myshipping.Application
|
|
|
|
|
[HttpGet("/BookingOrder/letteryardxlsx")]
|
|
|
|
|
public async Task<IActionResult> LetterYardXlsx(long bookingId)
|
|
|
|
|
{
|
|
|
|
|
return await LetterYardFile(bookingId, 2);
|
|
|
|
|
var bs = await LetterYardFile(bookingId, 2);
|
|
|
|
|
var fileName = HttpUtility.UrlEncode($"{bookingId}_{DateTime.Now.Ticks}.xlsx", Encoding.GetEncoding("UTF-8"));
|
|
|
|
|
var result = new FileContentResult(bs, "application/octet-stream") { FileDownloadName = fileName };
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -775,7 +879,7 @@ namespace Myshipping.Application
|
|
|
|
|
/// <param name="type">类型,1:pdf、2:xlsx</param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
[NonAction]
|
|
|
|
|
private async Task<IActionResult> LetterYardFile(long bookingId, int type = 1)
|
|
|
|
|
private async Task<byte[]> LetterYardFile(long bookingId, int type = 1)
|
|
|
|
|
{
|
|
|
|
|
//打印报表服务地址
|
|
|
|
|
var reportUrl = _cache.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "url_set" && x.Code == "url_report_generate").Value;
|
|
|
|
@ -835,9 +939,7 @@ namespace Myshipping.Application
|
|
|
|
|
|
|
|
|
|
_logger.LogInformation($"调用读取放舱文件返回:{bs.Length}");
|
|
|
|
|
|
|
|
|
|
var fileName = HttpUtility.UrlEncode($"{bookingId}_{type}_{DateTime.Now.Ticks}.{(type == 1 ? "pdf" : "xlsx")}", Encoding.GetEncoding("UTF-8"));
|
|
|
|
|
var result = new FileContentResult(bs, "application/octet-stream") { FileDownloadName = fileName };
|
|
|
|
|
return result;
|
|
|
|
|
return bs;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@ -1366,7 +1468,7 @@ namespace Myshipping.Application
|
|
|
|
|
|
|
|
|
|
var order = _rep.AsQueryable().InSingle(model.Id);
|
|
|
|
|
|
|
|
|
|
if(order == null)
|
|
|
|
|
if (order == null)
|
|
|
|
|
throw Oops.Oh($"获取订单信息失败");
|
|
|
|
|
|
|
|
|
|
CheckBookingOrClosingEDI(order);
|
|
|
|
@ -1378,7 +1480,7 @@ namespace Myshipping.Application
|
|
|
|
|
|
|
|
|
|
//集装箱型
|
|
|
|
|
var ediCtnList = _cache.GetAllMappingCtn().GetAwaiter().GetResult()
|
|
|
|
|
.Where(t=>t.Module.Equals(CONST_MAPPING_MODULE,StringComparison.OrdinalIgnoreCase)).ToList();
|
|
|
|
|
.Where(t => t.Module.Equals(CONST_MAPPING_MODULE, StringComparison.OrdinalIgnoreCase)).ToList();
|
|
|
|
|
|
|
|
|
|
//包装
|
|
|
|
|
var ediPkgsList = _cache.GetAllMappingPackage().GetAwaiter().GetResult()
|
|
|
|
@ -1386,10 +1488,10 @@ namespace Myshipping.Application
|
|
|
|
|
|
|
|
|
|
//EDI SO\SI代码
|
|
|
|
|
var ediSOSICfg = _cache.GetAllMappingCarrier().GetAwaiter().GetResult()
|
|
|
|
|
.FirstOrDefault(t => t.Module.Equals(CONST_MAPPING_MODULE, StringComparison.OrdinalIgnoreCase)
|
|
|
|
|
.FirstOrDefault(t => t.Module.Equals(CONST_MAPPING_MODULE, StringComparison.OrdinalIgnoreCase)
|
|
|
|
|
&& t.Code.Equals(order.CARRIERID, StringComparison.OrdinalIgnoreCase));
|
|
|
|
|
|
|
|
|
|
if(ediSOSICfg == null || string.IsNullOrWhiteSpace(ediSOSICfg.MapCode))
|
|
|
|
|
if (ediSOSICfg == null || string.IsNullOrWhiteSpace(ediSOSICfg.MapCode))
|
|
|
|
|
throw Oops.Oh($"CARRIERID={order.CARRIERID} 发送SO(SI)的船公司EDI代码未找到");
|
|
|
|
|
|
|
|
|
|
var ediModel = new EDIBaseModel();
|
|
|
|
@ -1447,7 +1549,7 @@ namespace Myshipping.Application
|
|
|
|
|
//primaryModel.BSNOLIST = ""; //暂时不用
|
|
|
|
|
|
|
|
|
|
//箱信息
|
|
|
|
|
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>();
|
|
|
|
|
|
|
|
|
@ -1498,7 +1600,7 @@ namespace Myshipping.Application
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
private async Task<CommonWebApiResult> InnerSendBookingOrClosingEDI(BookingOrClosingEDIOrderDto model,EDIBaseModel ediModel,EDIRouteEnum ediRouteEnum)
|
|
|
|
|
private async Task<CommonWebApiResult> InnerSendBookingOrClosingEDI(BookingOrClosingEDIOrderDto model, EDIBaseModel ediModel, EDIRouteEnum ediRouteEnum)
|
|
|
|
|
{
|
|
|
|
|
CommonWebApiResult result = new CommonWebApiResult();
|
|
|
|
|
|
|
|
|
@ -1517,7 +1619,7 @@ namespace Myshipping.Application
|
|
|
|
|
|
|
|
|
|
result.succ = true;
|
|
|
|
|
result.extra = ediFile;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
@ -1534,7 +1636,7 @@ namespace Myshipping.Application
|
|
|
|
|
/// <param name="order"></param>
|
|
|
|
|
private void CheckBookingOrClosingEDI(BookingOrder order)
|
|
|
|
|
{
|
|
|
|
|
if(string.IsNullOrWhiteSpace(order.CARRIERID))
|
|
|
|
|
if (string.IsNullOrWhiteSpace(order.CARRIERID))
|
|
|
|
|
throw Oops.Oh("船公司必须填写");
|
|
|
|
|
|
|
|
|
|
if (string.IsNullOrWhiteSpace(order.OPID))
|
|
|
|
|