2024-06-20 13:37:46 +08:00
|
|
|
|
using Infrastructure.Attribute;
|
2024-06-21 14:10:17 +08:00
|
|
|
|
using Infrastructure.Model;
|
|
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
|
|
using Microsoft.Extensions.Options;
|
|
|
|
|
|
using Microsoft.Extensions.Primitives;
|
|
|
|
|
|
using SqlSugar.IOC;
|
2024-06-20 13:37:46 +08:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
using System.Threading.Tasks;
|
2024-07-01 16:04:10 +08:00
|
|
|
|
using DOAN.Common;
|
|
|
|
|
|
using DOAN.Model.Dto;
|
|
|
|
|
|
using DOAN.Model.MES.andon;
|
|
|
|
|
|
using DOAN.Service.MES.andon.IService;
|
2024-06-20 13:37:46 +08:00
|
|
|
|
|
2024-07-01 16:04:10 +08:00
|
|
|
|
namespace DOAN.Service.MES.andon
|
2024-06-20 13:37:46 +08:00
|
|
|
|
{
|
|
|
|
|
|
[AppService(ServiceType = typeof(IAndonInteractionService), ServiceLifetime = LifeTime.Transient)]
|
|
|
|
|
|
public class AndonInteractionService : BaseService<AndonFaultRecord>, IAndonInteractionService
|
|
|
|
|
|
{
|
2024-06-21 14:10:17 +08:00
|
|
|
|
private NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
|
|
|
|
|
|
private OptionsSetting OptionsSetting;
|
|
|
|
|
|
|
|
|
|
|
|
public AndonInteractionService(IOptions<OptionsSetting> options) { OptionsSetting = options.Value; }
|
2024-06-20 13:37:46 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 呼叫请求
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="query"></param>
|
|
|
|
|
|
/// <returns></returns>
|
2024-06-20 15:47:00 +08:00
|
|
|
|
public int CallHandle(AndonFaultRecord record)
|
2024-06-20 13:37:46 +08:00
|
|
|
|
{
|
2024-06-20 15:47:00 +08:00
|
|
|
|
record.Id = SnowFlakeSingle.Instance.NextId().ToString();
|
|
|
|
|
|
record.StartTime = DateTime.Now;
|
|
|
|
|
|
record.Status = 1;
|
|
|
|
|
|
return Context.Insertable(record).ExecuteCommand();
|
|
|
|
|
|
}
|
|
|
|
|
|
public int SignIn(AndonFaultRecord record)
|
|
|
|
|
|
{
|
2024-07-01 17:30:47 +08:00
|
|
|
|
record.StartTime= Context.Queryable<AndonFaultRecord>().Where(it => it.Id == record.Id).Select(it=>it.StartTime).First();
|
|
|
|
|
|
|
2024-06-20 17:17:38 +08:00
|
|
|
|
record.EndTime = DateTime.Now;
|
2024-06-21 14:10:17 +08:00
|
|
|
|
|
2024-07-01 17:30:47 +08:00
|
|
|
|
TimeSpan timeDifference = record.EndTime.Value - record.StartTime.Value;
|
2024-07-06 08:38:52 +08:00
|
|
|
|
|
|
|
|
|
|
record.Duration = Math.Round((decimal)timeDifference.TotalMinutes, 2);
|
2024-06-20 17:17:38 +08:00
|
|
|
|
record.Status = 2;
|
2024-06-20 15:47:00 +08:00
|
|
|
|
return Update(record, true);
|
|
|
|
|
|
}
|
2024-06-21 14:10:17 +08:00
|
|
|
|
|
2024-06-20 15:47:00 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取待响应的 记录
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public List<AndonFaultRecord> WaitingResponse()
|
|
|
|
|
|
{
|
2024-06-21 14:10:17 +08:00
|
|
|
|
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>
|
2024-07-01 17:30:47 +08:00
|
|
|
|
public string[] MonitoringMails()
|
2024-06-21 14:10:17 +08:00
|
|
|
|
{
|
2024-07-01 17:30:47 +08:00
|
|
|
|
string[] result = null;
|
2024-06-21 14:10:17 +08:00
|
|
|
|
// 获取异常字典
|
|
|
|
|
|
List<AndonFaultDict> andonFaults = GetFaultDicts();
|
|
|
|
|
|
// 获取超时记录
|
|
|
|
|
|
DateTime Overtime = DateTime.Now.AddHours(-1);
|
2024-07-12 15:17:33 +08:00
|
|
|
|
// 获取没有被响应的故障
|
2024-06-21 14:10:17 +08:00
|
|
|
|
List<AndonFaultRecord> AlarmRecord = Context.Queryable<AndonFaultRecord>().Where(it => it.Status == 1).Where(it => it.StartTime <= Overtime).ToList();
|
|
|
|
|
|
|
2024-07-12 16:33:09 +08:00
|
|
|
|
if (AlarmRecord!=null&&AlarmRecord.Count > 0 && andonFaults.Count > 0)
|
2024-06-21 14:10:17 +08:00
|
|
|
|
{
|
|
|
|
|
|
result = new string[AlarmRecord.Count];
|
|
|
|
|
|
foreach (var alarm in AlarmRecord)
|
|
|
|
|
|
{
|
2024-07-01 17:30:47 +08:00
|
|
|
|
|
2024-06-21 14:10:17 +08:00
|
|
|
|
foreach (var fault in andonFaults)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
if (alarm.FaultDict == fault.Name)
|
|
|
|
|
|
{
|
2024-07-01 17:30:47 +08:00
|
|
|
|
double overSpan = Math.Round((DateTime.Now - alarm.StartTime.Value).TotalHours, 2);
|
2024-06-21 14:10:17 +08:00
|
|
|
|
SendEmailDto sendEmailVo = new SendEmailDto();
|
|
|
|
|
|
sendEmailVo.Subject = "上海干巷总装车间 Andon [报警升级]通知";
|
|
|
|
|
|
// 邮箱责任
|
2024-07-01 17:30:47 +08:00
|
|
|
|
sendEmailVo.ToUser = fault.Email ?? "qianhao.xu@doan-tech.com";
|
|
|
|
|
|
StringBuilder msg = new StringBuilder();
|
2024-06-21 14:10:17 +08:00
|
|
|
|
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");
|
2024-07-01 17:30:47 +08:00
|
|
|
|
msg.Append($"{alarm.FaultContext ?? "[无报警内容]"}。");
|
2024-06-21 14:10:17 +08:00
|
|
|
|
msg.Append("\n");
|
|
|
|
|
|
msg.Append("\n");
|
|
|
|
|
|
msg.Append("\n");
|
|
|
|
|
|
msg.Append($"Andon系统将每10分钟发送一次邮件,直至[{alarm.FaultDict}]类型异常,被签到并处理!");
|
|
|
|
|
|
msg.Append("\n");
|
|
|
|
|
|
msg.Append("\n");
|
|
|
|
|
|
msg.Append("\n");
|
2024-07-12 15:17:33 +08:00
|
|
|
|
msg.Append("如果邮件中有任务不清楚的地方或者需要我们提供任何帮助,请联系苏州道安自动化有限公司IT部门,邮件地址为qianhao.xu@doan-tech.com\n");
|
|
|
|
|
|
msg.Append($"故障id {alarm.Id}");
|
2024-06-21 14:10:17 +08:00
|
|
|
|
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;
|
2024-06-20 13:37:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|