156 lines
6.5 KiB
C#
156 lines
6.5 KiB
C#
using Infrastructure.Attribute;
|
||
using Infrastructure.Model;
|
||
using Microsoft.AspNetCore.Mvc;
|
||
using Microsoft.Extensions.Options;
|
||
using Microsoft.Extensions.Primitives;
|
||
using SqlSugar.IOC;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using DOAN.Common;
|
||
using DOAN.Model.Dto;
|
||
using DOAN.Model.MES.andon;
|
||
using DOAN.Service.MES.andon.IService;
|
||
|
||
namespace DOAN.Service.MES.andon
|
||
{
|
||
[AppService(ServiceType = typeof(IAndonInteractionService), ServiceLifetime = LifeTime.Transient)]
|
||
public class AndonInteractionService : BaseService<AndonFaultRecord>, IAndonInteractionService
|
||
{
|
||
private NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
|
||
private OptionsSetting OptionsSetting;
|
||
|
||
public AndonInteractionService(IOptions<OptionsSetting> options) { OptionsSetting = options.Value; }
|
||
/// <summary>
|
||
/// 呼叫请求
|
||
/// </summary>
|
||
/// <param name="query"></param>
|
||
/// <returns></returns>
|
||
public int CallHandle(AndonFaultRecord record)
|
||
{
|
||
record.Id = SnowFlakeSingle.Instance.NextId().ToString();
|
||
record.StartTime = DateTime.Now;
|
||
record.Status = 1;
|
||
return Context.Insertable(record).ExecuteCommand();
|
||
}
|
||
public int SignIn(AndonFaultRecord record)
|
||
{
|
||
record.StartTime= Context.Queryable<AndonFaultRecord>().Where(it => it.Id == record.Id).Select(it=>it.StartTime).First();
|
||
|
||
record.EndTime = DateTime.Now;
|
||
|
||
TimeSpan timeDifference = record.EndTime.Value - record.StartTime.Value;
|
||
|
||
record.Duration = Math.Round((decimal)timeDifference.TotalMinutes, 2);
|
||
record.Status = 2;
|
||
return Update(record, true);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取待响应的 记录
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public List<AndonFaultRecord> WaitingResponse()
|
||
{
|
||
return Context.Queryable<AndonFaultRecord>().Where(it => it.Status == 1).ToList();
|
||
}
|
||
|
||
|
||
private static List<AndonFaultDict> GetFaultDicts()
|
||
{
|
||
return DbScoped.SugarScope.CopyNew().Queryable<AndonFaultDict>().ToList();
|
||
}
|
||
/// <summary>
|
||
/// 监测超时发送邮件
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public string[] MonitoringMails()
|
||
{
|
||
string[] result = null;
|
||
// 获取异常字典
|
||
List<AndonFaultDict> andonFaults = GetFaultDicts();
|
||
// 获取超时记录
|
||
DateTime Overtime = DateTime.Now.AddHours(-1);
|
||
// 获取没有被响应的故障
|
||
List<AndonFaultRecord> AlarmRecord = Context.Queryable<AndonFaultRecord>().Where(it => it.Status == 1).Where(it => it.StartTime <= Overtime).ToList();
|
||
|
||
if (AlarmRecord.Count > 0 && andonFaults.Count > 0)
|
||
{
|
||
result = new string[AlarmRecord.Count];
|
||
foreach (var alarm in AlarmRecord)
|
||
{
|
||
|
||
foreach (var fault in andonFaults)
|
||
{
|
||
|
||
if (alarm.FaultDict == fault.Name)
|
||
{
|
||
double overSpan = Math.Round((DateTime.Now - alarm.StartTime.Value).TotalHours, 2);
|
||
SendEmailDto sendEmailVo = new SendEmailDto();
|
||
sendEmailVo.Subject = "上海干巷总装车间 Andon [报警升级]通知";
|
||
// 邮箱责任
|
||
sendEmailVo.ToUser = fault.Email ?? "qianhao.xu@doan-tech.com";
|
||
StringBuilder msg = new StringBuilder();
|
||
msg.Append($"Dear [{fault.Director}]经理:");
|
||
msg.Append("\n");
|
||
msg.Append("\n");
|
||
msg.Append($"[{alarm.LineCode}]产线发生[{alarm.FaultDict}]类型异常, [{alarm.AskPerson}]报警人 在{alarm.StartTime.Value.ToString("yyyy-MM-dd HH:mm:ss")}时间发起报警,已经超过{overSpan}小时未处理,请立刻到现场扫码签到并处理异常,报警内容如下:\n");
|
||
msg.Append("\n");
|
||
msg.Append($"{alarm.FaultContext ?? "[无报警内容]"}。");
|
||
msg.Append("\n");
|
||
msg.Append("\n");
|
||
msg.Append("\n");
|
||
msg.Append($"Andon系统将每10分钟发送一次邮件,直至[{alarm.FaultDict}]类型异常,被签到并处理!");
|
||
msg.Append("\n");
|
||
msg.Append("\n");
|
||
msg.Append("\n");
|
||
msg.Append("如果邮件中有任务不清楚的地方或者需要我们提供任何帮助,请联系苏州道安自动化有限公司IT部门,邮件地址为qianhao.xu@doan-tech.com\n");
|
||
msg.Append($"故障id {alarm.Id}");
|
||
sendEmailVo.Content = msg.ToString();
|
||
sendEmailVo.SendMe = true;
|
||
sendEmailVo.AddTime = DateTime.Now;
|
||
result[AlarmRecord.IndexOf(alarm)] = SendEmail(sendEmailVo);
|
||
continue;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
return result;
|
||
|
||
}
|
||
/// <summary>
|
||
/// 发送邮件任务
|
||
/// </summary>
|
||
/// <param name="sendEmailVo"></param>
|
||
/// <returns></returns>
|
||
private string SendEmail(SendEmailDto sendEmailVo)
|
||
{
|
||
if (sendEmailVo == null)
|
||
{
|
||
return "请求参数不完整";
|
||
}
|
||
if (string.IsNullOrEmpty(OptionsSetting.MailOptions.FromEmail) || string.IsNullOrEmpty(OptionsSetting.MailOptions.Password))
|
||
{
|
||
return "请配置邮箱信息";
|
||
}
|
||
|
||
MailHelper mailHelper = new();
|
||
|
||
string[] toUsers = sendEmailVo.ToUser.Split(",", StringSplitOptions.RemoveEmptyEntries);
|
||
if (sendEmailVo.SendMe)
|
||
{
|
||
toUsers.Append(mailHelper.FromEmail);
|
||
}
|
||
string result = mailHelper.SendMail(toUsers, sendEmailVo.Subject, sendEmailVo.Content, sendEmailVo.FileUrl, sendEmailVo.HtmlContent);
|
||
|
||
logger.Info($"发送邮件{JsonConvert.SerializeObject(sendEmailVo)}, 结果{result}");
|
||
|
||
return result;
|
||
}
|
||
}
|
||
}
|