From 806af3bb700091185b3a4e5444ba1e7208d25603 Mon Sep 17 00:00:00 2001 From: tongfei <244188119@qq.com> Date: Fri, 29 Mar 2024 15:15:43 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9F=AD=E4=BF=A1=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/WMS.Web.Api/appsettings.json | 14 + src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml | 60 +++++ src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml | 186 +++++++++++-- .../Dto/Erp/ErpInStockResultDto.cs | 5 + .../Dto/InStockTask/InStockTaskBoxInfoDto.cs | 1 + src/WMS.Web.Core/Dto/SendDataDto.cs | 65 +++++ src/WMS.Web.Core/WMS.Web.Core.csproj | 1 + src/WMS.Web.Domain/Entitys/InstockTask.cs | 8 +- .../Entitys/InstockTaskDetails.cs | 23 ++ .../IService/Public/IAliyunSmsService.cs | 13 - .../IService/Public/ISendMessageService.cs | 45 ++++ .../Infrastructure/IInStockRepositories.cs | 7 + .../IInStockTaskRepositories.cs | 6 + src/WMS.Web.Domain/Mappers/InStockMapper.cs | 4 +- src/WMS.Web.Domain/Options/EmailOptions.cs | 42 +++ src/WMS.Web.Domain/Options/SmsOptions.cs | 32 +++ src/WMS.Web.Domain/QuartzJob/SendQuartzJob.cs | 63 +++++ .../Services/Public/AliyunSmsService.cs | 56 ---- .../Services/Public/ErpService.cs | 3 +- .../Services/Public/SendMessageService.cs | 249 ++++++++++++++++++ src/WMS.Web.Domain/WMS.Web.Domain.csproj | 1 + .../DependencyInjection/AppBuilder.cs | 9 + .../InStockRepositories.cs | 10 + .../InStockTaskRepositories.cs | 19 +- 24 files changed, 829 insertions(+), 93 deletions(-) create mode 100644 src/WMS.Web.Core/Dto/SendDataDto.cs delete mode 100644 src/WMS.Web.Domain/IService/Public/IAliyunSmsService.cs create mode 100644 src/WMS.Web.Domain/IService/Public/ISendMessageService.cs create mode 100644 src/WMS.Web.Domain/Options/EmailOptions.cs create mode 100644 src/WMS.Web.Domain/Options/SmsOptions.cs create mode 100644 src/WMS.Web.Domain/QuartzJob/SendQuartzJob.cs delete mode 100644 src/WMS.Web.Domain/Services/Public/AliyunSmsService.cs create mode 100644 src/WMS.Web.Domain/Services/Public/SendMessageService.cs diff --git a/src/WMS.Web.Api/appsettings.json b/src/WMS.Web.Api/appsettings.json index f4032e56..36b14bcc 100644 --- a/src/WMS.Web.Api/appsettings.json +++ b/src/WMS.Web.Api/appsettings.json @@ -103,5 +103,19 @@ "QuartzJobDescription": "OpsJob", "QuartzTriggerIdentity": "OpsTrigger", "QuartzTriggerDescription": "OpsJobTrigger" + }, + "EmailOptions": { + "SmtpServer": "smtp.qiye.aliyun.com", + "SmtpPort": 587, + "SenderName": "元创时代", + "SendTitle": "【元创时代】-产品入库通知", + "SenderEmail": "info@f2b211.com", + "SenderEmailPwd": "K4h6GgxZYGMYV1Bb" + }, + "SmsOptions": { + "AccessKeyId": "LTAI5tBJg6KeDV2V1NiS7Ngi", + "AccessKeySecret": "MAC8bMovSFyCgRQGkfhVcL1jvLJ8cP", + "SignName": "深圳市元创时代", + "TemplateCode": "SMS_465408787" } } diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml index bdccb4ce..60927436 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml @@ -956,6 +956,11 @@ 閿鍞鍗 + + + 瀹㈡埛缂栫爜 + + 鐗╂枡缂栫爜 @@ -5229,6 +5234,61 @@ 姣忛〉鏉℃暟 涓嶄紶榛樿姣忛〉10 鏉 + + + 瀹㈡埛缂栫爜 + + + + + 瀹㈡埛鍚嶇О + + + + + 鎵嬫満鍙风爜 + + + + + 閭 + + + + + 閭 + + + + + 鏄庣粏 + + + + + 鏄庣粏 + + + + + 鐗╂枡鍚嶇О + + + + + 鐗╂枡缂栫爜 + + + + + 鐗╂枡瑙勬牸鍨嬪彿 + + + + + 鏁伴噺 + + 搴忓垪鍙蜂俊鎭 diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml index 59dfb598..fc0d4039 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml @@ -935,11 +935,6 @@ 鏉ユ簮鍗曞彿 - - - 閿鍞鍗曞彿 - - 鍏ュ簱鐘舵 @@ -1194,6 +1189,26 @@ 鏄惁浣滃簾 + + + 閿鍞鍗曞彿 + + + + + 瀹㈡埛缂栫爜 + + + + + 鏄惁宸插彂閫 + + + + + 鏍囪宸插彂閫 + + wms鍏ュ簱鍗-姹囨绘槑缁 @@ -2751,6 +2766,13 @@ + + + + + + + 绠变笌浠诲姟鍗曠粦瀹氾紙鏀惰揣锛夊叧绯昏〃-浠撳偍鎺ュ彛 @@ -2915,6 +2937,12 @@ + + + 鑾峰彇鏄庣粏 + + + 搴撳瓨鐩稿叧-浠撳偍鎺ュ彛 @@ -3552,11 +3580,6 @@ 鐩樼偣鍗曟湇鍔 - - - 闃块噷浜戠煭鎭湇鍔 - - erp鍩虹鏁版嵁锛氭墿灞曟湇鍔℃帴鍙 @@ -4128,6 +4151,39 @@ + + + 鍙戦佹秷鎭湇鍔 + + + + + 鐭俊鍙戦 + + + + + + + + 閭鍙戦 + + + + + + + + + + + + + + 鎵ц + + + mapper鏄犲皠 @@ -4209,6 +4265,41 @@ 鍏徃ID + + + 閭 + + + + + SMTP 鏈嶅姟鍣ㄥ湴鍧 + + + + + SMTP 鏈嶅姟鍣ㄧ鍙e彿 + + + + + 鍚嶇О + + + + + 涓婚 + + + + + 鍙戜欢浜洪偖绠卞湴鍧 + + + + + 鍙戜欢浜洪偖绠卞瘑鐮 + + erp鐩稿叧閰嶇疆鏂囦欢 @@ -4394,6 +4485,31 @@ 瑙﹀彂鍣ㄦ弿杩 + + + 鐭俊閰嶇疆椤 + + + + + 璁块棶鍑瘉ID + + + + + 璁块棶绉橀挜 + + + + + 鐭俊绛惧悕 + + + + + 鐭俊妯℃澘缂栧彿 + + 鍗曠偣绯荤粺鍦板潃 @@ -4455,6 +4571,18 @@ + + + 鍙戦佷俊鎭殑瀹氭椂浠诲姟 + + + + + 鎵ц鏂规硶 + + + + 鍑哄叆搴撳洖閫涓婁笅鏋讹細鏈嶅姟鎺ュ彛 @@ -5125,11 +5253,6 @@ - - - 闃块噷浜戠煭鎭湇鍔 - - 鍚屾erp鍩虹鏁版嵁 @@ -5863,6 +5986,39 @@ + + + 闃块噷浜戠煭鎭湇鍔 + + + + + 鐭俊鍙戦 + + + + + + + + 閭鍙戦佹秷鎭 + + + + + + + + 鑾峰彇鏁版嵁 + + + + + + 鎵ц + + + 涓婁紶鏂囦欢 diff --git a/src/WMS.Web.Core/Dto/Erp/ErpInStockResultDto.cs b/src/WMS.Web.Core/Dto/Erp/ErpInStockResultDto.cs index 870a51be..5bd09b07 100644 --- a/src/WMS.Web.Core/Dto/Erp/ErpInStockResultDto.cs +++ b/src/WMS.Web.Core/Dto/Erp/ErpInStockResultDto.cs @@ -83,5 +83,10 @@ namespace WMS.Web.Core.Dto.Erp /// 閿鍞鍗 /// public string SaleBillNo { get; set; } + + /// + /// 瀹㈡埛缂栫爜 + /// + public string CustomerCode { get; set; } } } diff --git a/src/WMS.Web.Core/Dto/InStockTask/InStockTaskBoxInfoDto.cs b/src/WMS.Web.Core/Dto/InStockTask/InStockTaskBoxInfoDto.cs index a5cc09d7..1514f334 100644 --- a/src/WMS.Web.Core/Dto/InStockTask/InStockTaskBoxInfoDto.cs +++ b/src/WMS.Web.Core/Dto/InStockTask/InStockTaskBoxInfoDto.cs @@ -78,5 +78,6 @@ namespace WMS.Web.Core.Dto.InStockTask /// 搴忓垪鍙 /// public string SerialNumbers { get; set; } + } } diff --git a/src/WMS.Web.Core/Dto/SendDataDto.cs b/src/WMS.Web.Core/Dto/SendDataDto.cs new file mode 100644 index 00000000..ed2d034a --- /dev/null +++ b/src/WMS.Web.Core/Dto/SendDataDto.cs @@ -0,0 +1,65 @@ +锘縰sing MimeKit; +using System; +using System.Collections.Generic; +using System.Text; + +namespace WMS.Web.Core.Dto +{ + public class SendDataDto + { + /// + /// 瀹㈡埛缂栫爜 + /// + public string CustomerCode { get; set; } + + /// + /// 瀹㈡埛鍚嶇О + /// + public string CustomerName { get; set; } + + /// + /// 鎵嬫満鍙风爜 + /// + public string PhoneNumbers { get; set; } + + /// + /// 閭 + /// + public string Emails { get; set; } + + /// + /// 閭 + /// + public List EmailList { get; set; } = new List(); + + /// + /// 鏄庣粏 + /// + public List Details { get; set; } = new List(); + + } + + /// + /// 鏄庣粏 + /// + public class SendDataDetailsDto + { + /// + /// 鐗╂枡鍚嶇О + /// + public string MaterialName { get; set; } + /// + /// 鐗╂枡缂栫爜 + /// + public string MaterialNumber { get; set; } + /// + /// 鐗╂枡瑙勬牸鍨嬪彿 + /// + public string Specifications { get; set; } + + /// + /// 鏁伴噺 + /// + public decimal Qty { get; set; } + } +} diff --git a/src/WMS.Web.Core/WMS.Web.Core.csproj b/src/WMS.Web.Core/WMS.Web.Core.csproj index 4d0cf828..7ed5131a 100644 --- a/src/WMS.Web.Core/WMS.Web.Core.csproj +++ b/src/WMS.Web.Core/WMS.Web.Core.csproj @@ -15,6 +15,7 @@ + diff --git a/src/WMS.Web.Domain/Entitys/InstockTask.cs b/src/WMS.Web.Domain/Entitys/InstockTask.cs index c2c0758a..ccc1f4ca 100644 --- a/src/WMS.Web.Domain/Entitys/InstockTask.cs +++ b/src/WMS.Web.Domain/Entitys/InstockTask.cs @@ -28,10 +28,10 @@ namespace WMS.Web.Domain.Entitys /// public string SourceBillNo { get; set; } - /// - /// 閿鍞鍗曞彿 - /// - public string SaleBillNo { get; set; } + ///// + ///// 閿鍞鍗曞彿 + ///// + //public string SaleBillNo { get; set; } /// /// 鍏ュ簱鐘舵 diff --git a/src/WMS.Web.Domain/Entitys/InstockTaskDetails.cs b/src/WMS.Web.Domain/Entitys/InstockTaskDetails.cs index 5bb988b8..a7080d68 100644 --- a/src/WMS.Web.Domain/Entitys/InstockTaskDetails.cs +++ b/src/WMS.Web.Domain/Entitys/InstockTaskDetails.cs @@ -78,5 +78,28 @@ namespace WMS.Web.Domain.Entitys /// public bool? IsRepeal { get; set; } = false; + /// + /// 閿鍞鍗曞彿 + /// + public string SaleBillNo { get; set; } + + /// + /// 瀹㈡埛缂栫爜 + /// + public string CustomerCode { get; set; } + + /// + /// 鏄惁宸插彂閫 + /// + public bool? IsHasSend { get; set; } = false; + + /// + /// 鏍囪宸插彂閫 + /// + public void HasSend() + { + this.IsHasSend = true; + } + } } diff --git a/src/WMS.Web.Domain/IService/Public/IAliyunSmsService.cs b/src/WMS.Web.Domain/IService/Public/IAliyunSmsService.cs deleted file mode 100644 index 6f5e18b8..00000000 --- a/src/WMS.Web.Domain/IService/Public/IAliyunSmsService.cs +++ /dev/null @@ -1,13 +0,0 @@ -锘縰sing System; -using System.Collections.Generic; -using System.Text; - -namespace WMS.Web.Domain.IService -{ - /// - /// 闃块噷浜戠煭鎭湇鍔 - /// - public interface IAliyunSmsService - { - } -} diff --git a/src/WMS.Web.Domain/IService/Public/ISendMessageService.cs b/src/WMS.Web.Domain/IService/Public/ISendMessageService.cs new file mode 100644 index 00000000..d5ad57c3 --- /dev/null +++ b/src/WMS.Web.Domain/IService/Public/ISendMessageService.cs @@ -0,0 +1,45 @@ +锘縰sing MimeKit; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using WMS.Web.Core.Dto; +using WMS.Web.Core.Internal.Results; + +namespace WMS.Web.Domain.IService +{ + /// + /// 鍙戦佹秷鎭湇鍔 + /// + public interface ISendMessageService + { + + /// + /// 鐭俊鍙戦 + /// + /// + /// + /// + bool SendSms(string phoneNumbers, string content); + + /// + /// 閭鍙戦 + /// + /// + /// + /// + Task SendEmail(List toMailList, string textBody); + + /// + /// + /// + /// + Task>> GetSendContent(); + + /// + /// 鎵ц + /// + /// + Task Execute(); + } +} diff --git a/src/WMS.Web.Domain/Infrastructure/IInStockRepositories.cs b/src/WMS.Web.Domain/Infrastructure/IInStockRepositories.cs index 054cff5a..0329df07 100644 --- a/src/WMS.Web.Domain/Infrastructure/IInStockRepositories.cs +++ b/src/WMS.Web.Domain/Infrastructure/IInStockRepositories.cs @@ -87,5 +87,12 @@ namespace WMS.Web.Domain.Infrastructure /// /// Task GetLastBillNo(); + + /// + /// + /// + /// + /// + Task> GetInStockTotalDetails(List taskIds); } } diff --git a/src/WMS.Web.Domain/Infrastructure/IInStockTaskRepositories.cs b/src/WMS.Web.Domain/Infrastructure/IInStockTaskRepositories.cs index c9f9e29f..922578a7 100644 --- a/src/WMS.Web.Domain/Infrastructure/IInStockTaskRepositories.cs +++ b/src/WMS.Web.Domain/Infrastructure/IInStockTaskRepositories.cs @@ -125,5 +125,11 @@ namespace WMS.Web.Domain.Infrastructure /// /// Task Update(InStockTask entity, bool isTransaction = true); + + /// + /// 鑾峰彇鏄庣粏 + /// + /// + Task> GetNotSendErpDetails(); } } diff --git a/src/WMS.Web.Domain/Mappers/InStockMapper.cs b/src/WMS.Web.Domain/Mappers/InStockMapper.cs index 0b764e41..b004f593 100644 --- a/src/WMS.Web.Domain/Mappers/InStockMapper.cs +++ b/src/WMS.Web.Domain/Mappers/InStockMapper.cs @@ -58,7 +58,7 @@ namespace WMS.Web.Domain.Mappers //ERP-鍚屾缁撴灉瀵硅薄缁熶竴鏄犲皠 CreateMap() .ForMember(x => x.SourceBillNo, ops => ops.MapFrom(x => x.BillNo)) - .ForMember(x => x.SaleBillNo, ops => ops.MapFrom(x => x.SaleBillNo)) + //.ForMember(x => x.SaleBillNo, ops => ops.MapFrom(x => x.SaleBillNo)) .ForMember(x => x.OrgCode, ops => ops.MapFrom(x => x.OrgCode)) .ForMember(x => x.SupplierId, ops => ops.MapFrom(x => x.SupplierId)) .ForMember(x => x.CreateTime, ops => ops.MapFrom(x => x.CreateTime)); @@ -73,6 +73,8 @@ namespace WMS.Web.Domain.Mappers .ForMember(x => x.FactoryPrice, ops => ops.MapFrom(x => x.FactoryPrice)) .ForMember(x => x.AccruedQty, ops => ops.MapFrom(x => x.Qty)) .ForMember(x => x.Remark, ops => ops.MapFrom(x => x.Remark)) + .ForMember(x => x.SaleBillNo, ops => ops.MapFrom(x => x.SaleBillNo)) + .ForMember(x => x.CustomerCode, ops => ops.MapFrom(x => x.CustomerCode)) .ReverseMap(); #endregion diff --git a/src/WMS.Web.Domain/Options/EmailOptions.cs b/src/WMS.Web.Domain/Options/EmailOptions.cs new file mode 100644 index 00000000..4b6f97c0 --- /dev/null +++ b/src/WMS.Web.Domain/Options/EmailOptions.cs @@ -0,0 +1,42 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Text; + +namespace WMS.Web.Domain.Options +{ + /// + /// 閭 + /// + public class EmailOptions + { + /// + /// SMTP 鏈嶅姟鍣ㄥ湴鍧 + /// + public string SmtpServer { get; set; } + + /// + /// SMTP 鏈嶅姟鍣ㄧ鍙e彿 + /// + public int SmtpPort { get; set; } + + /// + /// 鍚嶇О + /// + public string SenderName { get; set; } + + /// + /// 涓婚 + /// + public string SendTitle { get; set; } + + /// + /// 鍙戜欢浜洪偖绠卞湴鍧 + /// + public string SenderEmail { get; set; } + + /// + /// 鍙戜欢浜洪偖绠卞瘑鐮 + /// + public string SenderEmailPwd { get; set; } + } +} diff --git a/src/WMS.Web.Domain/Options/SmsOptions.cs b/src/WMS.Web.Domain/Options/SmsOptions.cs new file mode 100644 index 00000000..37245ae8 --- /dev/null +++ b/src/WMS.Web.Domain/Options/SmsOptions.cs @@ -0,0 +1,32 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Text; + +namespace WMS.Web.Domain.Options +{ + /// + /// 鐭俊閰嶇疆椤 + /// + public class SmsOptions + { + /// + /// 璁块棶鍑瘉ID + /// + public string AccessKeyId { get; set; } + + /// + /// 璁块棶绉橀挜 + /// + public string AccessKeySecret { get; set; } + + /// + /// 鐭俊绛惧悕 + /// + public string SignName { get; set; } + + /// + /// 鐭俊妯℃澘缂栧彿 + /// + public string TemplateCode { get; set; } + } +} diff --git a/src/WMS.Web.Domain/QuartzJob/SendQuartzJob.cs b/src/WMS.Web.Domain/QuartzJob/SendQuartzJob.cs new file mode 100644 index 00000000..e475ccdd --- /dev/null +++ b/src/WMS.Web.Domain/QuartzJob/SendQuartzJob.cs @@ -0,0 +1,63 @@ +锘縰sing Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Quartz; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using WMS.Web.Domain.IService; + +namespace WMS.Web.Domain.QuartzJob +{ + /// + /// 鍙戦佷俊鎭殑瀹氭椂浠诲姟 + /// + public class SendQuartzJob : IJob + { + private readonly ILogger _logger; + private readonly IServiceScopeFactory _serviceScopeFactory; + private readonly ISendMessageService _sendMessageService; + + public SendQuartzJob(ILogger logger, + IServiceScopeFactory serviceScopeFactory, + ISendMessageService sendMessageService) + { + this._logger = logger; + _serviceScopeFactory = serviceScopeFactory; + _sendMessageService = sendMessageService; + } + + + /// + /// 鎵ц鏂规硶 + /// + /// + /// + public async Task Execute(IJobExecutionContext context) + { + try + { + + //1.璁板綍锛氬紑濮嬫椂闂 + var begindatetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); + _logger.LogInformation($"鍙戦侀氱煡淇℃伅锛氭墽琛屽紑濮嬫椂闂->{begindatetime}"); + var result= await _sendMessageService.Execute(); + if (!result.IsSuccess) + { + _logger.LogInformation($"鍙戦侀氱煡淇℃伅锛氭墽琛屽け璐->{result.Message}"); + } + + //3.璁板綍锛氱粨鏉熸椂闂 + var enddatetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); + _logger.LogInformation($"鍙戦侀氱煡淇℃伅锛氭墽琛岀粨鏉熸椂闂->{begindatetime}"); + + + } + catch (Exception ex) + { + _logger.LogInformation($"鍙戦侀氱煡淇℃伅锛氬畾鏃朵换鍔℃墽琛屽け璐->{ex.Message}"); + } + + } + } +} diff --git a/src/WMS.Web.Domain/Services/Public/AliyunSmsService.cs b/src/WMS.Web.Domain/Services/Public/AliyunSmsService.cs deleted file mode 100644 index eca11e34..00000000 --- a/src/WMS.Web.Domain/Services/Public/AliyunSmsService.cs +++ /dev/null @@ -1,56 +0,0 @@ -锘縰sing Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; -using System.Text; -using WMS.Web.Domain.IService; -using Aliyun.Acs.Core; -using Aliyun.Acs.Core.Profile; -using Aliyun.Acs.Dysmsapi.Model.V20170525; -using Aliyun.Acs.Core.Exceptions; - -namespace WMS.Web.Domain.Services -{ - /// - /// 闃块噷浜戠煭鎭湇鍔 - /// - public class AliyunSmsService: IAliyunSmsService - { - private readonly ILogger _logger; - private readonly IAcsClient profile; - - public AliyunSmsService(ILogger logger, string accessKeyId, string accessKeySecret) - { - _logger = logger; - profile = new DefaultAcsClient(DefaultProfile.GetProfile("cn-hangzhou", accessKeyId, accessKeySecret)); - } - - public bool SendSms(string phoneNumbers, string templateCode, string signName, string templateParam = null) - { - SendSmsRequest request = new SendSmsRequest - { - PhoneNumbers = phoneNumbers, - SignName = signName, - TemplateCode = templateCode, - TemplateParam = templateParam - }; - - try - { - SendSmsResponse response = profile.GetAcsResponse(request); - return response.Code == "OK"; - } - catch (ServerException ex) - { - // 澶勭悊鏈嶅姟绔紓甯 - Console.WriteLine(ex.Message); - } - catch (ClientException ex) - { - // 澶勭悊瀹㈡埛绔紓甯 - Console.WriteLine(ex.Message); - } - - return false; - } - } -} diff --git a/src/WMS.Web.Domain/Services/Public/ErpService.cs b/src/WMS.Web.Domain/Services/Public/ErpService.cs index 06621781..0125fe47 100644 --- a/src/WMS.Web.Domain/Services/Public/ErpService.cs +++ b/src/WMS.Web.Domain/Services/Public/ErpService.cs @@ -183,7 +183,7 @@ namespace WMS.Web.Domain.Services.Public //3.鑾峰彇閲戣澏閲囪喘璁㈠崟锛氭嫾鎺ュ弬鏁板拰鏉′欢 var query = new ErpBillQueryDto(token_result.Data); var param = new ErpBillQueryParamDto(FormIdParam.PUR_PurchaseOrder.ToString()); - param.FieldKeys = "FBillNo,FSupplierId,FPurchaseOrgId,FMaterialId.FNumber,FSOSTOCKID,FQty,FEntryNote,FCreateDate,FCHUCHANGPRICE,FSOSTOCKID.FNumber,FStockInQty,FPurchaseOrgId.FNumber,FPOOrderEntry_FEntryID,FDEMANDBILLNO"; + param.FieldKeys = "FBillNo,FSupplierId,FPurchaseOrgId,FMaterialId.FNumber,FSOSTOCKID,FQty,FEntryNote,FCreateDate,FCHUCHANGPRICE,FSOSTOCKID.FNumber,FStockInQty,FPurchaseOrgId.FNumber,FPOOrderEntry_FEntryID,FDEMANDBILLNO,F_client.FNumber"; param.Limit = 10000; //鏌ヨ鏉′欢锛氬娉ㄥ叾涓殑鏉′欢鍊间互閲戣澏鐨勫间负鍑嗭紒锛侊紒 //1.鍒涘缓鏃堕棿鍦ㄤ袱澶╁墠鍜屽綋澶╂椂闂翠箣闂 @@ -263,6 +263,7 @@ namespace WMS.Web.Domain.Services.Public lis.OrgCode = item[11]; lis.ErpDetailId = Convert.ToInt32(item[12]); lis.SaleBillNo = item[13]; + lis.CustomerCode = item[14]; lis.Type = (int)InstockType.Purchase; erp_list.Add(lis); } diff --git a/src/WMS.Web.Domain/Services/Public/SendMessageService.cs b/src/WMS.Web.Domain/Services/Public/SendMessageService.cs new file mode 100644 index 00000000..725b8e55 --- /dev/null +++ b/src/WMS.Web.Domain/Services/Public/SendMessageService.cs @@ -0,0 +1,249 @@ +锘縰sing Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Text; +using WMS.Web.Domain.IService; +using Aliyun.Acs.Core; +using Aliyun.Acs.Core.Profile; +using Aliyun.Acs.Dysmsapi.Model.V20170525; +using Aliyun.Acs.Core.Exceptions; +using WMS.Web.Core.Internal.Results; +using System.Threading.Tasks; +using WMS.Web.Domain.Options; +using Microsoft.Extensions.Options; +using MimeKit; +using MailKit.Net.Smtp; +using MailKit.Security; +using Newtonsoft.Json; +using WMS.Web.Domain.Infrastructure; +using WMS.Web.Core.Dto; +using System.Linq; +using WMS.Web.Domain.IService.Public; +using WMS.Web.Core.Dto.Erp; + +namespace WMS.Web.Domain.Services +{ + /// + /// 闃块噷浜戠煭鎭湇鍔 + /// + public class SendMessageService: ISendMessageService + { + private readonly ILogger _logger; + private readonly IClientProfile profile; + private readonly DefaultAcsClient client; + private readonly EmailOptions _emailOptions; + private readonly SmsOptions _smsOptions; + private readonly IInStockRepositories _inStockRepositories; + private readonly IInStockTaskRepositories _inStockTaskRepositories; + private readonly IErpBasicDataExtendService _erpBasicDataExtendService; + private readonly ISubscribeNotificationRepositories _subscribeNotificationRepositories; + private readonly IErpService _erpService; + + public SendMessageService(ILogger logger, + IOptions emailOptions, + IOptions smsOptions, + IInStockRepositories inStockRepositories, + IErpService erpService, + IErpBasicDataExtendService erpBasicDataExtendService, + IInStockTaskRepositories inStockTaskRepositories, + ISubscribeNotificationRepositories subscribeNotificationRepositories) + { + _logger = logger; + _erpService = erpService; + _inStockRepositories = inStockRepositories; + _erpBasicDataExtendService = erpBasicDataExtendService; + _inStockTaskRepositories = inStockTaskRepositories; + _subscribeNotificationRepositories = subscribeNotificationRepositories; + _emailOptions = emailOptions?.Value; + _smsOptions = smsOptions?.Value; + profile = DefaultProfile.GetProfile("cn-hangzhou", _smsOptions.AccessKeyId, _smsOptions.AccessKeySecret); + client = new DefaultAcsClient(profile); + } + + /// + /// 鐭俊鍙戦 + /// + /// + /// + /// + public bool SendSms(string phoneNumbers, string content) + { + // 鏋勯犵煭淇¤姹 + SendSmsRequest request = new SendSmsRequest(); + request.PhoneNumbers = phoneNumbers; // 鐩爣鎵嬫満鍙 + request.SignName = _smsOptions.SignName; // 鐭俊绛惧悕 + request.TemplateCode = _smsOptions.TemplateCode; // 鐭俊妯℃澘缂栧彿 + request.TemplateParam = "{\"material\":\"" + content+"\"}"; // 妯℃澘鍙傛暟锛屾牴鎹疄闄呮儏鍐靛~鍐 + + try + { + // 鍙戦佺煭淇 + SendSmsResponse response = client.GetAcsResponse(request); + _logger.LogInformation("鐭俊鍙戦佹秷鎭細鎴愬姛->鎵嬫満鍙风爜锛" + phoneNumbers + " 鍐呭锛" + content); + return true; + } + catch (ServerException e) + { + _logger.LogInformation($"鐭俊鍙戦佹秷鎭細Server澶辫触:{e.ErrorMessage}->鎵嬫満鍙风爜锛" + phoneNumbers + " 鍐呭锛" + content); + return false; + } + catch (ClientException e) + { + _logger.LogInformation($"鐭俊鍙戦佹秷鎭細Client澶辫触:{e.ErrorMessage}->鎵嬫満鍙风爜锛" + phoneNumbers + " 鍐呭锛" + content); + return false; + } + + } + + /// + /// 閭鍙戦佹秷鎭 + /// + /// + /// + /// + public async Task SendEmail(List toMailList,string textBody) + { + // 鍒涘缓 MimeMessage 瀹炰緥 + MimeMessage message = new MimeMessage(); + message.From.Add(new MailboxAddress(_emailOptions.SenderName, _emailOptions.SenderEmail)); // 璁剧疆鍙戜欢浜哄鍚嶅拰閭鍦板潃 + //message.To.Add(new MailboxAddress("Recipient Name", "244188119@qq.com")); // 璁剧疆鏀朵欢浜哄鍚嶅拰閭鍦板潃 + message.To.AddRange(toMailList); + message.Subject = _emailOptions.SendTitle+$"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}"; // 璁剧疆閭欢涓婚 + + // 鍒涘缓閭欢姝f枃 + BodyBuilder bodyBuilder = new BodyBuilder(); + bodyBuilder.TextBody = textBody; // 璁剧疆绾枃鏈唴瀹 + //bodyBuilder.HtmlBody = "

