From 2c2a1986817f2c778c0e8bea3538a6c3152a8064 Mon Sep 17 00:00:00 2001 From: wanghaomei Date: Wed, 16 Nov 2022 10:09:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=BE=E8=88=B1=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BookingOrder/BookingOrderService.cs | 134 +++++++++++++++--- .../DjyUserMailAccountService.cs | 6 + 2 files changed, 124 insertions(+), 16 deletions(-) diff --git a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs index 27d750f2..bca3dd74 100644 --- a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs +++ b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs @@ -70,6 +70,8 @@ namespace Myshipping.Application private readonly SqlSugarRepository _repUser; private readonly SqlSugarRepository _repOrderUrl; private readonly SqlSugarRepository _repOrderContact; + private readonly SqlSugarRepository _repUserMail; + private readonly SqlSugarRepository _repTenant; const string CONST_MAPPING_MODULE = "BOOK_OR_CLOSING"; @@ -80,7 +82,8 @@ namespace Myshipping.Application SqlSugarRepository dicdata, SqlSugarRepository statuslog, SqlSugarRepository statuslogdetail, ILogger logger, ISysCacheService cache, SqlSugarRepository repPrintTemplate, SqlSugarRepository repLetterYard, SqlSugarRepository repUser, - SqlSugarRepository repOrderUrl, SqlSugarRepository repOrderContact) + SqlSugarRepository repOrderUrl, SqlSugarRepository repOrderContact, SqlSugarRepository repUserMail, + SqlSugarRepository 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(); + 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}
通风:{order.REEFERF}
湿度:{order.HUMIDITY}
"; + } + else if (order.CARGOID == "D") //危险品 + { + extContent = $"危险品等级:{order.DCLASS}
危险品编号:{order.DUNNO}
"; + } + + var mailContent = $@"TO:{order.CUSTOMERNAME} 贵司委托我司代理订舱出口的货物信息如下,详情请见附件,谢谢!
+提单号:{order.MBLNO}
+船名航次:{order.VESSEL}/{order.VOYNO}
+目的港:{order.PORTDISCHARGE}
+预计船期:{(order.ETD.HasValue ? order.ETD.Value.Date.ToString("yyyy-MM-dd") : "")}
+场站:{order.YARD}
+船代:{order.SHIPAGENCY}
+预计截港时间:{order.CLOSINGDATE}
+预计截单时间:{order.CLOSEDOCDATE}
+截VGM时间:{order.CLOSEVGMDATE}
+{extContent} +备注:{order.YARDREMARK}
+ 提箱小票链接:{orderUrl.UrlTxxp}
+ 提交VGM链接:{orderUrl.UrlVgm}
+
+ 温馨提示:
+ 如果分票报关,请回箱前通知场站及我司。
+ 开船及截港时间以码头具体计划为准。
+ 若贵司自输VGM,请不要通过VGM链接提交数据,否则我司收取相关VGM申报费用。
+
+ 订舱代理联系人:{UserManager.Name}
+ 电话:{user.Tel} 手机:{user.Phone}
+ 邮箱:{user.Email} +
"; + #endregion } /// @@ -754,7 +852,10 @@ namespace Myshipping.Application [HttpGet("/BookingOrder/letteryardpdf")] public async Task 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; } /// @@ -765,7 +866,10 @@ namespace Myshipping.Application [HttpGet("/BookingOrder/letteryardxlsx")] public async Task 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; } /// @@ -775,7 +879,7 @@ namespace Myshipping.Application /// 类型,1:pdf、2:xlsx /// [NonAction] - private async Task LetterYardFile(long bookingId, int type = 1) + private async Task 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(); @@ -1498,7 +1600,7 @@ namespace Myshipping.Application } #endregion - private async Task InnerSendBookingOrClosingEDI(BookingOrClosingEDIOrderDto model,EDIBaseModel ediModel,EDIRouteEnum ediRouteEnum) + private async Task 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 /// private void CheckBookingOrClosingEDI(BookingOrder order) { - if(string.IsNullOrWhiteSpace(order.CARRIERID)) + if (string.IsNullOrWhiteSpace(order.CARRIERID)) throw Oops.Oh("船公司必须填写"); if (string.IsNullOrWhiteSpace(order.OPID)) diff --git a/Myshipping.Core/Service/DjyUserMailAccount/DjyUserMailAccountService.cs b/Myshipping.Core/Service/DjyUserMailAccount/DjyUserMailAccountService.cs index 725b3535..f02b57c3 100644 --- a/Myshipping.Core/Service/DjyUserMailAccount/DjyUserMailAccountService.cs +++ b/Myshipping.Core/Service/DjyUserMailAccount/DjyUserMailAccountService.cs @@ -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(); await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); }