d_sms_service/APT.BaseData.Services/Services/FM/FMNoticeService.cs
2024-10-28 13:45:58 +08:00

358 lines
14 KiB
C#

using APT.Infrastructure.Core;
using APT.BaseData.Domain.ApiModel;
using APT.BaseData.Domain.Entities.FM;
using APT.BaseData.Domain.IServices.FM;
using APT.Utility;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Collections.Immutable;
using APT.BaseData.Domain.Entities;
using APT.BaseData.Domain.Enums;
using APT.Infrastructure.Api;
using APT.MS.Domain.Entities.PF;
using APT.BaseData.Domain.Dtos;
using Castle.Core.Internal;
using APT.MS.Domain.Entities.SC;
using TencentCloud.Sms.V20210111.Models;
namespace APT.BaseData.Services.Services.FM
{
public partial class FMNoticeService : CommonService, IFMNoticeService
{
public FMNoticeService(IRepository repository) : base(repository)
{
}
/// <summary>
/// 发送短信
/// </summary>
/// <param name="noticeType">现在只支持会议</param>
/// <param name="DATA_ID"></param>
public void SendMsg(NOTICETYPE noticeType, Guid? DATA_ID, Guid? KEY = null, T_FM_SYNC_TASK task = null)
{
var mtConfig = GetEntity<T_SC_MT_CONFIG>(e => e.IS_SENDMSG);
if (mtConfig == null)
{
return;
}
Expression<Func<T_FM_NOTICE, bool>> expression = e => e.NOTICE_STATUS == FMNoticeStatus.;
//if (noticeType != null && noticeType.HasValue)
//{
// expression = expression.And(e => e.NOTICETYPE == noticeType.Value);
//}
expression = expression.And(e => e.NOTICETYPE == noticeType);
if (DATA_ID != null && DATA_ID.HasValue)
{
expression = expression.And(e => e.DATA_ID == DATA_ID.Value);
}
if (KEY != null && KEY.HasValue)
{
expression = expression.And(e => e.KEY == KEY.Value);
}
var listNoticeSend = GetEntities(expression);//&&e.NOTICETYPE==NOTICETYPE.Meeting 以后放开此限制
if (listNoticeSend == null || !listNoticeSend.Any())
return;
//数据完善
// 如果没有手机号码 修改为发送失败
//短信发送
// 发送次数 ++
// 发送成功修改状态
// 如果发送失败 判断次数 如果第三次(最后一次) 修改为 发送失败 记录失败原因
#region
var noTEL = listNoticeSend.Where(e => e.TEL == null || e.TEL.Length < 1);
T_FM_USER FMCheck = null;
if (noTEL != null && noTEL.Any())
{
var listUserID = noTEL.Where(e => e.USER_ID.HasValue).Select(e => e.USER_ID);
if (listUserID != null && listUserID.Any())
{
var users = GetEntities<T_FM_USER>(e => listUserID.Contains(e.ID));
foreach (var item in listNoticeSend)
{
if (string.IsNullOrEmpty(item.TEL))
{
FMCheck = users.FirstOrDefault(e => e.ID == item.USER_ID);
if (FMCheck == null)
{
item.ERRORMSG = "获取人员信息失败";
item.NOTICE_STATUS = FMNoticeStatus.;
}
else if (string.IsNullOrEmpty(FMCheck.PHONE))
{
item.ERRORMSG = "缺少手机号码";
item.NOTICE_STATUS = FMNoticeStatus.;
}
else if (FMCheck.ENABLE_STATUS == 1)
{
item.ERRORMSG = "该用户已停用";
item.NOTICE_STATUS = FMNoticeStatus.;
}
else
{
item.TEL = FMCheck.PHONE;
}
}
}
}
}
#endregion
#region ,
DateTime dtNow = DateTime.Now;
foreach (var item in listNoticeSend)
{
if (item.ENDDT.HasValue && item.ENDDT < dtNow)
{
item.ERRORMSG = "结束时间小于当前时间不发送";
item.NOTICE_STATUS = FMNoticeStatus.;
}
}
#endregion
#region
foreach (var item in listNoticeSend)
{
if (item.NOTICE_STATUS == FMNoticeStatus. && item.TEL.Length < 11)
{
item.ERRORMSG = "手机号码错误";
item.NOTICE_STATUS = FMNoticeStatus.;
}
}
#endregion
#region
List<string> listPhone = new List<string>();
List<string> listTemplateParams = new List<string>();
//var listDataID = listNoticeSend.Select(e => e.DATA_ID).Distinct();
var lisKEY = listNoticeSend.Select(e => e.KEY).Distinct();
TencentSendSMS tencentSendSMS = new TencentSendSMS();
string[] phoneNumbers = null;
List<string> templates = null;
string TEMPLATE_ID = string.Empty;//短信模板
bool isSend = false;//是否发送成功
foreach (var item in lisKEY)
{
var listTemp = listNoticeSend.Where(e => e.KEY == item && e.NOTICE_STATUS == FMNoticeStatus.);
phoneNumbers = listTemp.Select(e => e.TEL).ToArray();
switch (noticeType)
{
case NOTICETYPE.Meeting:
//2个参数
foreach (var itemS in listTemp)
{
if (templates == null)
{
templates = new List<string>();
TEMPLATE_ID = itemS.TEMPLATE_ID;
templates.Add(itemS.TITLE);
templates.Add(itemS.ENDDT.Value.ToString("yyyy-MM-dd HH:mm"));
break;
}
}
break;
case NOTICETYPE.MeetingJD:
//2个参数
foreach (var itemS in listTemp)
{
if (templates == null)
{
templates = new List<string>();
TEMPLATE_ID = itemS.TEMPLATE_ID;
templates.AddRange(GetSplit(itemS.TITLE.Split('[')[0]));
templates.Add(itemS.ENDDT.Value.Year.ToString());
templates.Add(itemS.ENDDT.Value.Month.ToString("00"));
templates.Add(itemS.ENDDT.Value.Day.ToString("00"));
templates.Add(itemS.ENDDT.Value.Hour.ToString("00"));
templates.Add(itemS.ENDDT.Value.Minute.ToString("00"));
templates.Add(itemS.ENDDT.Value.Second.ToString("00"));
break;
}
}
break;
default:
break;
}
if (string.IsNullOrEmpty(TEMPLATE_ID) || phoneNumbers.Length < 1 || !templates.Any())
{
continue;
}
try
{
SendSmsResponse result = null;
if (noticeType == NOTICETYPE.Meeting)
{
result = tencentSendSMS.sendSMS(TEMPLATE_ID, phoneNumbers, templates.ToArray());
}
else if (noticeType == NOTICETYPE.MeetingJD)
{
//result = tencentSendSMS.sendSMSDCJD(TEMPLATE_ID, phoneNumbers, templates.ToArray());
}
if (result != null)
{
foreach (var itemResult in result.SendStatusSet)
{
foreach (var itemRN in listNoticeSend)
{
if (itemRN.KEY == item && itemRN.NOTICE_STATUS == FMNoticeStatus. && itemResult.PhoneNumber.EndsWith(itemRN.TEL))
{
itemRN.TRYCOUNT++;
if (itemResult.Code == "Ok")
{
isSend = true;
itemRN.NOTICE_STATUS = FMNoticeStatus.;
}
else if (itemRN.TRYCOUNT == 3)
{
//3次发送失败 记录信息
itemRN.NOTICE_STATUS = FMNoticeStatus.;
itemRN.ERRORMSG = itemResult.Message;
if (itemRN.ERRORMSG != null && itemRN.ERRORMSG.Length > 100)
{
itemRN.ERRORMSG = itemRN.ERRORMSG.Substring(0, 95);
}
}
break;
}
}
}
}
}
catch
{
//发送信息报错 例:腾讯云 服务器挂了
}
}
#endregion
#region
if (isSend)
{
UnifiedCommit(() =>
{
BantchSaveEntityNoCommit(listNoticeSend);//BantchUpdateEntityNoCommit(listNoticeSend); 得升级 不然报错
if (task != null)
{
UpdateEntityNoCommit(task);
}
});
}
else
{
var listChange = listNoticeSend.Where(e => e.NOTICE_STATUS == FMNoticeStatus.);
if (listChange != null && listChange.Any())
{
foreach (var item in listChange)
{
item.TRYCOUNT++;
}
BantchSaveEntityNoCommit(listChange); //BantchUpdateEntityNoCommit(listChange);
if (task != null)
{
UpdateEntityNoCommit(task);
}
}
}
#endregion
}
/// <summary>
/// 获取会议模板ID
/// </summary>
/// <param name="ORG_ID"></param>
/// <returns></returns>
public string GetTEMPLATE_ID(Guid ORG_ID)
{
if (ORG_ID == new Guid("B043B28B-BBC3-C452-6052-4FBA1457ABFA"))
{
return NOTICETYPE.Meeting.GetDescription();
}
else if (ORG_ID == new Guid("8B3C41AA-51B1-7CE9-1879-248A038C1B5C"))
{
return NOTICETYPE.MeetingJD.GetDescription();
}
return "";
}
/// <summary>
/// 文本分块(发送信息时用)
/// </summary>
/// <param name="title"></param>
/// <param name="piece"></param>
/// <param name="splitMax"></param>
/// <returns></returns>
private List<string> GetSplit(string title, int piece = 3, int splitMax = 6)
{
int titleLength = title.Length;
List<string> listResult = new List<string>();
if (titleLength == piece)
{
//每个字一份
for (int i = 0; i < piece; i++)
{
listResult.Add(title.Substring(i, 1));
}
}
else if (titleLength >= splitMax * piece)
{
//按最长给 多的也不给
for (int i = 0; i < piece; i++)
{
listResult.Add(title.Substring(i * splitMax, splitMax));
}
}
else
{
int remain = titleLength % piece;
int Per = titleLength / piece;
//分割长度
List<int> listLength = new List<int>();
if (remain == 0)
{
for (int i = 0; i < piece; i++)
listLength.Add(Per);
}
else
{
for (int i = 0; i < piece; i++)
{
remain--;
if (remain < 0)
listLength.Add(Per);
else
listLength.Add(Per + 1);
}
}
for (int i = 0; i < piece; i++)
{
listResult.Add(title.Substring(0, listLength[i]));
title = title.Substring(listLength[i]);
}
}
return listResult;
}
}
}