短信服务

This commit is contained in:
tongfei
2024-03-29 15:15:43 +08:00
parent 2f224fcaf3
commit 806af3bb70
24 changed files with 829 additions and 93 deletions

View File

@@ -103,5 +103,19 @@
"QuartzJobDescription": "OpsJob",
"QuartzTriggerIdentity": "OpsTrigger",
"QuartzTriggerDescription": "OpsJobTrigger"
},
"EmailOptions": {
"SmtpServer": "smtp.qiye.aliyun.com",
"SmtpPort": 587,
"SenderName": <><D4AA>ʱ<EFBFBD><CAB1>",
"SendTitle": "<22><>Ԫ<EFBFBD><D4AA>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>-<2D><>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD>֪ͨ",
"SenderEmail": "info@f2b211.com",
"SenderEmailPwd": "K4h6GgxZYGMYV1Bb"
},
"SmsOptions": {
"AccessKeyId": "LTAI5tBJg6KeDV2V1NiS7Ngi",
"AccessKeySecret": "MAC8bMovSFyCgRQGkfhVcL1jvLJ8cP",
"SignName": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>ʱ<EFBFBD><CAB1>",
"TemplateCode": "SMS_465408787"
}
}

View File

@@ -956,6 +956,11 @@
销售订单
</summary>
</member>
<member name="P:WMS.Web.Core.Dto.Erp.ErpInStockResultDto.CustomerCode">
<summary>
客户编码
</summary>
</member>
<member name="P:WMS.Web.Core.Dto.Erp.ErpInventoryDto.MaterialNumber">
<summary>
物料编码
@@ -5229,6 +5234,61 @@
每页条数 不传默认每页10 条
</summary>
</member>
<member name="P:WMS.Web.Core.Dto.SendDataDto.CustomerCode">
<summary>
客户编码
</summary>
</member>
<member name="P:WMS.Web.Core.Dto.SendDataDto.CustomerName">
<summary>
客户名称
</summary>
</member>
<member name="P:WMS.Web.Core.Dto.SendDataDto.PhoneNumbers">
<summary>
手机号码
</summary>
</member>
<member name="P:WMS.Web.Core.Dto.SendDataDto.Emails">
<summary>
邮箱
</summary>
</member>
<member name="P:WMS.Web.Core.Dto.SendDataDto.EmailList">
<summary>
邮箱
</summary>
</member>
<member name="P:WMS.Web.Core.Dto.SendDataDto.Details">
<summary>
明细
</summary>
</member>
<member name="T:WMS.Web.Core.Dto.SendDataDetailsDto">
<summary>
明细
</summary>
</member>
<member name="P:WMS.Web.Core.Dto.SendDataDetailsDto.MaterialName">
<summary>
物料名称
</summary>
</member>
<member name="P:WMS.Web.Core.Dto.SendDataDetailsDto.MaterialNumber">
<summary>
物料编码
</summary>
</member>
<member name="P:WMS.Web.Core.Dto.SendDataDetailsDto.Specifications">
<summary>
物料规格型号
</summary>
</member>
<member name="P:WMS.Web.Core.Dto.SendDataDetailsDto.Qty">
<summary>
数量
</summary>
</member>
<member name="T:WMS.Web.Core.Dto.SerialNumbers.SerialNumbersResponse">
<summary>
序列号信息

View File

