|
|
|
@ -2,6 +2,7 @@
|
|
|
|
|
using DS.Module.Core;
|
|
|
|
|
using DS.Module.Core.Data;
|
|
|
|
|
using DS.Module.Core.Extensions;
|
|
|
|
|
using DS.Module.Core.Helpers;
|
|
|
|
|
using DS.Module.SqlSugar;
|
|
|
|
|
using DS.Module.UserModule;
|
|
|
|
|
using DS.WMS.Core.Code.Entity;
|
|
|
|
@ -15,6 +16,7 @@ using Mapster;
|
|
|
|
|
using Microsoft.AspNetCore.Hosting;
|
|
|
|
|
using Microsoft.AspNetCore.Identity;
|
|
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
|
using NLog;
|
|
|
|
|
using Org.BouncyCastle.Ocsp;
|
|
|
|
|
using SqlSugar;
|
|
|
|
@ -161,160 +163,289 @@ namespace DS.WMS.Core.Op.Method
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// public async Task<DataResult> SendLetterYard(string id)
|
|
|
|
|
// {
|
|
|
|
|
// var tenant = db.Queryable<SysTenant>().FirstAsync(t => t.Id == long.Parse(user.TenantId));
|
|
|
|
|
|
|
|
|
|
// var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
|
|
|
|
|
// var bookingId = long.Parse(id);
|
|
|
|
|
// var order = await tenantDb.Queryable<SeaExport>().FirstAsync(x => x.Id == bookingId);
|
|
|
|
|
// var userInfo = await tenantDb.Queryable<SysUser>().FirstAsync(u => u.Id == order.CreateBy);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// var letterYard = await tenantDb.Queryable<BusinessYard>().FirstAsync(x => x.BusinessId == bookingId);
|
|
|
|
|
// if (letterYard.IsNull())
|
|
|
|
|
// {
|
|
|
|
|
// return await Task.FromResult(DataResult.Failed("放舱信息未找到,请先保存数据"));
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// if (string.IsNullOrEmpty(letterYard.ToAttnEmail))
|
|
|
|
|
// {
|
|
|
|
|
// return await Task.FromResult(DataResult.Failed("ATTN MAIL未正确填写"));
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// if (string.IsNullOrEmpty(letterYard.FromEmail))
|
|
|
|
|
// {
|
|
|
|
|
// return await Task.FromResult(DataResult.Failed("FROM MAIL未正确填写"));
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// var mailAcc = await tenantDb.Queryable<CodeUserEmail>().FirstAsync(x => x.CreateBy == long.Parse(user.UserId) && x.MailAccount == letterYard.FromEmail && x.SmtpPort > 0 && x.SmtpServer != null && x.SmtpServer != "");
|
|
|
|
|
// if (mailAcc == null)
|
|
|
|
|
// {
|
|
|
|
|
// return await Task.FromResult(DataResult.Failed("用户邮箱未设置或smtp未正确配置"));
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// var orderUrl = await tenantDb.Queryable<BookingOrderUrl>().FirstAsync(u => u.BusinessId == bookingId);
|
|
|
|
|
// //if (orderUrl == null)
|
|
|
|
|
// //{
|
|
|
|
|
// // throw Oops.Bah("未生成链接信息,请重新保存数据");
|
|
|
|
|
// //}
|
|
|
|
|
|
|
|
|
|
// #region 保存放舱文件,并挂载到订舱附件
|
|
|
|
|
// var printTemplate = await db.Queryable<SysPrintTemplate>().FirstAsync(t => t.TemplateCode == "release_the_cabin");
|
|
|
|
|
// if (printTemplate.IsNull())
|
|
|
|
|
// {
|
|
|
|
|
// return await Task.FromResult(DataResult.Failed("打印模板代码[release_the_cabin]未设置"));
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// var bs = await GenPrintFile(bookingId, printTemplate);
|
|
|
|
|
|
|
|
|
|
// var basePath = AppSetting.app(new string[] { "FileSettings", "BasePath" });
|
|
|
|
|
// var relativePath = AppSetting.app(new string[] { "FileSettings", "RelativePath" });
|
|
|
|
|
// var dirAbs = string.Empty;
|
|
|
|
|
// var fileRelaPath = string.Empty;
|
|
|
|
|
// var fileAbsPath = string.Empty;
|
|
|
|
|
// var fileSaveName = $"放舱通知_{order.MBLNO}_{DateTime.Now.Ticks}.pdf"; // 文件原始名称
|
|
|
|
|
// if (string.IsNullOrEmpty(basePath))
|
|
|
|
|
// {
|
|
|
|
|
// dirAbs = Path.Combine(_environment.WebRootPath, relativePath);
|
|
|
|
|
// }
|
|
|
|
|
// else
|
|
|
|
|
// {
|
|
|
|
|
// dirAbs = Path.Combine(basePath, relativePath);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// if (!Directory.Exists(dirAbs))
|
|
|
|
|
// Directory.CreateDirectory(dirAbs);
|
|
|
|
|
|
|
|
|
|
// fileRelaPath = Path.Combine(relativePath, fileSaveName).ToLower();
|
|
|
|
|
// fileAbsPath = Path.Combine(dirAbs, fileSaveName).ToLower();
|
|
|
|
|
|
|
|
|
|
// File.WriteAllBytes(fileAbsPath, bs);
|
|
|
|
|
|
|
|
|
|
// //挂载附件
|
|
|
|
|
// var bookFile = new OpFile
|
|
|
|
|
// {
|
|
|
|
|
// FileName = fileSaveName,
|
|
|
|
|
// FilePath = fileRelaPath,
|
|
|
|
|
// TypeCode = "ruhuotongzhi",
|
|
|
|
|
// TypeName = ".pdf",
|
|
|
|
|
// LinkId = order.Id,
|
|
|
|
|
// };
|
|
|
|
|
// await tenantDb.Insertable(bookFile).ExecuteCommandAsync();
|
|
|
|
|
// #endregion
|
|
|
|
|
|
|
|
|
|
// //货运动态
|
|
|
|
|
// var bookingStatusLog = new BookingStatusLog()
|
|
|
|
|
// {
|
|
|
|
|
// BusinessId = bookingId,
|
|
|
|
|
// Status = $"放舱给客户",
|
|
|
|
|
// Group = "ship",
|
|
|
|
|
// OpTime = DateTime.Now,
|
|
|
|
|
// MBLNO = order.MBLNO
|
|
|
|
|
// };
|
|
|
|
|
// await tenantDb.Insertable(bookingStatusLog).ExecuteCommandAsync();
|
|
|
|
|
|
|
|
|
|
// //订舱状态
|
|
|
|
|
// await seaComService.SaveBookingStatus(bookingId, "sta_letter_yard", "放舱");
|
|
|
|
|
|
|
|
|
|
// #region 发送邮件
|
|
|
|
|
|
|
|
|
|
// var carrCode = seaComService.GetCarrierCode(order.CarrierId, tenantDb);
|
|
|
|
|
// var mailSubject = $"放舱信息:{order.MBLNO}/{carrCode}/{order.Vessel}/{order.Voyno}/PO:{order.CustomerNo}/{userInfo.TenantName}";
|
|
|
|
|
|
|
|
|
|
// var extContent = string.Empty;
|
|
|
|
|
// if (order.CargoId == "R") //冻柜
|
|
|
|
|
// {
|
|
|
|
|
// extContent = $"温度:{order.TemperatureSet}{order.TemperatureUnit} <br/>通风:{order.ReeferQuantity} <br/>湿度:{order.Humidity}<br/>";
|
|
|
|
|
// }
|
|
|
|
|
// else if (order.CargoId == "D") //危险品
|
|
|
|
|
// {
|
|
|
|
|
// extContent = $"危险品等级:{order.DangerClass} <br/>危险品编号:{order.DangerNo}<br/>";
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// var linkContent = string.Empty;
|
|
|
|
|
// if (orderUrl != null)
|
|
|
|
|
// {
|
|
|
|
|
// linkContent = $@"提箱小票链接:<a href='{orderUrl.UrlTxxp}'>{orderUrl.UrlTxxp}</a><br/>
|
|
|
|
|
//提交VGM链接:<a href='{orderUrl.UrlVgm}'>{orderUrl.UrlVgm}</a><br/>";
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// var mailContent = $@"TO:{order.CustomerName}贵司委托我司代理订舱出口的货物信息如下,详情请见附件,谢谢!<br/>
|
|
|
|
|
//提单号:{order.MBLNO}<br/>
|
|
|
|
|
//船名航次:{order.Vessel}/{order.Voyno}<br/>
|
|
|
|
|
//目的港:{order.DischargePort}<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/>
|
|
|
|
|
//{linkContent}
|
|
|
|
|
//<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/>
|
|
|
|
|
// 订舱代理联系人:{user.UserName}<br/>
|
|
|
|
|
// 电话:{userInfo.Tel} 手机:{userInfo.Phone}<br/>
|
|
|
|
|
// 邮箱:{userInfo.Email}
|
|
|
|
|
//<br/>";
|
|
|
|
|
|
|
|
|
|
// var sendResult = await MailSendHelper.SendMail(mailAcc, mailSubject, mailContent, letterYard.ToAttnEmail, new KeyValuePair<string, byte[]>($"放舱通知_{order.MBLNO}.pdf", bs));
|
|
|
|
|
// if (!sendResult.Key)
|
|
|
|
|
// {
|
|
|
|
|
// _logger.Error($"放舱邮件发送失败:从{mailAcc.MailAccount}到{letterYard.ToAttnEmail},主题 {mailSubject}");
|
|
|
|
|
// return await Task.FromResult(DataResult.Failed($"邮件发送失败:{sendResult.Value}"));
|
|
|
|
|
// }
|
|
|
|
|
// #endregion
|
|
|
|
|
|
|
|
|
|
// //设置货物状态-放舱
|
|
|
|
|
// await seaComService.SetGoodsStatus("YFC", bookingId, tenantDb);
|
|
|
|
|
// return await Task.FromResult(DataResult.Successed("发送成功"));
|
|
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
public async Task<DataResult<string>> SendLetterYard(SendShippingOrderReq req)
|
|
|
|
|
{
|
|
|
|
|
var tenant = db.Queryable<SysTenant>().FirstAsync(t => t.Id == long.Parse(user.TenantId));
|
|
|
|
|
|
|
|
|
|
var tenantDb = saasService.GetBizDbScopeById(user.TenantId);
|
|
|
|
|
var bookingId = req.BookingId;
|
|
|
|
|
var letterYard = await tenantDb.Queryable<BusinessYard>().FirstAsync(x => x.BusinessId == bookingId);
|
|
|
|
|
if (letterYard.IsNull())
|
|
|
|
|
{
|
|
|
|
|
return await Task.FromResult(DataResult<string>.Failed("放舱信息未找到,请先保存数据"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(letterYard.ToAttnEmail))
|
|
|
|
|
{
|
|
|
|
|
return await Task.FromResult(DataResult<string>.Failed("ATTN MAIL未正确填写"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(letterYard.FromEmail))
|
|
|
|
|
{
|
|
|
|
|
return await Task.FromResult(DataResult<string>.Failed("FROM MAIL未正确填写"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var order = await tenantDb.Queryable<SeaExport>().FirstAsync(x => x.Id == bookingId);
|
|
|
|
|
var userMail = await tenantDb.Queryable<CodeUserEmail>().FirstAsync(x => x.CreateBy == long.Parse(user.UserId));
|
|
|
|
|
if (userMail == null)
|
|
|
|
|
{
|
|
|
|
|
return await Task.FromResult(DataResult<string>.Failed("未配置发件邮箱"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(userMail.SmtpServer) || userMail.SmtpPort == 25)
|
|
|
|
|
{
|
|
|
|
|
return await Task.FromResult(DataResult<string>.Failed("请正确配置发件邮箱,且发件不能使用25端口"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var emailUrl = db.Queryable<SysConfig>().Filter(null, true).Where(x => x.Code == "email_api_url" && x.TenantId == 1288018625843826688).First().Value;
|
|
|
|
|
|
|
|
|
|
if (emailUrl == null)
|
|
|
|
|
{
|
|
|
|
|
return await Task.FromResult(DataResult<string>.Failed("系统参数未配置email_api_url 请联系管理员"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//处理附件
|
|
|
|
|
var attPostArr = new List<dynamic>();
|
|
|
|
|
foreach (var file in req.FileList)
|
|
|
|
|
{
|
|
|
|
|
var basePath = AppSetting.app(new string[] { "FileSettings", "BasePath" });
|
|
|
|
|
var relativePath = AppSetting.app(new string[] { "FileSettings", "RelativePath" });
|
|
|
|
|
var dirAbs = string.Empty;
|
|
|
|
|
var fileRelaPath = string.Empty;
|
|
|
|
|
var fileAbsPath = string.Empty;
|
|
|
|
|
if (string.IsNullOrEmpty(basePath))
|
|
|
|
|
{
|
|
|
|
|
dirAbs = Path.Combine(_environment.WebRootPath, relativePath);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
dirAbs = Path.Combine(basePath, relativePath);
|
|
|
|
|
}
|
|
|
|
|
var fileFullName = Path.Combine(dirAbs, file);
|
|
|
|
|
//fileFullName = fileFullName.Replace(".OpApi", ".MainApi");
|
|
|
|
|
fileFullName = fileFullName.Replace("op-api", "main-api");
|
|
|
|
|
var fileSaveName = $"放舱通知_{order.MBLNO}_{DateTime.Now.Ticks}.pdf"; // 文件原始名称
|
|
|
|
|
_logger.Info($"发送放舱附件路径:{fileFullName}");
|
|
|
|
|
if (!File.Exists(fileFullName))
|
|
|
|
|
{
|
|
|
|
|
return await Task.FromResult(DataResult<string>.Failed("附件不存在,请检查"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
attPostArr.Add(new
|
|
|
|
|
{
|
|
|
|
|
AttachName = Path.GetFileName(file),
|
|
|
|
|
AttachContent = Convert.ToBase64String(File.ReadAllBytes(fileFullName))
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
//挂载附件
|
|
|
|
|
var bookFile = new OpFile
|
|
|
|
|
{
|
|
|
|
|
FileName = fileSaveName,
|
|
|
|
|
FilePath = fileRelaPath,
|
|
|
|
|
TypeCode = "ruhuotongzhi",
|
|
|
|
|
TypeName = ".pdf",
|
|
|
|
|
LinkId = order.Id,
|
|
|
|
|
};
|
|
|
|
|
await tenantDb.Insertable(bookFile).ExecuteCommandAsync();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//货运动态
|
|
|
|
|
var bookingStatusLog = new BookingStatusLog()
|
|
|
|
|
{
|
|
|
|
|
BusinessId = bookingId,
|
|
|
|
|
Status = $"放舱给客户",
|
|
|
|
|
Group = "ship",
|
|
|
|
|
OpTime = DateTime.Now,
|
|
|
|
|
MBLNO = order.MBLNO
|
|
|
|
|
};
|
|
|
|
|
await tenantDb.Insertable(bookingStatusLog).ExecuteCommandAsync();
|
|
|
|
|
|
|
|
|
|
//订舱状态
|
|
|
|
|
await seaComService.SaveBookingStatus(bookingId, "sta_letter_yard", "放舱");
|
|
|
|
|
|
|
|
|
|
var mailJson = new dynamic[]{
|
|
|
|
|
new
|
|
|
|
|
{
|
|
|
|
|
SendTo = req.SendTo,
|
|
|
|
|
Title = req.Title,
|
|
|
|
|
Body = req.Body,
|
|
|
|
|
CCTo= req.CCTo,
|
|
|
|
|
SmtpConfig = "",
|
|
|
|
|
Account=userMail.MailAccount,
|
|
|
|
|
Password=userMail.Password,
|
|
|
|
|
Server=userMail.SmtpServer,
|
|
|
|
|
Port=userMail.SmtpPort,
|
|
|
|
|
UseSSL=userMail.SmtpSSL,
|
|
|
|
|
Attaches=attPostArr
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
var mailStr = mailJson.ToJsonString();
|
|
|
|
|
|
|
|
|
|
_logger.Info($"准备发送托书邮件,订舱ID:{req.BookingId},邮箱:{userMail.MailAccount}");
|
|
|
|
|
|
|
|
|
|
var rtn = RequestHelper.Post(mailStr, emailUrl);
|
|
|
|
|
|
|
|
|
|
_logger.Info($"发送托书邮件返回:{rtn}。订舱ID:{req.BookingId},邮箱:{userMail.MailAccount}");
|
|
|
|
|
var jRtn = JObject.Parse(rtn);
|
|
|
|
|
if (!jRtn.GetBooleanValue("Success"))
|
|
|
|
|
{
|
|
|
|
|
//throw Oops.Bah(jRtn.GetStringValue("Message"));
|
|
|
|
|
return await Task.FromResult(DataResult<string>.Failed(jRtn.GetStringValue("Message")));
|
|
|
|
|
}
|
|
|
|
|
//return await Task.FromResult(DataResult<string>.Success(jRtn.GetStringValue("Message")));
|
|
|
|
|
//设置货物状态-放舱
|
|
|
|
|
await seaComService.SetGoodsStatus("YFC", bookingId, tenantDb);
|
|
|
|
|
return await Task.FromResult(DataResult<string>.Success("发送成功"));
|
|
|
|
|
// var bookingId = long.Parse(id);
|
|
|
|
|
// var order = await tenantDb.Queryable<SeaExport>().FirstAsync(x => x.Id == bookingId);
|
|
|
|
|
// var userInfo = await tenantDb.Queryable<SysUser>().FirstAsync(u => u.Id == order.CreateBy);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// var letterYard = await tenantDb.Queryable<BusinessYard>().FirstAsync(x => x.BusinessId == bookingId);
|
|
|
|
|
// if (letterYard.IsNull())
|
|
|
|
|
// {
|
|
|
|
|
// return await Task.FromResult(DataResult.Failed("放舱信息未找到,请先保存数据"));
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// if (string.IsNullOrEmpty(letterYard.ToAttnEmail))
|
|
|
|
|
// {
|
|
|
|
|
// return await Task.FromResult(DataResult.Failed("ATTN MAIL未正确填写"));
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// if (string.IsNullOrEmpty(letterYard.FromEmail))
|
|
|
|
|
// {
|
|
|
|
|
// return await Task.FromResult(DataResult.Failed("FROM MAIL未正确填写"));
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// var mailAcc = await tenantDb.Queryable<CodeUserEmail>().FirstAsync(x => x.CreateBy == long.Parse(user.UserId) && x.MailAccount == letterYard.FromEmail && x.SmtpPort > 0 && x.SmtpServer != null && x.SmtpServer != "");
|
|
|
|
|
// if (mailAcc == null)
|
|
|
|
|
// {
|
|
|
|
|
// return await Task.FromResult(DataResult.Failed("用户邮箱未设置或smtp未正确配置"));
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// var orderUrl = await tenantDb.Queryable<BookingOrderUrl>().FirstAsync(u => u.BusinessId == bookingId);
|
|
|
|
|
// //if (orderUrl == null)
|
|
|
|
|
// //{
|
|
|
|
|
// // throw Oops.Bah("未生成链接信息,请重新保存数据");
|
|
|
|
|
// //}
|
|
|
|
|
|
|
|
|
|
// #region 保存放舱文件,并挂载到订舱附件
|
|
|
|
|
// var printTemplate = await db.Queryable<SysPrintTemplate>().FirstAsync(t => t.TemplateCode == "release_the_cabin");
|
|
|
|
|
// if (printTemplate.IsNull())
|
|
|
|
|
// {
|
|
|
|
|
// return await Task.FromResult(DataResult.Failed("打印模板代码[release_the_cabin]未设置"));
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// //var bs = await GenPrintFile(bookingId, printTemplate);
|
|
|
|
|
|
|
|
|
|
// var basePath = AppSetting.app(new string[] { "FileSettings", "BasePath" });
|
|
|
|
|
// var relativePath = AppSetting.app(new string[] { "FileSettings", "RelativePath" });
|
|
|
|
|
// var dirAbs = string.Empty;
|
|
|
|
|
// var fileRelaPath = string.Empty;
|
|
|
|
|
// var fileAbsPath = string.Empty;
|
|
|
|
|
// var fileSaveName = $"放舱通知_{order.MBLNO}_{DateTime.Now.Ticks}.pdf"; // 文件原始名称
|
|
|
|
|
// if (string.IsNullOrEmpty(basePath))
|
|
|
|
|
// {
|
|
|
|
|
// dirAbs = Path.Combine(_environment.WebRootPath, relativePath);
|
|
|
|
|
// }
|
|
|
|
|
// else
|
|
|
|
|
// {
|
|
|
|
|
// dirAbs = Path.Combine(basePath, relativePath);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// if (!Directory.Exists(dirAbs))
|
|
|
|
|
// Directory.CreateDirectory(dirAbs);
|
|
|
|
|
|
|
|
|
|
// fileRelaPath = Path.Combine(relativePath, fileSaveName).ToLower();
|
|
|
|
|
// fileAbsPath = Path.Combine(dirAbs, fileSaveName).ToLower();
|
|
|
|
|
|
|
|
|
|
// File.WriteAllBytes(fileAbsPath, bs);
|
|
|
|
|
|
|
|
|
|
// //挂载附件
|
|
|
|
|
// var bookFile = new OpFile
|
|
|
|
|
// {
|
|
|
|
|
// FileName = fileSaveName,
|
|
|
|
|
// FilePath = fileRelaPath,
|
|
|
|
|
// TypeCode = "ruhuotongzhi",
|
|
|
|
|
// TypeName = ".pdf",
|
|
|
|
|
// LinkId = order.Id,
|
|
|
|
|
// };
|
|
|
|
|
// await tenantDb.Insertable(bookFile).ExecuteCommandAsync();
|
|
|
|
|
// #endregion
|
|
|
|
|
|
|
|
|
|
// //货运动态
|
|
|
|
|
// var bookingStatusLog = new BookingStatusLog()
|
|
|
|
|
// {
|
|
|
|
|
// BusinessId = bookingId,
|
|
|
|
|
// Status = $"放舱给客户",
|
|
|
|
|
// Group = "ship",
|
|
|
|
|
// OpTime = DateTime.Now,
|
|
|
|
|
// MBLNO = order.MBLNO
|
|
|
|
|
// };
|
|
|
|
|
// await tenantDb.Insertable(bookingStatusLog).ExecuteCommandAsync();
|
|
|
|
|
|
|
|
|
|
// //订舱状态
|
|
|
|
|
// await seaComService.SaveBookingStatus(bookingId, "sta_letter_yard", "放舱");
|
|
|
|
|
|
|
|
|
|
// #region 发送邮件
|
|
|
|
|
|
|
|
|
|
// var carrCode = seaComService.GetCarrierCode(order.CarrierId, tenantDb);
|
|
|
|
|
// var mailSubject = $"放舱信息:{order.MBLNO}/{carrCode}/{order.Vessel}/{order.Voyno}/PO:{order.CustomerNo}/{userInfo.TenantName}";
|
|
|
|
|
|
|
|
|
|
// var extContent = string.Empty;
|
|
|
|
|
// if (order.CargoId == "R") //冻柜
|
|
|
|
|
// {
|
|
|
|
|
// extContent = $"温度:{order.TemperatureSet}{order.TemperatureUnit} <br/>通风:{order.ReeferQuantity} <br/>湿度:{order.Humidity}<br/>";
|
|
|
|
|
// }
|
|
|
|
|
// else if (order.CargoId == "D") //危险品
|
|
|
|
|
// {
|
|
|
|
|
// extContent = $"危险品等级:{order.DangerClass} <br/>危险品编号:{order.DangerNo}<br/>";
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// var linkContent = string.Empty;
|
|
|
|
|
// if (orderUrl != null)
|
|
|
|
|
// {
|
|
|
|
|
// linkContent = $@"提箱小票链接:<a href='{orderUrl.UrlTxxp}'>{orderUrl.UrlTxxp}</a><br/>
|
|
|
|
|
//提交VGM链接:<a href='{orderUrl.UrlVgm}'>{orderUrl.UrlVgm}</a><br/>";
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// var mailContent = $@"TO:{order.CustomerName}贵司委托我司代理订舱出口的货物信息如下,详情请见附件,谢谢!<br/>
|
|
|
|
|
//提单号:{order.MBLNO}<br/>
|
|
|
|
|
//船名航次:{order.Vessel}/{order.Voyno}<br/>
|
|
|
|
|
//目的港:{order.DischargePort}<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/>
|
|
|
|
|
//{linkContent}
|
|
|
|
|
//<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/>
|
|
|
|
|
// 订舱代理联系人:{user.UserName}<br/>
|
|
|
|
|
// 电话:{userInfo.Tel} 手机:{userInfo.Phone}<br/>
|
|
|
|
|
// 邮箱:{userInfo.Email}
|
|
|
|
|
//<br/>";
|
|
|
|
|
|
|
|
|
|
// var sendResult = await MailSendHelper.SendMail(mailAcc, mailSubject, mailContent, letterYard.ToAttnEmail, new KeyValuePair<string, byte[]>($"放舱通知_{order.MBLNO}.pdf", bs));
|
|
|
|
|
// if (!sendResult.Key)
|
|
|
|
|
// {
|
|
|
|
|
// _logger.Error($"放舱邮件发送失败:从{mailAcc.MailAccount}到{letterYard.ToAttnEmail},主题 {mailSubject}");
|
|
|
|
|
// return await Task.FromResult(DataResult.Failed($"邮件发送失败:{sendResult.Value}"));
|
|
|
|
|
// }
|
|
|
|
|
// #endregion
|
|
|
|
|
|
|
|
|
|
// //设置货物状态-放舱
|
|
|
|
|
// await seaComService.SetGoodsStatus("YFC", bookingId, tenantDb);
|
|
|
|
|
// return await Task.FromResult(DataResult.Successed("发送成功"));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|