From 2c2a1986817f2c778c0e8bea3538a6c3152a8064 Mon Sep 17 00:00:00 2001 From: wanghaomei Date: Wed, 16 Nov 2022 10:09:39 +0800 Subject: [PATCH 1/3] =?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(); } From 0077ccd74b7165fcf2c36bd90114774afc0f7c6e Mon Sep 17 00:00:00 2001 From: wet <1034391973@qq.com> Date: Wed, 16 Nov 2022 11:24:17 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=AE=9E=E4=BD=93=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Myshipping.Core/Entity/CommonDB/CodeVessel.cs | 20 +--------- Myshipping.Core/Myshipping.Core.xml | 40 ------------------- .../Service/CommonDB/CommonDBService.cs | 10 ++--- .../Service/CommonDB/Dto/CodeVesselDto.cs | 21 +--------- 4 files changed, 7 insertions(+), 84 deletions(-) diff --git a/Myshipping.Core/Entity/CommonDB/CodeVessel.cs b/Myshipping.Core/Entity/CommonDB/CodeVessel.cs index 7dc68268..ac0baa27 100644 --- a/Myshipping.Core/Entity/CommonDB/CodeVessel.cs +++ b/Myshipping.Core/Entity/CommonDB/CodeVessel.cs @@ -32,25 +32,7 @@ namespace Myshipping.Core.Entity /// public string Remark { get; set; } - /// - /// 创建时间 - /// - public DateTime CreateTime { get; set; } - - /// - /// 修改时间 - /// - public DateTime? ModifyTime { get; set; } - - /// - /// 创建人 - /// - public string CreateUser { get; set; } - - /// - /// 修改人 - /// - public string ModifyUser { get; set; } + } diff --git a/Myshipping.Core/Myshipping.Core.xml b/Myshipping.Core/Myshipping.Core.xml index f21d276f..32e3153f 100644 --- a/Myshipping.Core/Myshipping.Core.xml +++ b/Myshipping.Core/Myshipping.Core.xml @@ -1322,26 +1322,6 @@ 备注 - - - 创建时间 - - - - - 修改时间 - - - - - 创建人 - - - - - 修改人 - - 名称 @@ -7248,26 +7228,6 @@ 备注 - - - 创建时间 - - - - - 修改时间 - - - - - 创建人 - - - - - 修改人 - - 代码 diff --git a/Myshipping.Core/Service/CommonDB/CommonDBService.cs b/Myshipping.Core/Service/CommonDB/CommonDBService.cs index da28b91c..8537ce76 100644 --- a/Myshipping.Core/Service/CommonDB/CommonDBService.cs +++ b/Myshipping.Core/Service/CommonDB/CommonDBService.cs @@ -110,7 +110,7 @@ public class CommonDBService : ICommonDBService, IDynamicApiController, ITransie entity.CreateUser = UserManager.DjyUserId; await _codeCarrierRep.InsertAsync(entity); await GetAllCarrier(); - + } /// @@ -140,7 +140,7 @@ public class CommonDBService : ICommonDBService, IDynamicApiController, ITransie { entity.GID = Guid.NewGuid().ToString(); entity.CreateTime = DateTime.Now; - entity.CreateUser =UserManager.DjyUserId; + entity.CreateUser = UserManager.DjyUserId; await _mappingCarrierRep.InsertAsync(entity); } else @@ -681,7 +681,7 @@ public class CommonDBService : ICommonDBService, IDynamicApiController, ITransie .WhereIF(!string.IsNullOrEmpty(input.MapCode), x => x.MapCode.Contains(input.MapCode, System.StringComparison.CurrentCultureIgnoreCase)) .WhereIF(!string.IsNullOrEmpty(input.Module), x => x.Module == input.Module) .WhereIF(!string.IsNullOrEmpty(input.MapName), x => x.MapName.Contains(input.MapName, System.StringComparison.CurrentCultureIgnoreCase)); - + return queryList.ToList(); } @@ -906,11 +906,11 @@ public class CommonDBService : ICommonDBService, IDynamicApiController, ITransie [NonAction] public async Task> GetAllFrt() { - + var list = await _codeFrtRep.ToListAsync(); await _sysCacheService.SetAllCodeFrt(list); return list; - + } [NonAction] public async Task> GetAllMappingFrt() diff --git a/Myshipping.Core/Service/CommonDB/Dto/CodeVesselDto.cs b/Myshipping.Core/Service/CommonDB/Dto/CodeVesselDto.cs index 2ac3160e..9de1d7ae 100644 --- a/Myshipping.Core/Service/CommonDB/Dto/CodeVesselDto.cs +++ b/Myshipping.Core/Service/CommonDB/Dto/CodeVesselDto.cs @@ -27,26 +27,7 @@ namespace Myshipping.Core.Service.CommonDB.Dto /// 备注 /// public string Remark { get; set; } - - /// - /// 创建时间 - /// - public DateTime CreateTime { get; set; } - - /// - /// 修改时间 - /// - public DateTime? ModifyTime { get; set; } - - /// - /// 创建人 - /// - public string CreateUser { get; set; } - - /// - /// 修改人 - /// - public string ModifyUser { get; set; } + } From d8c4d2e6cdf98c8e17f0b0081fa6e3ad2cc111ae Mon Sep 17 00:00:00 2001 From: wanghaomei Date: Wed, 16 Nov 2022 11:51:42 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=B8=8B=E8=B4=A7=E7=BA=B8=E5=BC=82?= =?UTF-8?q?=E6=AD=A5=20=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 --- .../EDI/XiahuozhiHelpler.cs | 141 ++++++++---------- .../BookingOrder/BookingOrderService.cs | 32 ++-- Myshipping.Core/Helper/MailSendHelper.cs | 14 +- 3 files changed, 89 insertions(+), 98 deletions(-) diff --git a/Myshipping.Application/EDI/XiahuozhiHelpler.cs b/Myshipping.Application/EDI/XiahuozhiHelpler.cs index fa6adf55..33ce244c 100644 --- a/Myshipping.Application/EDI/XiahuozhiHelpler.cs +++ b/Myshipping.Application/EDI/XiahuozhiHelpler.cs @@ -26,8 +26,8 @@ namespace Myshipping.Application.EDI { private static readonly string EdiFilePath = "XHZ"; - public static bool Send( - long bookingId, string filerole, out string msg) + public static async Task> Send( + long bookingId, string filerole) { var repUser = App.GetService>(); var repOrder = App.GetService>(); @@ -40,33 +40,28 @@ namespace Myshipping.Application.EDI var order = repOrder.FirstOrDefault(o => o.Id == bookingId); if (order == null) { - msg = "订舱信息未找到"; - return false; + return new KeyValuePair(false, "订舱信息未找到"); } var yardArr = new string[] { "GLJ", "GJF", "JIEFENG", "GangLianXin", "ZHONGCHUANG" }; if (!yardArr.Contains(order.YARDID)) { - msg = "不支持的场站"; - return false; + return new KeyValuePair(false, "不支持的场站"); } if (string.IsNullOrEmpty(order.MBLNO)) { - msg = "主提单号不能为空"; - return false; + return new KeyValuePair(false, "主提单号不能为空"); } if (string.IsNullOrEmpty(order.VESSEL)) { - msg = "船名不能为空"; - return false; + return new KeyValuePair(false, "船名不能为空"); } if (string.IsNullOrEmpty(order.VOYNO)) { - msg = "海关航次不能为空"; - return false; + return new KeyValuePair(false, "海关航次不能为空"); } var fileOpt = App.GetOptions(); @@ -79,11 +74,10 @@ namespace Myshipping.Application.EDI if (order.YARDID == "GLJ") { //租户参数-港联捷下货纸代号 - var paraXHZ = cacheService.GetAllTenantParam().Result.FirstOrDefault(p => p.TenantId == order.TenantId && p.ParaCode == "CODE_GLJ_XHZ"); + var paraXHZ = (await cacheService.GetAllTenantParam()).FirstOrDefault(p => p.TenantId == order.TenantId && p.ParaCode == "CODE_GLJ_XHZ"); if (paraXHZ == null || string.IsNullOrEmpty(paraXHZ.ItemCode)) { - msg = $"{order.TenantName} 港联捷场站 下货纸代号未找到或配置有误"; - return false; + return new KeyValuePair(false, $"{order.TenantName} 港联捷场站 下货纸代号未找到或配置有误"); } var ediFileName = $"{paraXHZ.ItemCode}_{order.MBLNO}_{DateTime.Now.Ticks}.txt"; @@ -94,16 +88,16 @@ namespace Myshipping.Application.EDI { Directory.CreateDirectory(ediPathAbs); } - var ediSettints = cacheService.GetAllEdiSetting().Result; + var ediSettints = await cacheService.GetAllEdiSetting(); + var dicData = await cacheService.GetAllDictData(); //港联捷所有用户使用一个ftp用户名和密码发送报文,使用文件名中的下货纸代号进行区分 - var paraServer = cacheService.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "booking_ftp_setting_glj" && x.Code == "ftp_server"); - var paraUser = cacheService.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "booking_ftp_setting_glj" && x.Code == "username"); - var paraPwd = cacheService.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "booking_ftp_setting_glj" && x.Code == "pwd"); + var paraServer = dicData.FirstOrDefault(x => x.TypeCode == "booking_ftp_setting_glj" && x.Code == "ftp_server"); + var paraUser = dicData.FirstOrDefault(x => x.TypeCode == "booking_ftp_setting_glj" && x.Code == "username"); + var paraPwd = dicData.FirstOrDefault(x => x.TypeCode == "booking_ftp_setting_glj" && x.Code == "pwd"); if (paraServer == null || paraUser == null || paraPwd == null) { - msg = "港联捷下货纸FTP服务地址参数未配置"; - return false; + return new KeyValuePair(false, $"港联捷下货纸FTP服务地址参数未配置"); } StringBuilder sbData = new StringBuilder(); @@ -123,8 +117,8 @@ namespace Myshipping.Application.EDI sbData.AppendLine($"22:{despStr}:{order.PKGS}:{order.KINDPKGS}:{order.KGS}:{order.CBM}:{(order.CARGOID == "D" ? "Y" : "N")}:{order.DCLASS}:{order.DUNNO}::{order.TEMPSET}:{order.REEFERF}:{order.HUMIDITY}");//货名 件数 包装代码 总重量 总体积 危品标志 危品等级 危规号 副危品等级 副危规号 温度 通风度 湿度 - var ctnCodes = GetAllCodeCtn().Result.Select(x => new { x.Code, x.Size }).ToList(); - var ctnEdiList = GetAllMappingCtn().Result.AsQueryable().Where(x => x.Module == "XHZ_GLJ").ToList(); + var ctnCodes = (await GetAllCodeCtn()).Select(x => new { x.Code, x.Size }).ToList(); + var ctnEdiList = (await GetAllMappingCtn()).AsQueryable().Where(x => x.Module == "XHZ_GLJ").ToList(); var ctns = repCtn.Where(c => c.BILLID == bookingId).ToList(); foreach (var ctn in ctns) @@ -132,15 +126,13 @@ namespace Myshipping.Application.EDI var ctnFind = ctnCodes.FirstOrDefault(c => c.Code == ctn.CTNCODE); if (ctnFind == null) { - msg = $"未找到箱型 {ctn.CTNALL},请联系管理员"; - return false; + return new KeyValuePair(false, $"未找到箱型 {ctn.CTNALL},请联系管理员"); } var ctnEdi = ctnEdiList.FirstOrDefault(cc => cc.Code == ctn.CTNCODE); if (ctnEdi == null) { - msg = $"箱型({ctn.CTNALL})不匹配(EDI类型:XHZ_GLJ),无法发送下货纸,请联系管理员"; - return false; + return new KeyValuePair(false, $"箱型({ctn.CTNALL})不匹配(EDI类型:XHZ_GLJ),无法发送下货纸,请联系管理员"); } sbData.AppendLine($"13:{(order.ISCONTAINERSOC.HasValue && order.ISCONTAINERSOC.Value ? "SOC" : order.CARRIERID)}:{ctnFind.Size}:{ctnEdi.MapCode}:{ctn.CTNNUM}:{ExchangeStr(ctn.REMARK)}:N");//箱经营人代码 尺寸 箱型 箱数 备注 加重箱 @@ -167,23 +159,21 @@ namespace Myshipping.Application.EDI pwd = paraPwd.Value, path = "/" }; - var ftpSpiderUrl = cacheService.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "url_set" && x.Code == "booking_edi_ftp_server").Value; + var ftpSpiderUrl = dicData.FirstOrDefault(x => x.TypeCode == "url_set" && x.Code == "booking_edi_ftp_server").Value; Log.Information($"准备请求发送ftp:{ftpSpiderUrl} ,参数:{ftpPostObj.ToJsonString()},文件:{ediFileName}"); - var res = ftpSpiderUrl + var res = await ftpSpiderUrl .SetContentType("multipart/form-data") .SetBody(ftpPostObj) .SetBodyBytes(("file", Encoding.UTF8.GetBytes(sbData.ToString()), ediFileName)) .PostAsStringAsync(); Log.Information($"发送ftp返回:{res}"); - var jobjRetn = JObject.Parse(res.Result); + var jobjRetn = JObject.Parse(res); if (jobjRetn.GetStringValue("status") != "1") { - msg = $"ftp发送失败:{jobjRetn.GetStringValue("message")}"; - return false; + return new KeyValuePair(false, $"ftp发送失败:{jobjRetn.GetStringValue("message")}"); } - msg = "已发送"; - return true; + return new KeyValuePair(true, $"已发送"); } #endregion @@ -192,26 +182,22 @@ namespace Myshipping.Application.EDI { if (!order.PKGS.HasValue || order.PKGS.Value == 0) { - msg = "件数不能为空"; - return false; + return new KeyValuePair(false, $"件数不能为空"); } if (string.IsNullOrEmpty(order.KINDPKGS)) { - msg = "件数包装不能为空"; - return false; + return new KeyValuePair(false, $"件数包装不能为空"); } if (!order.KGS.HasValue || order.KGS.Value == 0) { - msg = "重量不能为空"; - return false; + return new KeyValuePair(false, $"重量不能为空"); } if (!order.CBM.HasValue || order.CBM.Value == 0) { - msg = "尺码不能为空"; - return false; + return new KeyValuePair(false, $"尺码不能为空"); } var ediFileName = $"{order.VESSEL}_{order.VOYNO}_{order.MBLNO}_{DateTime.Now.Ticks}.txt"; @@ -226,17 +212,16 @@ namespace Myshipping.Application.EDI DjyEdiSetting ftpset = null; if (order.YARDID == "GJF") { - ftpset = cacheService.GetAllEdiSetting().Result.FirstOrDefault(f => f.EDINAME == "XHZ_GJF" && f.TenantId == order.TenantId); + ftpset = (await cacheService.GetAllEdiSetting()).FirstOrDefault(f => f.EDINAME == "XHZ_GJF" && f.TenantId == order.TenantId); } else if (order.YARDID == "JIEFENG") { - ftpset = cacheService.GetAllEdiSetting().Result.FirstOrDefault(f => f.EDINAME == "XHZ_JIEFENG" && f.TenantId == order.TenantId); + ftpset = (await cacheService.GetAllEdiSetting()).FirstOrDefault(f => f.EDINAME == "XHZ_JIEFENG" && f.TenantId == order.TenantId); } if (ftpset == null) { - msg = "ftp设置未找到"; - return false; + return new KeyValuePair(false, $"ftp设置未找到"); } var ediParaName = "XHZ_GJF"; @@ -424,7 +409,7 @@ namespace Myshipping.Application.EDI attFile.TypeCode = "xiahuozhi"; attFile.TypeName = "下货纸"; attFile.TenantName = order.TenantName; - repBookingFile.Insert(attFile); + await repBookingFile.InsertAsync(attFile); //后续发送 var ftpPostObj = new @@ -434,24 +419,22 @@ namespace Myshipping.Application.EDI pwd = ftpset.PASSWORD, path = ftpset.FOLDERNAME }; - var ftpSpiderUrl = cacheService.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "url_set" && x.Code == "booking_edi_ftp_server").Value; + var ftpSpiderUrl = (await cacheService.GetAllDictData()).FirstOrDefault(x => x.TypeCode == "url_set" && x.Code == "booking_edi_ftp_server").Value; Log.Information($"准备请求发送ftp:{ftpSpiderUrl} ,参数:{ftpPostObj.ToJsonString()},文件:{ediFileName}"); - var res = ftpSpiderUrl + var res = await ftpSpiderUrl .SetContentType("multipart/form-data") .SetBody(ftpPostObj) .SetBodyBytes(("file", Encoding.UTF8.GetBytes(strJoin), ediFileName)) .PostAsStringAsync(); Log.Information($"发送ftp返回:{res}"); - var jobjRetn = JObject.Parse(res.Result); + var jobjRetn = JObject.Parse(res); if (jobjRetn.GetStringValue("status") != "1") { - msg = $"ftp发送失败:{jobjRetn.GetStringValue("message")}"; - return false; + return new KeyValuePair(false, $"ftp发送失败:{jobjRetn.GetStringValue("message")}"); } - msg = "完成"; - return true; + return new KeyValuePair(true, $"完成"); } #endregion @@ -459,21 +442,20 @@ namespace Myshipping.Application.EDI else if (order.YARDID == "GangLianXin" || order.YARDID == "ZHONGCHUANG") { //2022年6月15日增加:港联欣场站若配置了通过港联捷EDI发送,则使用港联捷报文格式 - var pGlxEdi = cacheService.GetAllTenantParam().Result.FirstOrDefault(p => p.TenantId == order.TenantId && p.ParaCode == "XIAHUOZHI_GLX_SEND_TYPE"); + var tenantParam = await cacheService.GetAllTenantParam(); + var pGlxEdi = tenantParam.FirstOrDefault(p => p.TenantId == order.TenantId && p.ParaCode == "XIAHUOZHI_GLX_SEND_TYPE"); if (order.YARDID == "GangLianXin" && pGlxEdi != null && pGlxEdi.ItemCode == "EDI_GLX") { - var ftpset = cacheService.GetAllEdiSetting().Result.FirstOrDefault(f => f.EDINAME == "XHZ_GLX" && f.TenantId == order.TenantId); + var ftpset = (await cacheService.GetAllEdiSetting()).FirstOrDefault(f => f.EDINAME == "XHZ_GLX" && f.TenantId == order.TenantId); if (ftpset == null) { - msg = "港联欣下货纸ftp设置未找到"; - return false; + return new KeyValuePair(false, $"港联欣下货纸ftp设置未找到"); } - var paraXHZ = cacheService.GetAllTenantParam().Result.FirstOrDefault(p => p.TenantId == order.TenantId && p.ParaCode == "CODE_GLX_XHZ"); + var paraXHZ = tenantParam.FirstOrDefault(p => p.TenantId == order.TenantId && p.ParaCode == "CODE_GLX_XHZ"); if (paraXHZ == null || string.IsNullOrEmpty(paraXHZ.ItemCode)) { - msg = "下货纸代号未找到或配置有误"; - return false; + return new KeyValuePair(false, $"下货纸代号未找到或配置有误"); } var ediFileName = $"{paraXHZ.ItemCode}_{order.MBLNO}_{DateTime.Now.Ticks}.txt"; @@ -496,8 +478,8 @@ namespace Myshipping.Application.EDI sbData.AppendLine($"22:{despStr}:{order.PKGS}:{order.KINDPKGS}:{order.KGS}:{order.CBM}:{(order.CARGOID == "D" ? "Y" : "N")}:{order.DCLASS}:{order.DUNNO}::::{order.TEMPSET}:{order.REEFERF}:{order.HUMIDITY}:");//货名 件数 包装代码 总重量 总体积 危品标志 危品等级 危规号 副危品等级 副危规号 温度 通风度 湿度 - var ctnCodes = GetAllCodeCtn().Result.Select(x => new { x.Code, x.Size }).ToList(); - var ctnEdiList = GetAllMappingCtn().Result.AsQueryable().Where(x => x.Module == "XHZ_GLX").ToList(); + var ctnCodes = (await GetAllCodeCtn()).Select(x => new { x.Code, x.Size }).ToList(); + var ctnEdiList = (await GetAllMappingCtn()).AsQueryable().Where(x => x.Module == "XHZ_GLX").ToList(); var ctns = repCtn.Where(c => c.BILLID == bookingId).ToList(); foreach (var ctn in ctns) @@ -505,15 +487,13 @@ namespace Myshipping.Application.EDI var ctnFind = ctnCodes.FirstOrDefault(c => c.Code == ctn.CTNCODE); if (ctnFind == null) { - msg = $"未找到箱型 {ctn.CTNALL},请联系管理员"; - return false; + return new KeyValuePair(false, $"未找到箱型 {ctn.CTNALL},请联系管理员"); } var ctnEdi = ctnEdiList.FirstOrDefault(cc => cc.Code == ctn.CTNCODE); if (ctnEdi == null) { - msg = $"箱型({ctn.CTNALL})不匹配(EDI类型:XHZ_GLX),无法发送下货纸,请联系管理员"; - return false; + return new KeyValuePair(false, $"箱型({ctn.CTNALL})不匹配(EDI类型:XHZ_GLX),无法发送下货纸,请联系管理员"); } sbData.AppendLine($"13:{(order.ISCONTAINERSOC.HasValue && order.ISCONTAINERSOC.Value ? "SOC" : order.CARRIERID)}:{ctnFind.Size}:{ctnEdi.MapCode}:{ctn.CTNNUM}:{ExchangeStr(ctn.REMARK)}:N");//箱经营人代码 尺寸 箱型 箱数 备注 加重箱 @@ -540,27 +520,25 @@ namespace Myshipping.Application.EDI pwd = ftpset.PASSWORD, path = ftpset.FOLDERNAME }; - var ftpSpiderUrl = cacheService.GetAllDictData().Result.FirstOrDefault(x => x.TypeCode == "url_set" && x.Code == "booking_edi_ftp_server").Value; + var ftpSpiderUrl = (await cacheService.GetAllDictData()).FirstOrDefault(x => x.TypeCode == "url_set" && x.Code == "booking_edi_ftp_server").Value; Log.Information($"准备请求发送ftp:{ftpSpiderUrl} ,参数:{ftpPostObj.ToJsonString()},文件:{ediFileName}"); - var res = ftpSpiderUrl + var res = await ftpSpiderUrl .SetContentType("multipart/form-data") .SetBody(ftpPostObj) .SetBodyBytes(("file", Encoding.UTF8.GetBytes(sbData.ToString()), ediFileName)) .PostAsStringAsync(); Log.Information($"发送ftp返回:{res}"); - var jobjRetn = JObject.Parse(res.Result); + var jobjRetn = JObject.Parse(res); if (jobjRetn.GetStringValue("status") != "1") { - msg = $"ftp发送失败:{jobjRetn.GetStringValue("message")}"; - return false; + return new KeyValuePair(false, $"ftp发送失败:{jobjRetn.GetStringValue("message")}"); } } else //邮件方式 { if (string.IsNullOrEmpty(order.YARDCONTRACTEMAIL)) { - msg = "场站联系人邮箱不能为空"; - return false; + return new KeyValuePair(false, $"场站联系人邮箱不能为空"); } var userMail = repUserMail.FirstOrDefault(x => x.CreatedUserId == order.CreatedUserId); @@ -568,8 +546,7 @@ namespace Myshipping.Application.EDI || string.IsNullOrEmpty(userMail.SmtpServer) || userMail.SmtpPort == 0) { - msg = "发件邮箱未配置"; - return false; + return new KeyValuePair(false, $"发件邮箱未配置"); } @@ -608,17 +585,19 @@ namespace Myshipping.Application.EDI 邮箱:{userbase.Email}
"; - MailSendHelper.SendMail(userMail, title, body, order.YARDCONTRACTEMAIL); + var sendResult = await MailSendHelper.SendMail(userMail, title, body, order.YARDCONTRACTEMAIL); + if (!sendResult.Key) + { + return new KeyValuePair(false, sendResult.Value); + } } - msg = "已发送"; - return true; + return new KeyValuePair(true, "已发送"); } #endregion else { - msg = "不支持的场站"; - return false; + return new KeyValuePair(false, "不支持的场站"); } } diff --git a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs index bca3dd74..7aee1138 100644 --- a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs +++ b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs @@ -741,13 +741,16 @@ namespace Myshipping.Application public async Task SendLetterYard(long bookingId) { var order = _rep.FirstOrDefault(x => x.Id == bookingId); + var user = await _repUser.FirstOrDefaultAsync(u => u.Id == order.CreatedUserId); + var tenant = await _repTenant.FirstOrDefaultAsync(t => t.Id == order.TenantId); + var letterYard = await _repLetterYard.FirstOrDefaultAsync(x => x.BookingId == bookingId); if (letterYard == null) { throw Oops.Oh("放舱信息未找到,请先保存数据"); } - var mailAcc = await _repUserMail.FirstOrDefaultAsync(x => x.CreatedUserId == UserManager.UserId && x.SmtpPort > 0 && x.SmtpServer != null && x.SmtpServer != ""); + var mailAcc = await _repUserMail.FirstOrDefaultAsync(x => x.CreatedUserId == user.Id && x.SmtpPort > 0 && x.SmtpServer != null && x.SmtpServer != ""); if (mailAcc == null) { throw Oops.Oh("用户邮箱未设置或smtp未正确配置"); @@ -759,6 +762,11 @@ namespace Myshipping.Application throw Oops.Oh("未生成链接信息,请重新保存数据"); } + if (string.IsNullOrEmpty(letterYard.AttnMail)) + { + throw Oops.Oh("ATTN MAIL未正确填写"); + } + #region 保存放舱文件,并挂载到订舱附件 var fileBytes = await LetterYardFile(bookingId); var opt = App.GetOptions(); @@ -802,8 +810,6 @@ namespace Myshipping.Application 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}"; @@ -841,6 +847,12 @@ namespace Myshipping.Application 电话:{user.Tel} 手机:{user.Phone}
邮箱:{user.Email}
"; + + var sendResult = await MailSendHelper.SendMail(mailAcc, mailSubject, mailContent, letterYard.AttnMail); + if (!sendResult.Key) + { + throw Oops.Oh($"邮件发送失败:{sendResult.Value}"); + } #endregion } @@ -957,15 +969,11 @@ namespace Myshipping.Application [HttpPost("/BookingOrder/sendxhz")] public async Task SendXHZ(long bookingId) { - await Task.Run(() => - { - var succ = XiahuozhiHelpler.Send(bookingId, "9", out string msg); - if (!succ) - { - throw Oops.Oh($"发送失败:{msg}"); - } - }); - + var rtn = await XiahuozhiHelpler.Send(bookingId, "9"); + if (!rtn.Key) + { + throw Oops.Oh($"发送失败:{rtn.Value}"); + } } #endregion diff --git a/Myshipping.Core/Helper/MailSendHelper.cs b/Myshipping.Core/Helper/MailSendHelper.cs index 8aacc0f7..39bdf28f 100644 --- a/Myshipping.Core/Helper/MailSendHelper.cs +++ b/Myshipping.Core/Helper/MailSendHelper.cs @@ -21,7 +21,7 @@ namespace Myshipping.Core.Helper /// /// /// - public static void SendMail(DjyUserMailAccount acc, string subject, string body, string sendTo) + public static async Task> SendMail(DjyUserMailAccount acc, string subject, string body, string sendTo) { SmtpClient client = null; try @@ -72,20 +72,24 @@ namespace Myshipping.Core.Helper using (client = new SmtpClient()) { Log.Information($"准备发送邮件{subject} 从【{acc.MailAccount}】到【{sendTo}】,{acc.SmtpServer} {acc.SmtpPort} {acc.SmtpSSL}"); - client.Connect(acc.SmtpServer, acc.SmtpPort.Value, acc.SmtpSSL.HasValue && acc.SmtpSSL.Value ? SecureSocketOptions.SslOnConnect : SecureSocketOptions.None); - client.Authenticate(acc.MailAccount, acc.Password); - client.Send(message); + await client.ConnectAsync(acc.SmtpServer, acc.SmtpPort.Value, acc.SmtpSSL.HasValue && acc.SmtpSSL.Value ? SecureSocketOptions.SslOnConnect : SecureSocketOptions.None); + await client.AuthenticateAsync(acc.MailAccount, acc.Password); + await client.SendAsync(message); - client.Disconnect(true); + await client.DisconnectAsync(true); } Log.Information($"mail send success:{subject}"); + + return new KeyValuePair(true, "发送成功"); } catch (Exception ex) { Log.Error($"mail send fail:{subject} 从【{acc.MailAccount}】到【{sendTo}】,{acc.SmtpServer} {acc.SmtpPort} {acc.SmtpSSL}"); Log.Error(ex.Message); Log.Error(ex.StackTrace); + + return new KeyValuePair(false, ex.Message); } } }