@@ -935,11 +935,6 @@
来源单号
</summary>
</member>
<member name="P:WMS.Web.Domain.Entitys.InStockTask.SaleBillNo">
<summary>
销售订单号
</summary>
</member>
<member name="P:WMS.Web.Domain.Entitys.InStockTask.Status">
<summary>
入库状态
@@ -1194,6 +1189,26 @@
是否作废
</summary>
</member>
<member name="P:WMS.Web.Domain.Entitys.InStockTaskDetails.SaleBillNo">
<summary>
销售订单号
</summary>
</member>
<member name="P:WMS.Web.Domain.Entitys.InStockTaskDetails.CustomerCode">
<summary>
客户编码
</summary>
</member>
<member name="P:WMS.Web.Domain.Entitys.InStockTaskDetails.IsHasSend">
<summary>
是否已发送
</summary>
</member>
<member name="M:WMS.Web.Domain.Entitys.InStockTaskDetails.HasSend">
<summary>
标记已发送
</summary>
</member>
<member name="T:WMS.Web.Domain.Entitys.InStockTotalDetails">
<summary>
wms入库单-汇总明细
@@ -2751,6 +2766,13 @@
</summary>
<returns></returns>
</member>
<member name="M:WMS.Web.Domain.Infrastructure.IInStockRepositories.GetInStockTotalDetails(System.Collections.Generic.List{System.Int32})">
<summary>
</summary>
<param name="taskIds"></param>
<returns></returns>
</member>
<member name="T:WMS.Web.Domain.Infrastructure.IInStockTaskBoxRepositories">
<summary>
箱与任务单绑定(收货)关系表-仓储接口
@@ -2915,6 +2937,12 @@
<param name="isTransaction"></param>
<returns></returns>
</member>
<member name="M:WMS.Web.Domain.Infrastructure.IInStockTaskRepositories.GetNotSendErpDetails">
<summary>
获取明细
</summary>
<returns></returns>
</member>
<member name="T:WMS.Web.Domain.Infrastructure.IInventoryDetailsRepositories">
<summary>
库存相关-仓储接口
@@ -3552,11 +3580,6 @@
盘点单服务
</summary>
</member>
<member name="T:WMS.Web.Domain.IService.IAliyunSmsService">
<summary>
阿里云短息服务
</summary>
</member>
<member name="T:WMS.Web.Domain.IService.Public.IErpBasicDataExtendService">
<summary>
erp基础数据扩展服务接口
@@ -4128,6 +4151,39 @@
<param name="customerStockCode"></param>
<returns></returns>
</member>
<member name="T:WMS.Web.Domain.IService.ISendMessageService">
<summary>
发送消息服务
</summary>
</member>
<member name="M:WMS.Web.Domain.IService.ISendMessageService.SendSms(System.String,System.String)">
<summary>
短信发送
</summary>
<param name="phoneNumbers"></param>
<param name="content"></param>
<returns></returns>
</member>
<member name="M:WMS.Web.Domain.IService.ISendMessageService.SendEmail(System.Collections.Generic.List{MimeKit.MailboxAddress},System.String)">
<summary>
邮箱发送
</summary>
<param name="toMailList"></param>
<param name="textBody"></param>
<returns></returns>
</member>
<member name="M:WMS.Web.Domain.IService.ISendMessageService.GetSendContent">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:WMS.Web.Domain.IService.ISendMessageService.Execute">
<summary>
执行
</summary>
<returns></returns>
</member>
<member name="T:WMS.Web.Domain.Mappers.AppMapper">
<summary>
mapper映射
@@ -4209,6 +4265,41 @@
公司ID
</summary>
</member>
<member name="T:WMS.Web.Domain.Options.EmailOptions">
<summary>
邮箱
</summary>
</member>
<member name="P:WMS.Web.Domain.Options.EmailOptions.SmtpServer">
<summary>
SMTP 服务器地址
</summary>
</member>
<member name="P:WMS.Web.Domain.Options.EmailOptions.SmtpPort">
<summary>
SMTP 服务器端口号
</summary>
</member>
<member name="P:WMS.Web.Domain.Options.EmailOptions.SenderName">
<summary>
名称
</summary>
</member>
<member name="P:WMS.Web.Domain.Options.EmailOptions.SendTitle">
<summary>
主题
</summary>
</member>
<member name="P:WMS.Web.Domain.Options.EmailOptions.SenderEmail">
<summary>
发件人邮箱地址
</summary>
</member>
<member name="P:WMS.Web.Domain.Options.EmailOptions.SenderEmailPwd">
<summary>
发件人邮箱密码
</summary>
</member>
<member name="T:WMS.Web.Domain.Options.ErpOptions">
<summary>
erp相关配置文件
@@ -4394,6 +4485,31 @@
触发器描述
</summary>
</member>
<member name="T:WMS.Web.Domain.Options.SmsOptions">
<summary>
短信配置项
</summary>
</member>
<member name="P:WMS.Web.Domain.Options.SmsOptions.AccessKeyId">
<summary>
访问凭证ID
</summary>
</member>
<member name="P:WMS.Web.Domain.Options.SmsOptions.AccessKeySecret">
<summary>
访问秘钥
</summary>
</member>
<member name="P:WMS.Web.Domain.Options.SmsOptions.SignName">
<summary>
短信签名
</summary>
</member>
<member name="P:WMS.Web.Domain.Options.SmsOptions.TemplateCode">
<summary>
短信模板编号
</summary>
</member>
<member name="P:WMS.Web.Domain.Options.SoaOptions.Url">
<summary>
单点系统地址
@@ -4455,6 +4571,18 @@
<param name="context"></param>
<returns></returns>
</member>
<member name="T:WMS.Web.Domain.QuartzJob.SendQuartzJob">
<summary>
发送信息的定时任务
</summary>
</member>
<member name="M:WMS.Web.Domain.QuartzJob.SendQuartzJob.Execute(Quartz.IJobExecutionContext)">
<summary>
执行方法
</summary>
<param name="context"></param>
<returns></returns>
</member>
<member name="T:WMS.Web.Domain.Services.BackRecordService">
<summary>
出入库回退上下架:服务接口
@@ -5125,11 +5253,6 @@
<param name="id"></param>
<returns></returns>
</member>
<member name="T:WMS.Web.Domain.Services.AliyunSmsService">
<summary>
阿里云短息服务
</summary>
</member>
<member name="T:WMS.Web.Domain.Services.Public.ErpBaseDataSync">
<summary>
同步erp基础数据
@@ -5863,6 +5986,39 @@
<param name="customerStockCode"></param>
<returns></returns>
</member>
<member name="T:WMS.Web.Domain.Services.SendMessageService">
<summary>
阿里云短息服务
</summary>
</member>
<member name="M:WMS.Web.Domain.Services.SendMessageService.SendSms(System.String,System.String)">
<summary>
短信发送
</summary>
<param name="phoneNumbers"></param>
<param name="content"></param>
<returns></returns>
</member>
<member name="M:WMS.Web.Domain.Services.SendMessageService.SendEmail(System.Collections.Generic.List{MimeKit.MailboxAddress},System.String)">
<summary>
邮箱发送消息
</summary>
<param name="toMailList"></param>
<param name="textBody"></param>
<returns></returns>
</member>
<member name="M:WMS.Web.Domain.Services.SendMessageService.GetSendContent">
<summary>
获取数据
</summary>
<returns></returns>
</member>
<member name="M:WMS.Web.Domain.Services.SendMessageService.Execute">
<summary>
执行
</summary>
<returns></returns>
</member>
<member name="M:WMS.Web.Domain.Services.QiniuUploadService.Upload(System.String,System.IO.Stream,System.Boolean)">
<summary>
上传文件

