123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- using DotNetCore.CAP;
- using Hotline.Orders;
- using Hotline.Share.Dtos.FlowEngine;
- using Hotline.Share.Dtos.Push;
- using Hotline.Share.Dtos.Push.FWMessage;
- using Hotline.Share.Enums.Push;
- using MapsterMapper;
- using MediatR;
- using Microsoft.Extensions.Configuration;
- using System.Text.RegularExpressions;
- using XF.Domain.Dependency;
- using XF.Domain.Exceptions;
- using XF.Domain.Repository;
- namespace Hotline.Push.FWMessage;
- /// <summary>
- ///
- /// </summary>
- public class PushDomainService : IPushDomainService, IScopeDependency
- {
- #region 注入
- private readonly IRepository<Message> _messageRepository;
- private readonly IMapper _mapper;
- private readonly IHttpClientFactory _httpClientFactory;
- private readonly IConfiguration _config;
- private readonly SmsAccountInfo? accountInfo = null;
- private readonly IMediator _mediator;
- private readonly IRepository<MessageTemplate> _messageTemplateRepository;
- private readonly ICapPublisher _capPublisher;
- /// <summary>
- ///
- /// </summary>
- /// <param name="messageRepository"></param>
- /// <param name="httpClientFactory"></param>
- /// <param name="mapper"></param>
- /// <param name="config"></param>
- /// <param name="mediator"></param>
- /// <param name="cacheWaitSendId"></param>
- /// <param name="messageTemplateRepository"></param>
- /// <param name="capPublisher"></param>
- public PushDomainService(IRepository<Message> messageRepository, IHttpClientFactory httpClientFactory
- , IMapper mapper, IConfiguration config, IMediator mediator,
- IRepository<MessageTemplate> messageTemplateRepository, ICapPublisher capPublisher)
- {
- _messageRepository = messageRepository;
- _httpClientFactory = httpClientFactory;
- _mapper = mapper;
- _config = config;
- accountInfo = _config.GetSection("SmsAccountInfo").Get<SmsAccountInfo>();
- _mediator = mediator;
- _messageTemplateRepository = messageTemplateRepository;
- _capPublisher = capPublisher;
- }
- #endregion
- /// <summary>
- /// 短信发送
- /// </summary>
- /// <param name="messageDto"></param>
- /// <param name="cancellation"></param>
- /// <returns></returns>
- public async Task PushMsgAsync(MessageDto messageDto, CancellationToken cancellation)
- {
- if (messageDto == null)
- throw UserFriendlyException.SameMessage("消息不能为空!");
- if (string.IsNullOrEmpty(messageDto.TemplateCode) && string.IsNullOrEmpty(messageDto.Content))
- throw UserFriendlyException.SameMessage("模板和内容不能同时为空!");
- #region 替换模板内容
- //如果模板为空,参数为空则直接用短信内容
- if (!string.IsNullOrEmpty(messageDto.TemplateCode))
- {
- //查询模板信息
- var messageTemplate = await _messageTemplateRepository.GetAsync(p => p.Code == messageDto.TemplateCode, cancellation);
- if (messageTemplate == null || string.IsNullOrEmpty(messageTemplate.Content))
- throw UserFriendlyException.SameMessage("未找到模板短信!");
- string Template = messageTemplate.Content;
- if (messageDto.Params != null && messageDto.Params.Count > 0)
- {
- //正则查询模板中需要替换的内容
- Regex regex = new(@"\{[a-zA-Z0-9]{1,}\}");
- var matches = regex.Matches(Template);
- if (matches != null && matches.Count != messageDto.Params.Count)
- //参数与需要替换的字符数不匹配
- throw UserFriendlyException.SameMessage("模板需要参数与实际传递参数个数不匹配!");
- //reason = "模板需要参数与实际传递参数个数不匹配!";
- //根据正则查询出来的匹配项替换内容
- for (int i = 0; i < matches.Count; i++)
- Template = Template.Replace(matches[i].ToString(), messageDto.Params[i]);
- }
- messageDto.Content = Template;
- }
- #endregion
- var message = _mapper.Map<Message>(messageDto);
- var id = await _messageRepository.AddAsync(message);//写入本地数据库
- PushMessageDto pushMessage = new()
- {
- ClientId = "Hotline",
- ExternalId = id,
- Content = message.Content,
- Remark = message.Remark,
- Name = message.Name,
- TelNumber = message.TelNumber
- };
- await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.SendSms, pushMessage, cancellationToken: cancellation);
- }
- /// <summary>
- /// 修改短信推送状态
- /// </summary>
- /// <param name="dto"></param>
- /// <param name="cancellation"></param>
- /// <returns></returns>
- public async Task PushMsgUpdateStateAsync(PushReceiveMessageDto dto, CancellationToken cancellation)
- {
- var data = await _messageRepository.GetAsync(p => p.Id == dto.ExternalId, cancellation);
- if (data != null)
- {
- if (dto.Type == "0")
- {
- if (dto.SendState == ESendState.Sending)
- {
- data.SmsWaitSendingId = dto.SmsWaitSendingId;
- data.SendState = ESendState.Sending;
- data.Status = EPushStatus.Success;
- }
- else
- data.Status = EPushStatus.Failed;
- }
- else if (dto.Type == "1")
- {
- data.SendTime = Convert.ToDateTime(dto.SendTime);
- data.SendState = dto.SendState;
- data.MsgCount = dto.MsgCount;
- data.SmsSendingCompletedId = dto.SmsSendingCompletedId;
- }
- else if (dto.Type == "2")
- {
- data.IsSmsReply = dto.IsSmsReply;
- data.SmsReplyTime = Convert.ToDateTime(dto.SmsReplyTime);
- data.SmsReplyContent = dto.SmsReplyContent;
- }
- await _messageRepository.UpdateAsync(data, cancellation);
- }
- }
- }
|