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, IAndonInteractionService { private NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private OptionsSetting OptionsSetting; public AndonInteractionService(IOptions options) { OptionsSetting = options.Value; } /// /// 呼叫请求 /// /// /// 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().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); } /// /// 获取待响应的 记录 /// /// public List WaitingResponse() { return Context.Queryable().Where(it => it.Status == 1).ToList(); } private static List GetFaultDicts() { return DbScoped.SugarScope.CopyNew().Queryable().ToList(); } /// /// 监测超时发送邮件 /// /// public string[] MonitoringMails() { string[] result = null; // 获取异常字典 List andonFaults = GetFaultDicts(); // 获取超时记录 DateTime Overtime = DateTime.Now.AddHours(-1); // 获取没有被响应的故障 List AlarmRecord = Context.Queryable().Where(it => it.Status == 1).Where(it => it.StartTime <= Overtime).ToList(); if (AlarmRecord!=null&&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; } /// /// 发送邮件任务 /// /// /// 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; } } }