diff --git a/ds-wms-service/DS.Module.SqlSugar/SaasDbService.cs b/ds-wms-service/DS.Module.SqlSugar/SaasDbService.cs index 4556396e..d8dd61b5 100644 --- a/ds-wms-service/DS.Module.SqlSugar/SaasDbService.cs +++ b/ds-wms-service/DS.Module.SqlSugar/SaasDbService.cs @@ -39,7 +39,7 @@ public class SaasDbService : ISaasDbService /// public ISqlSugarClient GetBizDb() { - var tenantId = user.GetTenantId().ToString(); + var tenantId = user.TenantId; if (!db.IsAnyConnection(tenantId)) { diff --git a/ds-wms-service/DS.Module.SqlSugar/SqlsugarHelper.cs b/ds-wms-service/DS.Module.SqlSugar/SqlsugarHelper.cs index 49724342..c3a1be1e 100644 --- a/ds-wms-service/DS.Module.SqlSugar/SqlsugarHelper.cs +++ b/ds-wms-service/DS.Module.SqlSugar/SqlsugarHelper.cs @@ -43,7 +43,7 @@ namespace DS.Module.SqlSugar { var tenantId = ((dynamic)entityInfo.EntityValue).TenantId; if (tenantId == null || tenantId == 0) - entityInfo.SetValue(user.GetTenantId()); + entityInfo.SetValue(user.TenantId); } if (entityInfo.PropertyName == "TenantName") { diff --git a/ds-wms-service/DS.Module.SqlSugar/SqlsugarInstall.cs b/ds-wms-service/DS.Module.SqlSugar/SqlsugarInstall.cs index 07794e21..60e18c1b 100644 --- a/ds-wms-service/DS.Module.SqlSugar/SqlsugarInstall.cs +++ b/ds-wms-service/DS.Module.SqlSugar/SqlsugarInstall.cs @@ -56,7 +56,7 @@ public static class SqlsugarInstall { dbList.Add(item); } - var _serviceProvider =services.GetService(); + var _serviceProvider = services.GetService(); ICacheService myCache = new SqlSugarCsRedisCache(_serviceProvider); var connectConfigList = SqlsugarHelper.ReturnConnectionConfig(dbList, myCache); @@ -97,7 +97,7 @@ public static class SqlsugarInstall OrgId = 1288018625843826688 }; } - + //全局上下文生效 SqlSugarScope sqlSugar = new SqlSugarScope(connectConfigList, db => @@ -108,7 +108,7 @@ public static class SqlsugarInstall foreach (var c in connectConfigList) { var dbProvider = db.GetConnectionScope((string)c.ConfigId); - + // var user = services.GetService(); //单例参数配置,所有上下文生效 @@ -178,7 +178,7 @@ public static class SqlsugarInstall { var tenantId = ((dynamic)entityInfo.EntityValue).TenantId; if (tenantId == null || tenantId == 0) - entityInfo.SetValue(user.GetTenantId()); + entityInfo.SetValue(user.TenantId); } if (entityInfo.PropertyName == "TenantName") { @@ -215,7 +215,7 @@ public static class SqlsugarInstall } } if (entityInfo.PropertyName == "Deleted") - entityInfo.SetValue(false); + entityInfo.SetValue(false); } // 更新操作 @@ -234,7 +234,7 @@ public static class SqlsugarInstall entityInfo.SetValue(user.UserId); if (entityInfo.PropertyName == "DeleteUserName" && user != null) entityInfo.SetValue(user.UserName); - } + } }; dbProvider.Aop.OnDiffLogEvent = it => @@ -253,13 +253,13 @@ public static class SqlsugarInstall var time = it.Time; var diffType = it.DiffType; //enum insert 、update and delete - var diffData = SqlSugarDiffUtil.GetDiff(editBeforeData,editAfterData); - + var diffData = SqlSugarDiffUtil.GetDiff(editBeforeData, editAfterData); + var auditData = new SysLogAudit() { - KeyId =Convert.ToInt64(diffData.Id), + KeyId = Convert.ToInt64(diffData.Id), Sql = it.Sql, - Param = JsonConvert.SerializeObject(it.Parameters), + Param = JsonConvert.SerializeObject(it.Parameters), OperateType = diffType.ToString(), OldValue = JsonConvert.SerializeObject(editBeforeData), NewValue = JsonConvert.SerializeObject(editAfterData), @@ -270,10 +270,10 @@ public static class SqlsugarInstall db.GetConnection(1288018625843826680).Insertable(auditData).ExecuteCommand(); #endregion } - + }; //全局过滤租户 - dbProvider.QueryFilter.AddTableFilter(m => m.TenantId == user.GetTenantId()); + dbProvider.QueryFilter.AddTableFilter(m => m.TenantId == long.Parse(user.TenantId)); //全局过滤机构Id dbProvider.QueryFilter.AddTableFilter(m => m.OrgId == user.OrgId); //全局软删除过滤 diff --git a/ds-wms-service/DS.WMS.Core/Code/Dtos/CodeUserEmailRes.cs b/ds-wms-service/DS.WMS.Core/Code/Dtos/CodeUserEmailRes.cs index de11111f..ba7cadf6 100644 --- a/ds-wms-service/DS.WMS.Core/Code/Dtos/CodeUserEmailRes.cs +++ b/ds-wms-service/DS.WMS.Core/Code/Dtos/CodeUserEmailRes.cs @@ -1,6 +1,8 @@ using DS.Module.Core; +using SqlSugar; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -65,5 +67,15 @@ namespace DS.WMS.Core.Code.Dtos /// 是否为公司账号 /// public bool IsCompany { get; set; } = false; + + /// + /// 创建时间 + /// + public DateTime CreateTime { get; set; } + + /// + /// 创建人名称 + /// + public string CreateUserName { get; set; } } } diff --git a/ds-wms-service/DS.WMS.Core/Info/Dtos/ClientShipperReq.cs b/ds-wms-service/DS.WMS.Core/Info/Dtos/ClientShipperReq.cs index 4a89a52f..76b830cb 100644 --- a/ds-wms-service/DS.WMS.Core/Info/Dtos/ClientShipperReq.cs +++ b/ds-wms-service/DS.WMS.Core/Info/Dtos/ClientShipperReq.cs @@ -42,7 +42,7 @@ public class ClientShipperReq /// /// Desc:类型 下拉选择(Shipper-1,Consinee-2,Notifypaty-3,Agent-4) /// - public int ShipperType { get; set; } + public string ShipperType { get; set; } /// /// 是否公共标识 diff --git a/ds-wms-service/DS.WMS.Core/Info/Dtos/ClientShipperRes.cs b/ds-wms-service/DS.WMS.Core/Info/Dtos/ClientShipperRes.cs index c0d30b15..14e0820a 100644 --- a/ds-wms-service/DS.WMS.Core/Info/Dtos/ClientShipperRes.cs +++ b/ds-wms-service/DS.WMS.Core/Info/Dtos/ClientShipperRes.cs @@ -40,7 +40,7 @@ public class ClientShipperRes /// /// Desc:类型 下拉选择(Shipper-1,Consinee-2,Notifypaty-3,Agent-4) /// - public int ShipperType { get; set; } + public string ShipperType { get; set; } /// /// 是否公共标识 diff --git a/ds-wms-service/DS.WMS.Core/Info/Entity/InfoClientShipper.cs b/ds-wms-service/DS.WMS.Core/Info/Entity/InfoClientShipper.cs index bf976d05..5fb7f13e 100644 --- a/ds-wms-service/DS.WMS.Core/Info/Entity/InfoClientShipper.cs +++ b/ds-wms-service/DS.WMS.Core/Info/Entity/InfoClientShipper.cs @@ -36,8 +36,8 @@ public class InfoClientShipper : BaseModelV2 /// /// Desc:类型 下拉选择(Shipper-1,Consinee-2,Notifypaty-3,Agent-4) /// - [SugarColumn(ColumnDescription = "类型 下拉选择(Shipper-1,Consinee-2,Notifypaty-3,Agent-4)")] - public int ShipperType { get; set; } + [SugarColumn(ColumnDescription = "类型 下拉选择(Shipper-1,Consinee-2,Notifypaty-3,Agent-4)", Length = 50)] + public string ShipperType { get; set; } /// /// 是否公共标识 diff --git a/ds-wms-service/DS.WMS.Core/Op/EDI/SendShippingOrderReq.cs b/ds-wms-service/DS.WMS.Core/Op/EDI/SendShippingOrderReq.cs index 3680dd73..ce9787ed 100644 --- a/ds-wms-service/DS.WMS.Core/Op/EDI/SendShippingOrderReq.cs +++ b/ds-wms-service/DS.WMS.Core/Op/EDI/SendShippingOrderReq.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace DS.WMS.Core.Op.EDI { /// - /// 发送托书Req + /// 发送海运出口邮件Req /// public class SendShippingOrderReq { diff --git a/ds-wms-service/DS.WMS.Core/Op/Interface/IOpBusinessYardService.cs b/ds-wms-service/DS.WMS.Core/Op/Interface/IOpBusinessYardService.cs index 223c55d2..26bf498f 100644 --- a/ds-wms-service/DS.WMS.Core/Op/Interface/IOpBusinessYardService.cs +++ b/ds-wms-service/DS.WMS.Core/Op/Interface/IOpBusinessYardService.cs @@ -3,6 +3,7 @@ using DS.Module.Core.Data; using DS.Module.SqlSugar; using DS.WMS.Core.Info.Dtos; using DS.WMS.Core.Op.Dtos; +using DS.WMS.Core.Op.EDI; using DS.WMS.Core.Op.Entity; using System; using System.Collections.Generic; @@ -55,6 +56,13 @@ namespace DS.WMS.Core.Op.Interface /// /// public DataResult BatchDelOpBusinessYard(IdModel req); + + /// + /// 放舱通知发送 + /// + /// + /// + public Task> SendLetterYard(SendShippingOrderReq req); } diff --git a/ds-wms-service/DS.WMS.Core/Op/Method/OpBusinessYardService.cs b/ds-wms-service/DS.WMS.Core/Op/Method/OpBusinessYardService.cs index b5543512..f4537573 100644 --- a/ds-wms-service/DS.WMS.Core/Op/Method/OpBusinessYardService.cs +++ b/ds-wms-service/DS.WMS.Core/Op/Method/OpBusinessYardService.cs @@ -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 SendLetterYard(string id) -// { -// var tenant = db.Queryable().FirstAsync(t => t.Id == long.Parse(user.TenantId)); - -// var tenantDb = saasService.GetBizDbScopeById(user.TenantId); -// var bookingId = long.Parse(id); -// var order = await tenantDb.Queryable().FirstAsync(x => x.Id == bookingId); -// var userInfo = await tenantDb.Queryable().FirstAsync(u => u.Id == order.CreateBy); - - -// var letterYard = await tenantDb.Queryable().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().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().FirstAsync(u => u.BusinessId == bookingId); -// //if (orderUrl == null) -// //{ -// // throw Oops.Bah("未生成链接信息,请重新保存数据"); -// //} - -// #region 保存放舱文件,并挂载到订舱附件 -// var printTemplate = await db.Queryable().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}
通风:{order.ReeferQuantity}
湿度:{order.Humidity}
"; -// } -// else if (order.CargoId == "D") //危险品 -// { -// extContent = $"危险品等级:{order.DangerClass}
危险品编号:{order.DangerNo}
"; -// } - -// var linkContent = string.Empty; -// if (orderUrl != null) -// { -// linkContent = $@"提箱小票链接:{orderUrl.UrlTxxp}
-//提交VGM链接:{orderUrl.UrlVgm}
"; -// } - -// var mailContent = $@"TO:{order.CustomerName}贵司委托我司代理订舱出口的货物信息如下,详情请见附件,谢谢!
-//提单号:{order.MBLNO}
-//船名航次:{order.Vessel}/{order.Voyno}
-//目的港:{order.DischargePort}
-//预计船期:{(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}
-//{linkContent} -//
-// 温馨提示:
-// 如果分票报关,请回箱前通知场站及我司。
-// 开船及截港时间以码头具体计划为准。
-// 若贵司自输VGM,请不要通过VGM链接提交数据,否则我司收取相关VGM申报费用。
-//
-// 订舱代理联系人:{user.UserName}
-// 电话:{userInfo.Tel} 手机:{userInfo.Phone}
-// 邮箱:{userInfo.Email} -//
"; - -// var sendResult = await MailSendHelper.SendMail(mailAcc, mailSubject, mailContent, letterYard.ToAttnEmail, new KeyValuePair($"放舱通知_{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> SendLetterYard(SendShippingOrderReq req) + { + var tenant = db.Queryable().FirstAsync(t => t.Id == long.Parse(user.TenantId)); + + var tenantDb = saasService.GetBizDbScopeById(user.TenantId); + var bookingId = req.BookingId; + var letterYard = await tenantDb.Queryable().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 order = await tenantDb.Queryable().FirstAsync(x => x.Id == bookingId); + var userMail = await tenantDb.Queryable().FirstAsync(x => x.CreateBy == long.Parse(user.UserId)); + if (userMail == null) + { + return await Task.FromResult(DataResult.Failed("未配置发件邮箱")); + } + + if (string.IsNullOrEmpty(userMail.SmtpServer) || userMail.SmtpPort == 25) + { + return await Task.FromResult(DataResult.Failed("请正确配置发件邮箱,且发件不能使用25端口")); + } + + var emailUrl = db.Queryable().Filter(null, true).Where(x => x.Code == "email_api_url" && x.TenantId == 1288018625843826688).First().Value; + + if (emailUrl == null) + { + return await Task.FromResult(DataResult.Failed("系统参数未配置email_api_url 请联系管理员")); + } + + //处理附件 + var attPostArr = new List(); + 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.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.Failed(jRtn.GetStringValue("Message"))); + } + //return await Task.FromResult(DataResult.Success(jRtn.GetStringValue("Message"))); + //设置货物状态-放舱 + await seaComService.SetGoodsStatus("YFC", bookingId, tenantDb); + return await Task.FromResult(DataResult.Success("发送成功")); + // var bookingId = long.Parse(id); + // var order = await tenantDb.Queryable().FirstAsync(x => x.Id == bookingId); + // var userInfo = await tenantDb.Queryable().FirstAsync(u => u.Id == order.CreateBy); + + + // var letterYard = await tenantDb.Queryable().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().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().FirstAsync(u => u.BusinessId == bookingId); + // //if (orderUrl == null) + // //{ + // // throw Oops.Bah("未生成链接信息,请重新保存数据"); + // //} + + // #region 保存放舱文件,并挂载到订舱附件 + // var printTemplate = await db.Queryable().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}
通风:{order.ReeferQuantity}
湿度:{order.Humidity}
"; + // } + // else if (order.CargoId == "D") //危险品 + // { + // extContent = $"危险品等级:{order.DangerClass}
危险品编号:{order.DangerNo}
"; + // } + + // var linkContent = string.Empty; + // if (orderUrl != null) + // { + // linkContent = $@"提箱小票链接:{orderUrl.UrlTxxp}
+ //提交VGM链接:{orderUrl.UrlVgm}
"; + // } + + // var mailContent = $@"TO:{order.CustomerName}贵司委托我司代理订舱出口的货物信息如下,详情请见附件,谢谢!
+ //提单号:{order.MBLNO}
+ //船名航次:{order.Vessel}/{order.Voyno}
+ //目的港:{order.DischargePort}
+ //预计船期:{(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}
+ //{linkContent} + //
+ // 温馨提示:
+ // 如果分票报关,请回箱前通知场站及我司。
+ // 开船及截港时间以码头具体计划为准。
+ // 若贵司自输VGM,请不要通过VGM链接提交数据,否则我司收取相关VGM申报费用。
+ //
+ // 订舱代理联系人:{user.UserName}
+ // 电话:{userInfo.Tel} 手机:{userInfo.Phone}
+ // 邮箱:{userInfo.Email} + //
"; + + // var sendResult = await MailSendHelper.SendMail(mailAcc, mailSubject, mailContent, letterYard.ToAttnEmail, new KeyValuePair($"放舱通知_{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("发送成功")); + + } } } diff --git a/ds-wms-service/DS.WMS.Core/Op/Method/TaskInteraction/TaskService.cs b/ds-wms-service/DS.WMS.Core/Op/Method/TaskInteraction/TaskService.cs index c5b0ad03..ad912ad0 100644 --- a/ds-wms-service/DS.WMS.Core/Op/Method/TaskInteraction/TaskService.cs +++ b/ds-wms-service/DS.WMS.Core/Op/Method/TaskInteraction/TaskService.cs @@ -448,8 +448,8 @@ namespace DS.WMS.Core.Op.Method.TaskInteraction protected virtual async Task EnsureModuleAuthorized() { long tid = long.Parse(User.TenantId); - var authStr = await Db.Queryable().ClearFilter(typeof(ITenantId)).Where(x => x.PermissionId == PERMISSION_ID && x.TenantId == tid && - SqlFunc.Subqueryable().Where(spt => spt.PermissionId == x.PermissionId && spt.TenantId == tid).Any()) + var authStr = await Db.Queryable().Where(x => x.PermissionId == PERMISSION_ID && x.TenantId == tid && + SqlFunc.Subqueryable().Where(spt => spt.PermissionId == x.PermissionId).Any()) .Select(x => x.AuthNum).FirstAsync(); if (authStr.IsNullOrEmpty()) return false; diff --git a/ds-wms-service/DS.WMS.OpApi/Controllers/OpBusinessYardController.cs b/ds-wms-service/DS.WMS.OpApi/Controllers/OpBusinessYardController.cs index 1fb07237..f6ed6d05 100644 --- a/ds-wms-service/DS.WMS.OpApi/Controllers/OpBusinessYardController.cs +++ b/ds-wms-service/DS.WMS.OpApi/Controllers/OpBusinessYardController.cs @@ -3,6 +3,7 @@ using DS.Module.Core.Data; using DS.WMS.Core.Code.Dtos; using DS.WMS.Core.Code.Interface; using DS.WMS.Core.Op.Dtos; +using DS.WMS.Core.Op.EDI; using DS.WMS.Core.Op.Interface; using Microsoft.AspNetCore.Mvc; using System.Threading.Tasks; @@ -100,6 +101,17 @@ public class OpBusinessYardController : ApiController } - + /// + /// 发送放舱通知 + /// + /// + /// + [HttpPost] + [Route("SendLetterYard")] + public async Task> SendLetterYard([FromBody] SendShippingOrderReq req) + { + var res = await _invokeService.SendLetterYard(req); + return res; + } } \ No newline at end of file diff --git a/ds-wms-service/DS.WMS.PrintApi/Service/OpenPrintService.cs b/ds-wms-service/DS.WMS.PrintApi/Service/OpenPrintService.cs index b46d80e5..d94d65c8 100644 --- a/ds-wms-service/DS.WMS.PrintApi/Service/OpenPrintService.cs +++ b/ds-wms-service/DS.WMS.PrintApi/Service/OpenPrintService.cs @@ -426,6 +426,21 @@ namespace DS.WMS.PrintApi.Service saveFile = Path.Combine(savePath, printName); PDFExport pdfExport = new PDFExport(); pdfExport.Export(report, saveFile); + + #region 处理托书挂载附件 + + if (template.TemplateCode == "bill_of_lading" || template.TemplateCode == "release_the_cabin") + { + System.IO.FileStream file = new System.IO.FileStream(saveFile, FileMode.Open, FileAccess.Read); + var movePath = Path.Combine(AppSetting.Configuration["FileSettings:MovePath"], printName); + using (var fileStream = File.Create(movePath)) + { + await file.CopyToAsync(fileStream); + } + + file.Close(); + } + #endregion } else if (req.PrintType == "2") {