358 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			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;
 | 
						|
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |