using Furion.DependencyInjection; using Furion.DynamicApiController; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Myshipping.Application.Entity; using Myshipping.Application.Service.TaskManagePlat.Interface; using Myshipping.Core.Service; using Myshipping.Core; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Furion.FriendlyException; using Myshipping.Core.Entity; using Furion.JsonSerialization; using Furion.RemoteRequest.Extensions; using Newtonsoft.Json; using System.IO; using System.Net.Http; using Myshipping.Core.Helper; using NPOI.SS.Formula.Functions; using System.Reflection.Metadata; using Furion; using Myshipping.Application.Helper; namespace Myshipping.Application { /// /// 重要提醒任务 /// [ApiDescriptionSettings("Application", Name = "TaskCautionNotice", Order = 10)] public class TaskCautionNoticeService : ITaskCautionNoticeService, IDynamicApiController, ITransient { private readonly ISysCacheService _cache; private readonly ILogger _logger; private readonly SqlSugarRepository _taskBaseRepository; private readonly SqlSugarRepository _taskCautionNoticeInfoRepository; private readonly SqlSugarRepository _taskCautionNoticeDetailInfoRepository; private readonly SqlSugarRepository _djyUserMailAccount; public TaskCautionNoticeService(ISysCacheService cache, ILogger logger, SqlSugarRepository taskBaseRepository, SqlSugarRepository taskCautionNoticeInfoRepository, SqlSugarRepository taskCautionNoticeDetailInfoRepository, SqlSugarRepository djyUserMailAccount) { _cache = cache; _logger = logger; _taskBaseRepository = taskBaseRepository; _taskCautionNoticeInfoRepository = taskCautionNoticeInfoRepository; _taskCautionNoticeDetailInfoRepository = taskCautionNoticeDetailInfoRepository; _djyUserMailAccount = djyUserMailAccount; } #region 获取重要提醒任务详情 /// /// 获取重要提醒任务详情 /// /// 重要提醒任务主键 /// 返回详情 [HttpGet("/TaskCautionNotice/GetInfoByTaskId")] public async Task GetInfoByTaskId(string taskPkId) { TaskCautionNoticeShowDto dto = new TaskCautionNoticeShowDto(); var taskBase = _taskBaseRepository.AsQueryable().First(a => a.PK_ID == taskPkId); if (taskBase == null) throw Oops.Oh($"任务主键{taskPkId}无法获取业务信息"); var noticeInfo = _taskCautionNoticeInfoRepository.AsQueryable().First(a => a.TASK_ID == taskBase.PK_ID); if (noticeInfo == null) throw Oops.Oh($"重要提醒主键{taskPkId}无法获取业务信息"); CautionNoticeTaskEnum cautionNoticeEnum = (CautionNoticeTaskEnum)System.Enum.Parse(typeof(CautionNoticeTaskEnum), noticeInfo.CAUTION_NOTICE_TYPE); dto = new TaskCautionNoticeShowDto { PKId = noticeInfo.PK_ID, taskPKId = noticeInfo.TASK_ID, carrier = noticeInfo.CARRIER, bookingId = noticeInfo.BOOKING_ID, mblNo = noticeInfo.MBL_NO, createTime = noticeInfo.CreatedTime, cautionNoticeType = noticeInfo.CAUTION_NOTICE_TYPE, cautionNoticeTypeName = cautionNoticeEnum.GetDescription(), origVal = noticeInfo.OLD_VAL, newVal = noticeInfo.NEW_VAL }; return dto; } #endregion #region 触发推送消息 /// /// 触发推送消息 /// /// 重要提醒任务主键 /// 租户ID /// 返回回执 [HttpGet("/TaskCautionNotice/TriggerSendNotice")] public async Task TriggerSendNotice(string taskPKId, long tenantId) { TaskManageOrderResultDto result = new TaskManageOrderResultDto(); try { TaskDraftShowDto dto = new TaskDraftShowDto(); var taskBase = _taskBaseRepository.AsQueryable().Filter(null, true).First(a => a.PK_ID == taskPKId && a.IsDeleted == false && a.TenantId == tenantId); if (taskBase == null) throw Oops.Oh($"任务主键{taskPKId}无法获取业务信息"); var noticeInfo = _taskCautionNoticeInfoRepository.AsQueryable().Filter(null, true).First(a => a.TASK_ID == taskBase.PK_ID && a.IsDeleted == false && a.TenantId == tenantId); var list = _taskCautionNoticeDetailInfoRepository.AsQueryable().Filter(null, true) .Where(a => a.P_ID == noticeInfo.PK_ID && a.IsDeleted == false && a.TenantId == tenantId).ToList(); TaskBusiTypeEnum currEnum = (TaskBusiTypeEnum)System.Enum.Parse(typeof(TaskBusiTypeEnum), taskBase.TASK_TYPE); CautionNoticeTaskEnum cautionNoticeEnum = (CautionNoticeTaskEnum)System.Enum.Parse(typeof(CautionNoticeTaskEnum), noticeInfo.CAUTION_NOTICE_TYPE); if (list.Count > 0) { list.ForEach(a => { if (a.NOTIFY_METHOD == CautionNoticeMethodEnum.Email.ToString()) { if (!string.IsNullOrWhiteSpace(a.NOTIFY_EMAIL)) { //提取当前公共邮箱的配置 DjyUserMailAccount publicMailAccount = _djyUserMailAccount.AsQueryable().Filter(null, true).First(x => x.TenantId == tenantId && x.ShowName == "PublicSend" && x.SmtpPort > 0 && x.SmtpServer != null && x.SmtpServer != ""); if (publicMailAccount == null) { //throw Oops.Oh($"提取公共邮箱配置失败,请在用户邮箱账号管理增加配置显示名为PublicSend或者配置个人邮箱"); _logger.LogInformation($"准备邮件通知通知给 uid={a.NOTIFY_USER_NAME} name={a.NOTIFY_USER_NAME},但是没有配置发送邮箱"); new EmailNoticeHelper().SendEmailNotice($"MBLNO={noticeInfo.MBL_NO} {cautionNoticeEnum.GetDescription()} 需要给推送邮件但是没有配公司邮箱", $"MBLNO={noticeInfo.MBL_NO} {cautionNoticeEnum.GetDescription()} 需要给推送邮件但是没有配公司邮箱", App.Configuration["EmailNoticeDefaultUser"].GetUserEmailList()); } EmailApiUserDefinedDto emailApiUserDefinedDto = new EmailApiUserDefinedDto { SendTo = a.NOTIFY_EMAIL, Title = $"提单号:{noticeInfo.MBL_NO} {cautionNoticeEnum.GetDescription()}", Body = $"提单号:{noticeInfo.MBL_NO} {cautionNoticeEnum.GetDescription()} {noticeInfo.NOTIFY_CONTENT}", Account = publicMailAccount.MailAccount?.Trim(), Password = publicMailAccount.Password?.Trim(), Server = publicMailAccount.SmtpServer?.Trim(), Port = publicMailAccount.SmtpPort.HasValue ? publicMailAccount.SmtpPort.Value : 465, UseSSL = publicMailAccount.SmtpSSL.HasValue ? publicMailAccount.SmtpSSL.Value : true, Attaches = new List() }; _logger.LogInformation($"生成请求邮件参数,结果:{JSON.Serialize(emailApiUserDefinedDto)}"); //推送邮件 var emailRlt = PushEmail(emailApiUserDefinedDto).GetAwaiter().GetResult(); _logger.LogInformation($"推送邮件完成,结果:{JSON.Serialize(emailRlt)}"); a.STATUS = emailRlt.succ ? "SUCC" : "FAILURE"; a.STATUS_NAME = emailRlt.succ ? "成功" : "失败"; _taskCautionNoticeDetailInfoRepository.AsUpdateable(a).UpdateColumns(p => new { p.STATUS, p.STATUS_NAME }).ExecuteCommand(); } } else if (a.NOTIFY_METHOD == CautionNoticeMethodEnum.DingDing.ToString()) { _logger.LogInformation($"准备钉钉通知给 uid={a.NOTIFY_USER_NAME} name={a.NOTIFY_USER_NAME},内容:\r\n{noticeInfo.NOTIFY_CONTENT}"); DingTalkGroupHelper.SendDingTalkGroupMessage($"{taskBase.TenantId}_Notify", cautionNoticeEnum.GetDescription(), $"{noticeInfo.NOTIFY_CONTENT}\r\n{a.NOTIFY_USER_NAME}", false, new string[] { a.NOTIFY_MOBILE }, null); _logger.LogInformation($"钉钉通知完毕给 uid={a.NOTIFY_USER_NAME} name={a.NOTIFY_USER_NAME},内容:\r\n{noticeInfo.NOTIFY_CONTENT}"); a.STATUS = "SUCC"; a.STATUS_NAME = "成功"; _taskCautionNoticeDetailInfoRepository.AsUpdateable(a).UpdateColumns(p => new { p.STATUS, p.STATUS_NAME }).ExecuteCommand(); } }); } } catch (Exception ex) { new EmailNoticeHelper().SendEmailNotice($"taskPKId={taskPKId} 有重要提醒任务发生异常", $"taskPKId={taskPKId} 有重要提醒任务发生异常 原因:{ex.Message}", App.Configuration["EmailNoticeDefaultUser"].GetUserEmailList()); } return result; } #endregion #region 推送邮件 /// /// 推送邮件 /// /// 自定义邮件详情 /// 文件路径 /// 返回回执 private async Task PushEmail(EmailApiUserDefinedDto emailApiUserDefinedDto) { CommonWebApiResult result = new CommonWebApiResult { succ = true }; List emailList = new List(); var emailUrl = _cache.GetAllDictData().GetAwaiter().GetResult() .FirstOrDefault(x => x.TypeCode == "url_set" && x.Code == "email_api_url")?.Value; if (emailUrl == null) throw Oops.Bah("字典未配置 url_set->email_api_url 请联系管理员"); emailList.Add(emailApiUserDefinedDto); //string strJoin = System.IO.File.ReadAllText(filePath); DateTime bDate = DateTime.Now; HttpResponseMessage res = null; try { res = await emailUrl.SetBody(emailList, "application/json").PostAsync(); } catch (Exception ex) { _logger.LogInformation($"发送邮件异常:{ex.Message}"); } DateTime eDate = DateTime.Now; TimeSpan ts = eDate.Subtract(bDate); var timeDiff = ts.TotalMilliseconds; _logger.LogInformation($"邮件上传完成 用时:{timeDiff}ms.,"); _logger.LogInformation($"发送邮件返回:{JSON.Serialize(res)}"); if (res != null && res.StatusCode == System.Net.HttpStatusCode.OK) { var userResult = await res.Content.ReadAsStringAsync(); var respObj = JsonConvert.DeserializeAnonymousType(userResult, new { Success = false, Message = string.Empty, Code = -9999, }); result.succ = respObj.Success; result.msg = respObj.Message; } return result; } #endregion } }