You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

163 lines
7.0 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Exceptions;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Dysmsapi.Model.V20170525;
using DSWeb.Common.DB;
using DSWeb.Common.Helper;
using log4net;
using MailKit.Net.Smtp;
using MimeKit;
using Newtonsoft.Json;
using Quartz;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
namespace DSWeb.Job.Common
{
/// <summary>
/// 大简云余额变动监控提醒
/// </summary>
public class AlertMinValueJob : IJob
{
private static DateTime LastCheckTime = DateTime.Now;
private static String product = "Dysmsapi";//短信API产品名称
private static String domain = "dysmsapi.aliyuncs.com";//短信API产品域名
private static String accessId = "LTAILD56g1iYWp9A";
private static String accessSecret = "YyBCXDVqj3SJF5TPR3zct02wzFlDrg";
private static String regionIdForPop = "cn-hangzhou";
private CommonDataContext commonDataContext = new CommonDataContext();
private ILog logger = LogManager.GetLogger("AlertMinValueJob");
public void Execute(IJobExecutionContext context)
{
var cfg = commonDataContext.ConfigDatas.AsNoTracking().FirstOrDefault(c => c.Module == ConfigData.ModuleSystem && c.Category == ConfigData.CateAlertMinValue);
if (cfg == null)
{
logger.Error($"平台余额不足提醒未配置");
return;
}
var jobj = JsonConvert.DeserializeAnonymousType(cfg.JsonData, new
{
AlertDelay = 0,
AlertStartHour = 0,
AlertStartMinute = 0,
AlertEndHour = 0,
AlertEndMinute = 0,
AlertMinMon = false,
AlertMinTue = false,
AlertMinWen = false,
AlertMinThu = false,
AlertMinFri = false,
AlertMinSat = false,
AlertMinSum = false
});
if (LastCheckTime.AddMinutes(jobj.AlertDelay) > DateTime.Now)
{
logger.Debug($"还未到轮训时间:{LastCheckTime},配置为{jobj.AlertDelay}分钟");
return;
}
var dt1 = DateTime.Today.AddHours(jobj.AlertStartHour).AddMinutes(jobj.AlertStartMinute);
var dt2 = DateTime.Today.AddHours(jobj.AlertEndHour).AddMinutes(jobj.AlertEndMinute);
if (DateTime.Now < dt1 || DateTime.Now > dt2)
{
logger.Debug($"不在配置的轮训时间内:{DateTime.Now},配置为{jobj.AlertStartHour}时{jobj.AlertStartMinute}分到{jobj.AlertEndHour}时{jobj.AlertEndMinute}分");
return;
}
if ((DateTime.Today.DayOfWeek == DayOfWeek.Monday && !jobj.AlertMinMon)
|| (DateTime.Today.DayOfWeek == DayOfWeek.Tuesday && !jobj.AlertMinTue)
|| (DateTime.Today.DayOfWeek == DayOfWeek.Wednesday && !jobj.AlertMinWen)
|| (DateTime.Today.DayOfWeek == DayOfWeek.Thursday && !jobj.AlertMinThu)
|| (DateTime.Today.DayOfWeek == DayOfWeek.Friday && !jobj.AlertMinFri)
|| (DateTime.Today.DayOfWeek == DayOfWeek.Saturday && !jobj.AlertMinSat)
|| (DateTime.Today.DayOfWeek == DayOfWeek.Sunday && !jobj.AlertMinSum))
{
logger.Debug($"不在配置的轮训周次内:{DateTime.Today.DayOfWeek.ToString()},配置为{jobj.AlertMinMon} {jobj.AlertMinTue} {jobj.AlertMinWen} {jobj.AlertMinThu} {jobj.AlertMinFri} {jobj.AlertMinSat} {jobj.AlertMinSum}");
return;
}
var dt = LastCheckTime.ToString("yyyy-MM-dd HH:mm:ss");
var sql = $@"
select t1.COMNAME,t1.balance_0,comp.AlertMinValue,comp.CompId,ub.EMAIL1,ub.MOBILE,comp.MinValueSMS,comp.MinValueEmail,comp.MinValueEmailAddr from
(select COMNAME,balance_0,createtime from Cust_Balance_tiglog where (balance_0-balance)<0 and createtime>'{dt}') t1
join
(select COMNAME,max(createtime) createtime from Cust_Balance_tiglog where createtime>'{dt}' group by COMNAME) t2
on t1.COMNAME=t2.COMNAME and t1.createtime=t2.createtime
join company_new comp on t1.COMNAME=comp.CompName
join user_baseinfo ub on ub.USERID=comp.AdminUser
where t1.balance_0<comp.AlertMinValue";
logger.Debug($"执行轮训查询sql{sql}");
var list = commonDataContext.Database.SqlQuery<AlertMinValueResultData>(sql).ToList();
foreach (var item in list)
{
if (item.MinValueEmail)
{
MailHelper.SendMailService($"大简云平台余额不足提醒", $"TO:{item.COMNAME}<br/>您当前的大简云平台余额为:{item.balance_0}元,已低于设定的提醒额度,请及时安排充值,以免影响正常使用。<br><br>————此邮件为大简云平台自动发送,请勿回复", item.MinValueEmailAddr);
}
if (item.MinValueSMS)
{
SendSMS(item.MOBILE, item.COMNAME, item.balance_0);
}
}
LastCheckTime = DateTime.Now;
}
public void SendSMS(string phoneNum, string custname, decimal balance)
{
IClientProfile profile = DefaultProfile.GetProfile(regionIdForPop, accessId, accessSecret);
DefaultProfile.AddEndpoint(regionIdForPop, regionIdForPop, product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
SendSmsRequest request = new SendSmsRequest();
try
{
request.PhoneNumbers = phoneNum;
request.SignName = "大简云工作平台";
request.TemplateCode = "SMS_225986095";
request.TemplateParam = JsonConvert.SerializeObject(new
{
custname = custname,
balance = balance
});
request.OutId = "001";
logger.Debug($"平台余额不足提醒短信发送给{phoneNum},内容{request.TemplateParam}");
SendSmsResponse sendSmsResponse = acsClient.GetAcsResponse(request);
logger.Debug($"调用短信接口返回:{JsonConvert.SerializeObject(sendSmsResponse)}");
}
catch (ServerException e)
{
logger.Error(e.Message);
logger.Error(e.StackTrace);
}
catch (ClientException e)
{
logger.Error(e.Message);
logger.Error(e.StackTrace);
}
}
}
public class AlertMinValueResultData
{
public string COMNAME { get; set; }
public decimal balance_0 { get; set; }
public int AlertMinValue { get; set; }
public string CompId { get; set; }
public string EMAIL1 { get; set; }
public string MOBILE { get; set; }
public bool MinValueSMS { get; set; }
public bool MinValueEmail { get; set; }
public string MinValueEmailAddr { get; set; }
}
}