View File

@@ -83,5 +83,10 @@ namespace WMS.Web.Core.Dto.Erp
/// 销售订单
/// </summary>
public string SaleBillNo { get; set; }
/// <summary>
/// 客户编码
/// </summary>
public string CustomerCode { get; set; }
}
}

View File

@@ -78,5 +78,6 @@ namespace WMS.Web.Core.Dto.InStockTask
/// 序列号
/// </summary>
public string SerialNumbers { get; set; }
}
}

View File

@@ -0,0 +1,65 @@
using MimeKit;
using System;
using System.Collections.Generic;
using System.Text;
namespace WMS.Web.Core.Dto
{
public class SendDataDto
{
/// <summary>
/// 客户编码
/// </summary>
public string CustomerCode { get; set; }
/// <summary>
/// 客户名称
/// </summary>
public string CustomerName { get; set; }
/// <summary>
/// 手机号码
/// </summary>
public string PhoneNumbers { get; set; }
/// <summary>
/// 邮箱
/// </summary>
public string Emails { get; set; }
/// <summary>
/// 邮箱
/// </summary>
public List<MailboxAddress> EmailList { get; set; } = new List<MailboxAddress>();
/// <summary>
/// 明细
/// </summary>
public List<SendDataDetailsDto> Details { get; set; } = new List<SendDataDetailsDto>();
}
/// <summary>
/// 明细
/// </summary>
public class SendDataDetailsDto
{
/// <summary>
/// 物料名称
/// </summary>
public string MaterialName { get; set; }
/// <summary>
/// 物料编码
/// </summary>
public string MaterialNumber { get; set; }
/// <summary>
/// 物料规格型号
/// </summary>
public string Specifications { get; set; }
/// <summary>
/// 数量
/// </summary>
public decimal Qty { get; set; }
}
}

View File

@@ -15,6 +15,7 @@
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="6.0.0" />
<PackageReference Include="Microsoft.IdentityModel.Tokens" Version="5.5.0" />
<PackageReference Include="MySql.Data" Version="8.0.29" />
<PackageReference Include="NETCore.MailKit" Version="2.1.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="NPinyin.Core" Version="3.0.0" />
<PackageReference Include="Npoi.Mapper" Version="3.5.1" />

View File

@@ -28,10 +28,10 @@ namespace WMS.Web.Domain.Entitys
/// </summary>
public string SourceBillNo { get; set; }
/// <summary>
/// 销售订单号
/// </summary>
public string SaleBillNo { get; set; }
///// <summary>
///// 销售订单号
///// </summary>
//public string SaleBillNo { get; set; }
/// <summary>
/// 入库状态

View File

@@ -78,5 +78,28 @@ namespace WMS.Web.Domain.Entitys
/// </summary>
public bool? IsRepeal { get; set; } = false;
/// <summary>
/// 销售订单号
/// </summary>
public string SaleBillNo { get; set; }
/// <summary>
/// 客户编码
/// </summary>
public string CustomerCode { get; set; }
/// <summary>
/// 是否已发送
/// </summary>
public bool? IsHasSend { get; set; } = false;
/// <summary>
/// 标记已发送
/// </summary>
public void HasSend()
{
this.IsHasSend = true;
}
}
}

View File

@@ -1,13 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace WMS.Web.Domain.IService
{
/// <summary>
/// 阿里云短息服务
/// </summary>
public interface IAliyunSmsService
{
}
}

View File

@@ -0,0 +1,45 @@
using 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
{
/// <summary>
/// 发送消息服务
/// </summary>
public interface ISendMessageService
{
/// <summary>
/// 短信发送
/// </summary>
/// <param name="phoneNumbers"></param>
/// <param name="content"></param>
/// <returns></returns>
bool SendSms(string phoneNumbers, string content);
/// <summary>
/// 邮箱发送
/// </summary>
/// <param name="toMailList"></param>
/// <param name="textBody"></param>
/// <returns></returns>
Task<Result> SendEmail(List<MailboxAddress> toMailList, string textBody);
/// <summary>
///
/// </summary>
/// <returns></returns>
Task<Result<List<SendDataDto>>> GetSendContent();
/// <summary>
/// 执行
/// </summary>
/// <returns></returns>
Task<Result> Execute();
}
}

View File

@@ -87,5 +87,12 @@ namespace WMS.Web.Domain.Infrastructure
/// </summary>
/// <returns></returns>
Task<InStockErpDetails> GetLastBillNo();
/// <summary>
///
/// </summary>
/// <param name="taskIds"></param>
/// <returns></returns>
Task<List<InStockTotalDetails>> GetInStockTotalDetails(List<int> taskIds);
}
}

View File

@@ -125,5 +125,11 @@ namespace WMS.Web.Domain.Infrastructure
/// <param name="isTransaction"></param>
/// <returns></returns>
Task<InStockTask> Update(InStockTask entity, bool isTransaction = true);
/// <summary>
/// 获取明细
/// </summary>
/// <returns></returns>
Task<List<InStockTaskDetails>> GetNotSendErpDetails();
}
}

View File

@@ -58,7 +58,7 @@ namespace WMS.Web.Domain.Mappers
//ERP-同步结果对象统一映射
CreateMap<ErpInStockResultDto, InStockTask>()
.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

View File

@@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace WMS.Web.Domain.Options
{
/// <summary>
/// 邮箱
/// </summary>
public class EmailOptions
{
/// <summary>
/// SMTP 服务器地址
/// </summary>
public string SmtpServer { get; set; }
/// <summary>
/// SMTP 服务器端口号
/// </summary>
public int SmtpPort { get; set; }
/// <summary>
/// 名称
/// </summary>
public string SenderName { get; set; }
/// <summary>
/// 主题
/// </summary>
public string SendTitle { get; set; }
/// <summary>
/// 发件人邮箱地址
/// </summary>
public string SenderEmail { get; set; }
/// <summary>
/// 发件人邮箱密码
/// </summary>
public string SenderEmailPwd { get; set; }
}
}

View File

@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace WMS.Web.Domain.Options
{
/// <summary>
/// 短信配置项
/// </summary>
public class SmsOptions
{
/// <summary>
/// 访问凭证ID
/// </summary>
public string AccessKeyId { get; set; }
/// <summary>
/// 访问秘钥
/// </summary>
public string AccessKeySecret { get; set; }
/// <summary>
/// 短信签名
/// </summary>
public string SignName { get; set; }
/// <summary>
/// 短信模板编号
/// </summary>
public string TemplateCode { get; set; }
}
}

View File

@@ -0,0 +1,63 @@
using 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
{
/// <summary>
/// 发送信息的定时任务
/// </summary>
public class SendQuartzJob : IJob
{
private readonly ILogger<SendQuartzJob> _logger;
private readonly IServiceScopeFactory _serviceScopeFactory;
private readonly ISendMessageService _sendMessageService;
public SendQuartzJob(ILogger<SendQuartzJob> logger,
IServiceScopeFactory serviceScopeFactory,
ISendMessageService sendMessageService)
{
this._logger = logger;
_serviceScopeFactory = serviceScopeFactory;
_sendMessageService = sendMessageService;
}
/// <summary>
/// 执行方法
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
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}");
}
}
}
}

