zhuangpei-mesbackend/DOAN.Service/MES/andon/AndonInteractionService.cs
qianhao.xu 575c37a59c 提交
2024-07-12 15:17:33 +08:00

156 lines
6.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}
}