using Hg.Core.Entity; using Microsoft.AspNetCore.Razor.TagHelpers; using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using Zxd.Core.Shared.Helpers; namespace Hg.Core.Domain { internal class CsvrMessageDomain : ICsvrMessageDomain { private readonly IBaseRepository _zxdRepository; private readonly IRedisManager _redisManager; private readonly IConfiguration _configuration; private readonly IHttpClient _httpClient; private readonly IMapper _mapper; private readonly SystemConfig _systemConfig; private readonly IInneruserDomain _inneruserDomain; private readonly ICacheDomain _cacheDomain; private readonly NotificationHub _notificationHub; public CsvrMessageDomain(IBaseRepository zxdRepository, IRedisManager redisManager, IConfiguration configuration, IMapper mapper, IHttpClient httpClient, IInneruserDomain inneruserDomain, ICacheDomain cacheDomain, NotificationHub notificationHub) { _zxdRepository = zxdRepository; _redisManager = redisManager; _mapper = mapper; _httpClient = httpClient; _configuration = configuration; _inneruserDomain = inneruserDomain; _cacheDomain = cacheDomain; _systemConfig = _configuration.GetSection("SystemConfig").Get(); _notificationHub = notificationHub; } /// /// 推送 文案审核消息类型推送(比较特殊,需要从配置的角色中找到匹配部门才行) /// /// 消息编码 /// public async Task PushNewsMsg(PushNewsMsgDto dto) { try { if (dto.SendDingDing) { var configStr = await _cacheDomain.GetValueParameter("DingtalkConfig"); var configs = JsonHelper.FromJson>(configStr); var config = configs.Find(x => x.RobotName == "未接电话提醒"); if (config != null) { await Dingtalk(config.SecretKey, config.RobotUrl, dto.DingDingContent); } return true; } var typemodel = await _zxdRepository.GetRepository().Query() .Where(m => m.Msgcode == dto.Msgcode) .FirstOrDefaultAsync(); if (typemodel == null) { Log.Error($"编码:{dto.Msgcode}错误!"); return false; } Log.Information("获取的数据:" + typemodel.ToJson()); List sendeidlist = new List();//需要发送的eid if (typemodel.Sendtype == "all") { sendeidlist = await _zxdRepository.GetRepository().Query() .Where(m => m.ISDISMISS == 0 && m.ISHIDE == 0).Select(m => m.EID) .ToListAsync(); } else if (typemodel.Sendtype == "eid") { List eids = new List();//需要发送的eid string[] models = dto.Eid.Split(','); foreach (var item in models) { if (string.IsNullOrEmpty(item)) continue; int meid = 0; if (int.TryParse(item, out meid)) { eids.Add(meid); } } sendeidlist = await _zxdRepository.GetRepository().Query() .Where(m => m.ISDISMISS == 0 && m.ISHIDE == 0 && eids.Contains(m.EID)).Select(m => m.EID) .ToListAsync(); } else if (typemodel.Sendtype == "role") { string[] models = typemodel.SendConfig.Split(','); sendeidlist = (from a in _zxdRepository.GetRepository().Query() join b in _zxdRepository.GetRepository().Query() on a.PKID equals b.INNERUSERID join c in _zxdRepository.GetRepository().Query() on b.ROLEID equals c.ROLEID join d in _zxdRepository.GetRepository().Query() on c.ROLEID equals d.roleid where models.Contains(c.CODE) where a.ISDISMISS == 0 where a.ISHIDE == 0 where d.companycode.Contains(dto.Companycode) select a.EID ).ToList(); } Log.Information("获取的数据:" + sendeidlist.ToJson()); if (sendeidlist != null && sendeidlist.Count > 0) { var list = new List(); foreach (var item in sendeidlist) { list.Add(new CsvrMessage() { Ctime = DateTime.Now, Eid = item, Fromer = dto.Fromer, Islook = 0, Message = dto.Title, Msgcode = dto.Msgcode, Param = dto.Param }); } list = await _zxdRepository.GetRepository().BatchInsertAsync(list); // 消息推送 foreach (var item in list) { await _notificationHub.Send(item, typemodel.Title); } } } catch (Exception e) { Log.Error(e.ToString()); } return true; } private async Task Dingtalk(string? secretkey, string? postUrl, string? content) { try { var timeStamp = GetTimeStamp(); var sign = GetSign(timeStamp, secretkey); var dingtalk = $"{postUrl}×tamp={timeStamp}&sign={sign}"; var postBody = new { at = new { atMobiles = new List(), atUserIds = new List(), isAtAll = false, }, text = new { content }, msgtype = "text" }; var res = await _httpClient.PostAsync(dingtalk, postBody); } catch (Exception ex) { Log.Error(ex, string.Concat("【钉钉通知】dingtalk(),:content", content, ex.Message, ex.StackTrace)); } } private static string GetSign(string timeStamp, string secret) { string stringToSign = timeStamp + "\n" + secret; var encoding = new System.Text.ASCIIEncoding(); byte[] keyByte = encoding.GetBytes(secret); byte[] messageBytes = encoding.GetBytes(stringToSign); using (var hmacsha256 = new HMACSHA256(keyByte)) { byte[] hashmessage = hmacsha256.ComputeHash(messageBytes); return System.Web.HttpUtility.UrlEncode(Convert.ToBase64String(hashmessage), Encoding.UTF8); } } private static string GetTimeStamp() { TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0); long shijianchuo = ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000); return shijianchuo.ToString(); } /// /// 获取用户消息数量 /// /// /// public async Task GetMessageCount(int eid) { var nowtime = DateTime.Now; var time = new DateTime(nowtime.Year, nowtime.Month, nowtime.Day).AddDays(-5);//未读5天数据 var count = await _zxdRepository.GetRepository().Query() .Where(m => m.Eid == eid && m.Islook == 0 && m.Ctime >= time) .OrderBy(M => M.Id).CountAsync(); return count; } /// /// 获取用户消息 /// /// /// /// public async Task GetNotificationByEid(int eid, string msgcode) { var nowtime = DateTime.Now; var time = new DateTime(nowtime.Year, nowtime.Month, nowtime.Day).AddDays(-5);//未读5天数据 var csvrMessage = await _zxdRepository.GetRepository().Query() .Where(m => m.Eid == eid && m.Msgcode == msgcode && m.Islook == 0 && m.Ctime >= time) .OrderByDescending(M => M.Id).FirstOrDefaultAsync(); return csvrMessage; } public class DingtalkConfig { [JsonPropertyName("robotName")] public string? RobotName { get; set; } [JsonPropertyName("robotUrl")] public string? RobotUrl { get; set; } [JsonPropertyName("secretKey")] public string? SecretKey { get; set; } } } }