This is a test email sent from .NETCore.MailKit.lst

"; // 璁剧疆 HTML 鍐呭 + message.Body = bodyBuilder.ToMessageBody(); + + try + { + // 杩炴帴 SMTP 鏈嶅姟鍣ㄥ苟鍙戦侀偖浠 + using (SmtpClient client = new SmtpClient()) + { + await client.ConnectAsync(_emailOptions.SmtpServer, _emailOptions.SmtpPort, SecureSocketOptions.StartTls); // 杩炴帴 SMTP 鏈嶅姟鍣 + await client.AuthenticateAsync(_emailOptions.SenderEmail, _emailOptions.SenderEmailPwd); // 杩涜韬唤楠岃瘉 + await client.SendAsync(message); // 鍙戦侀偖浠 + await client.DisconnectAsync(true); // 鏂紑杩炴帴 + } + _logger.LogInformation("閭鍙戦佹秷鎭細鎴愬姛->鏀朵欢鏂癸細"+JsonConvert.SerializeObject(toMailList)+" 鍐呭锛"+textBody); + return Result.ReSuccess(); + } + catch (Exception ex) + { + _logger.LogInformation("閭鍙戦佹秷鎭細澶辫触->鏀朵欢鏂癸細" + JsonConvert.SerializeObject(toMailList) + " 鍐呭锛" + textBody); + return Result.ReFailure("閭鍙戦佸け璐ワ細"+ex.Message,50006); + } + } + + /// + /// 鑾峰彇鏁版嵁 + /// + /// + public async Task>> GetSendContent() + { + //1.鑾峰彇鐗╂枡闆嗗悎鍜岀粍缁囬泦鍚堝拰渚涘簲鍟嗙殑闆嗗悎 + var materials = new List(); + var materials_result = await _erpService.BillQueryForMaterial(); + if (materials_result.IsSuccess) + materials = materials_result.Data.ToList(); + + //瀹㈡埛 + var customerList= await _subscribeNotificationRepositories.GetList(); + //瑕佸鐞嗗彂閫佺殑鏄庣粏 + var notSendDetails=await _inStockTaskRepositories.GetNotSendErpDetails(); + + + var sendDataList = new List(); + if (customerList != null && customerList.Count != 0) + { + if (notSendDetails != null && notSendDetails.Count != 0) + { + var taskIds= notSendDetails.GroupBy(x => x.Fid).Select(x => x.Key).ToList(); + + var instockTotalDetails= await _inStockRepositories.GetInStockTotalDetails(taskIds); + foreach (var item in customerList) + { + var current_notSendDetails= notSendDetails.Where(x => x.CustomerCode == item.CustomerNumber).ToList(); + if (current_notSendDetails != null && current_notSendDetails.Count != 0) + { + var data = new SendDataDto(); + data.CustomerCode = item.CustomerNumber; + data.CustomerName = item.CustomerName; + data.PhoneNumbers = string.Join(",", item.Telephones); + data.Emails= string.Join(",", item.Emails); + foreach (var ema in item.Emails) + { + data.EmailList.Add(new MailboxAddress("Recipient Name", ema)); + } + + foreach (var current_det in current_notSendDetails) + { + var det = new SendDataDetailsDto(); + det.MaterialName = _erpBasicDataExtendService.GetMaterialName(materials, current_det.MaterialNumber); + det.Specifications = _erpBasicDataExtendService.GetMaterialSpecifications(materials, current_det.MaterialNumber); + det.MaterialNumber = current_det.MaterialNumber; + det.Qty=instockTotalDetails.Where(x => x.TaskId == current_det.Fid && x.MaterialNumber == current_det.MaterialNumber).Sum(x => x.Qty); + if (det.Qty > 0) + data.Details.Add(det); + } + if (data.Details.Count != 0) + sendDataList.Add(data); + + } + + } + } + } + + return Result>.ReSuccess(sendDataList); + } + + /// + /// 鎵ц + /// + /// + public async Task Execute() + { + try + { + var sendContentList_result = await this.GetSendContent(); + if (sendContentList_result.IsSuccess) + { + var sendContentList = sendContentList_result.Data; + + if (sendContentList != null && sendContentList.Count != 0) + { + + foreach (var item in sendContentList) + { + + var content = ""; + int i = 1; + foreach (var det in item.Details) + { + if (i == item.Details.Count) + content = det.Specifications + " X 鏁伴噺" + det.Qty; + else + content = det.Specifications + " X 鏁伴噺" + det.Qty + "锛"; + i = i + 1; + + } + //閭 + await this.SendEmail(item.EmailList, content); + //鐭俊 + this.SendSms(item.PhoneNumbers, content); + } + } + } + + return Result.ReSuccess(); + } + catch (Exception ex) + { + return Result.ReFailure("鍙戦佸け璐ワ細"+ex.Message,50006); + } + + } + } +} diff --git a/src/WMS.Web.Domain/WMS.Web.Domain.csproj b/src/WMS.Web.Domain/WMS.Web.Domain.csproj index 4631f06d..466c2992 100644 --- a/src/WMS.Web.Domain/WMS.Web.Domain.csproj +++ b/src/WMS.Web.Domain/WMS.Web.Domain.csproj @@ -20,6 +20,7 @@ + diff --git a/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs b/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs index 4f6f65ef..97d471ef 100644 --- a/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs +++ b/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs @@ -178,6 +178,13 @@ namespace WMS.Web.Repositories.DependencyInjection Services.Configure(Configuration.GetSection("OpsOptions")); Services.AddOptions(); Services.Configure(Configuration.GetSection("Qiniu")); + Services.AddOptions(); + Services.Configure(Configuration.GetSection("EmailOptions")); + Services.AddOptions(); + Services.Configure(Configuration.GetSection("SmsOptions")); + + + } /// @@ -296,6 +303,8 @@ namespace WMS.Web.Repositories.DependencyInjection Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); + Services.AddTransient(); + } } diff --git a/src/WMS.Web.Repositories/InStockRepositories.cs b/src/WMS.Web.Repositories/InStockRepositories.cs index 4eb00e19..173acd90 100644 --- a/src/WMS.Web.Repositories/InStockRepositories.cs +++ b/src/WMS.Web.Repositories/InStockRepositories.cs @@ -420,5 +420,15 @@ namespace WMS.Web.Repositories var entity = await _context.InStockErpDetails.OrderByDescending(x => x.Id).FirstOrDefaultAsync(); return entity; } + + /// + /// + /// + /// + /// + public async Task> GetInStockTotalDetails(List taskIds) + { + return await _context.InStockTotalDetails.Where(x => taskIds.Contains(x.TaskId)).ToListAsync(); + } } } diff --git a/src/WMS.Web.Repositories/InStockTaskRepositories.cs b/src/WMS.Web.Repositories/InStockTaskRepositories.cs index 09b71c5c..bfb50e46 100644 --- a/src/WMS.Web.Repositories/InStockTaskRepositories.cs +++ b/src/WMS.Web.Repositories/InStockTaskRepositories.cs @@ -141,7 +141,7 @@ namespace WMS.Web.Repositories if (suppliers_result.IsSuccess) suppliers = suppliers_result.Data.ToList(); - var entity = await _context.InStockTask.Where(x => x.Id == id).FirstOrDefaultAsync(); + var entity = await _context.InStockTask.Include(x=>x.Details).Where(x => x.Id == id).FirstOrDefaultAsync(); if (entity != null) { @@ -149,8 +149,8 @@ namespace WMS.Web.Repositories { Id = entity.Id, BillNo = entity.BillNo, - SourceBillNo = entity.SourceBillNo, - SaleBillNo = entity.SaleBillNo, + SaleBillNo= (string.Join(",", entity.Details.Select(x => x.SaleBillNo).ToList()).TrimEnd(',')), + SourceBillNo = entity.SourceBillNo, Status = entity.Status.GetRemark(), Type = entity.Type.GetRemark(), Supplier = _erpBasicDataExtendService.GetSupplierName(suppliers, entity.SupplierId??0), @@ -207,7 +207,11 @@ namespace WMS.Web.Repositories { x.SerialNumbers = (string.Join(",", serialNumbList.Where(x => x.MaterialNumber == x.MaterialNumber).Select(x => x.SerialNumber).ToList())).TrimEnd(','); }); + + } + + response.Boxs = boxList; } else @@ -753,5 +757,14 @@ namespace WMS.Web.Repositories return (list, total); } + + /// + /// 鑾峰彇鏄庣粏 + /// + /// + public async Task> GetNotSendErpDetails() + { + return await _context.InStockTaskDetails.Where(x =>x.AccruedQty!=0 && x.IsHasSend != null && x.IsHasSend == false && !string.IsNullOrEmpty(x.SaleBillNo) && !string.IsNullOrEmpty(x.CustomerCode)).ToListAsync(); + } } }