View File

@@ -1,56 +0,0 @@
using 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
{
/// <summary>
/// 阿里云短息服务
/// </summary>
public class AliyunSmsService: IAliyunSmsService
{
private readonly ILogger<AliyunSmsService> _logger;
private readonly IAcsClient profile;
public AliyunSmsService(ILogger<AliyunSmsService> 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;
}
}
}

View File

@@ -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);
}

View File

@@ -0,0 +1,249 @@
using 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
{
/// <summary>
/// 阿里云短息服务
/// </summary>
public class SendMessageService: ISendMessageService
{
private readonly ILogger<SendMessageService> _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<SendMessageService> logger,
IOptions<EmailOptions> emailOptions,
IOptions<SmsOptions> 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);
}
/// <summary>
/// 短信发送
/// </summary>
/// <param name="phoneNumbers"></param>
/// <param name="content"></param>
/// <returns></returns>
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;
}
}
/// <summary>
/// 邮箱发送消息
/// </summary>
/// <param name="toMailList"></param>
/// <param name="textBody"></param>
/// <returns></returns>
public async Task<Result> SendEmail(List<MailboxAddress> 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")}"; // 设置邮件主题
// 创建邮件正文
BodyBuilder bodyBuilder = new BodyBuilder();
bodyBuilder.TextBody = textBody; // 设置纯文本内容
//bodyBuilder.HtmlBody = "<p>This is a <b>test</b> email sent from <i>.NETCore.MailKit</i>.lst</p>"; // 设置 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);
}
}
/// <summary>
/// 获取数据
/// </summary>
/// <returns></returns>
public async Task<Result<List<SendDataDto>>> GetSendContent()
{
//1.获取物料集合和组织集合和供应商的集合
var materials = new List<ErpMaterialDto>();
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<SendDataDto>();
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<List<SendDataDto>>.ReSuccess(sendDataList);
}
/// <summary>
/// 执行
/// </summary>
/// <returns></returns>
public async Task<Result> 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);
}
}
}
}

View File

@@ -20,6 +20,7 @@
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="3.1.10" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="5.0.0" />
<PackageReference Include="NETCore.MailKit" Version="2.1.0" />
<PackageReference Include="Pomelo.AspNetCore.TimedJob" Version="2.0.0-rtm-10046" />
<PackageReference Include="Qiniu" Version="8.0.0" />
<PackageReference Include="SkiaSharp" Version="2.80.3" />

View File

@@ -178,6 +178,13 @@ namespace WMS.Web.Repositories.DependencyInjection
Services.Configure<OpsOptions>(Configuration.GetSection("OpsOptions"));
Services.AddOptions<QiniuOptions>();
Services.Configure<QiniuOptions>(Configuration.GetSection("Qiniu"));
Services.AddOptions<EmailOptions>();
Services.Configure<EmailOptions>(Configuration.GetSection("EmailOptions"));
Services.AddOptions<SmsOptions>();
Services.Configure<SmsOptions>(Configuration.GetSection("SmsOptions"));
}
/// <summary>
@@ -296,6 +303,8 @@ namespace WMS.Web.Repositories.DependencyInjection
Services.AddTransient<IInventoryDetailsService, InventoryDetailsService>();
Services.AddTransient<IInStockTaskBoxService, InStockTaskBoxService>();
Services.AddTransient<IBoxMarkService, BoxMarkService>();
Services.AddTransient<ISendMessageService, SendMessageService>();
}
}

View File

@@ -420,5 +420,15 @@ namespace WMS.Web.Repositories
var entity = await _context.InStockErpDetails.OrderByDescending(x => x.Id).FirstOrDefaultAsync();
return entity;
}
/// <summary>
///
/// </summary>
/// <param name="taskIds"></param>
/// <returns></returns>
public async Task<List<InStockTotalDetails>> GetInStockTotalDetails(List<int> taskIds)
{
return await _context.InStockTotalDetails.Where(x => taskIds.Contains(x.TaskId)).ToListAsync();
}
}
}

View File

@@ -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);
}
/// <summary>
/// 获取明细
/// </summary>
/// <returns></returns>
public async Task<List<InStockTaskDetails>> 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();
}
}
}