放舱发送

booking_auth_dev
wanghaomei 2 years ago
parent 1fea7bb844
commit 2c2a198681

@ -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;'>VGMVGMVGM</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">类型1pdf、2xlsx</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))

@ -67,6 +67,12 @@ namespace Myshipping.Core.Service
[HttpPost("/DjyUserMailAccount/edit")]
public async Task Update(UpdateDjyUserMailAccountInput input)
{
var cc = _rep.AsQueryable().Filter(null, true).Count(x => x.MailAccount == input.MailAccount && x.Id != input.Id);
if (cc > 0)
{
throw Oops.Oh(ErrorCode.EMAIL001);
}
var entity = input.Adapt<DjyUserMailAccount>();
await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
}

Loading…
Cancel
Save