PushMsgService.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. using AutoMapper;
  2. using LinqKit;
  3. using Microsoft.AspNetCore.Http;
  4. using Microsoft.Extensions.Configuration;
  5. using Newtonsoft.Json;
  6. using Ropin.Inspection.Common;
  7. using Ropin.Inspection.Common.Accessor.Interface;
  8. using Ropin.Inspection.Common.Helper;
  9. using Ropin.Inspection.Model;
  10. using Ropin.Inspection.Model.Entities;
  11. using Ropin.Inspection.Model.ViewModel;
  12. using Ropin.Inspection.Repository;
  13. using Ropin.Inspection.Repository.SYS.Interface;
  14. using Ropin.Inspection.Service.Interface;
  15. using System;
  16. using System.Collections.Generic;
  17. using System.Linq;
  18. using System.Net.Http;
  19. using System.Net.NetworkInformation;
  20. using System.Threading.Tasks;
  21. namespace Ropin.Inspection.Service
  22. {
  23. public class PushMsgService : IPushMsgService
  24. {
  25. private readonly IClaimsAccessor _claims;
  26. private readonly IMapper _mapper;
  27. private readonly IHttpContextAccessor _httpContextAccessor;
  28. private readonly IHttpClientFactory _httpClientFactory;
  29. private readonly ITsysUserRepository _tsysUserRepository;
  30. private readonly ITmtnPushMsgToRepository _tmtnPushMsgToRepository;
  31. private readonly ITmtnPushMsgResultRepository _tmtnPushMsgResultRepository;
  32. private readonly ITbdmCodeDetailRepository _tbdmCodeDetailRepository;
  33. private readonly ITdevDevStoreRepository _tdevDevStoreRepository;
  34. private readonly ITsysUserService _tsysUserService;
  35. private readonly ITsysMessageRepository _messageRepository;
  36. private readonly ITsysMessageFileRepository _tsysMessageFileRepository;
  37. private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(PushMsgService));
  38. private string IsSendEmail = "true";
  39. public PushMsgService(IClaimsAccessor claims,
  40. ITmtnPushMsgToRepository tmtnPushMsgToRepository,
  41. ITbdmCodeDetailRepository tbdmCodeDetailRepository,
  42. ITmtnPushMsgResultRepository tmtnPushMsgResultRepository,
  43. ITdevDevStoreRepository tdevDevStoreRepository,
  44. IMapper mapper,
  45. ITsysUserService tsysUserService,
  46. IHttpClientFactory httpClientFactory,
  47. ITsysUserRepository tsysUserRepository
  48. , IConfiguration configuration, ITsysMessageRepository messageRepository, ITsysMessageFileRepository tsysMessageFileRepository)
  49. {
  50. _mapper = mapper;
  51. _claims = claims;
  52. _httpClientFactory = httpClientFactory;
  53. _tsysUserRepository = tsysUserRepository;
  54. _tmtnPushMsgToRepository = tmtnPushMsgToRepository;
  55. _tbdmCodeDetailRepository = tbdmCodeDetailRepository;
  56. _tmtnPushMsgResultRepository = tmtnPushMsgResultRepository;
  57. _tdevDevStoreRepository = tdevDevStoreRepository;
  58. _tsysUserService = tsysUserService;
  59. _messageRepository = messageRepository;
  60. _tsysMessageFileRepository= tsysMessageFileRepository;
  61. string IsEmail = configuration.GetSection("IsSendEmail")?.Value;
  62. IsSendEmail = !string.IsNullOrEmpty(IsEmail)? IsEmail :"true";
  63. }
  64. /// <summary>
  65. ///
  66. /// </summary>
  67. /// <param name="pushModel"></param>
  68. /// <param name="Subject"></param>
  69. /// <param name="rabbitMQModel"></param>
  70. /// <param name="UrlId">跳转小程序URLID</param>
  71. /// <param name="status">状态</param>
  72. /// <returns></returns>
  73. public async Task<bool> PushAlarmMsgAsync(TpushMsgModel pushModel,string Subject=null,RabbitMQModel rabbitMQModel=null, string UrlId = null,string status=null)
  74. {
  75. try
  76. {
  77. List<MessageFile> messageFiles = pushModel.FileList;
  78. pushModel.FileList = null;
  79. log.Info($"发送消息-Begin");
  80. log.Info($"发送消息-接收数据【{JsonConvert.SerializeObject(pushModel)}】");
  81. int msgStatus = DataDictionaryHelper.GetMsgStatus(pushModel.C_MsgTypeCode);
  82. pushModel.msgStatus = msgStatus;
  83. string createBy = "6e864cbc-5252-11ec-8681-fa163e02b3e4";
  84. var devStore = await _tdevDevStoreRepository.GetByIdAsync(pushModel.C_DevStoreCode);
  85. if(devStore == null) return await Task.FromResult(false);
  86. pushModel.DevName = devStore.C_Name;
  87. pushModel.DevNumber = devStore.C_NumberCode;
  88. var predicate = PredicateBuilder.New<TMTN_PushMsgTo>(true);//查询条件,推荐后台使用这种方式灵活筛选
  89. if (!string.IsNullOrEmpty(pushModel.C_DevStoreCode))
  90. {
  91. predicate = predicate.And(i => i.C_DevStoreCode.Equals(pushModel.C_DevStoreCode));
  92. }
  93. if (!string.IsNullOrEmpty(pushModel.C_MsgTypeCode))
  94. {
  95. predicate = predicate.And(i => i.C_MsgTypeCode.Equals(pushModel.C_MsgTypeCode));
  96. }
  97. IEnumerable<TMTN_PushMsgTo> pushMsgTo = await _tmtnPushMsgToRepository.GetByConditionAsync(predicate);
  98. IList<TMTN_PushMsgTo> pushMsgTolist = pushMsgTo.ToList();
  99. //IEnumerable<TSYS_User> users = await _tsysUserRepository.GetByConditionAsync(x=>x.C_Status == "1");
  100. IList<TSYS_User> userList = _tsysUserRepository.GetUserList();//users.ToList();
  101. IEnumerable<TBDM_CodeDetail> tBDMCodeDetail = await _tbdmCodeDetailRepository.GetAllAsync();
  102. IList<TBDM_CodeDetail> tBDMCodeDetailList = tBDMCodeDetail.ToList();
  103. List<string> sendUserWechatIDList = new List<string>();
  104. List<TMTN_PushMsgResult> pushMsgResultList = new List<TMTN_PushMsgResult>();
  105. log.Info($"发送消息-pushMsgTolist【{JsonConvert.SerializeObject(pushMsgTolist)}】");
  106. foreach (var pushMsgToItem in pushMsgTolist)
  107. {
  108. var user = userList.Where(x => x.C_UserID.ToString() == pushMsgToItem.C_PushPersonCode)?.FirstOrDefault();
  109. if (user is null)
  110. continue;
  111. if (string.IsNullOrWhiteSpace(pushModel.UserName))
  112. {
  113. var creadUser = await _tsysUserService.GetByIdAsync(_claims.ApiUserId);
  114. createBy = _claims.ApiUserId.ToString();
  115. pushModel.UserName = creadUser?.C_Name;
  116. pushModel.UserMobile = creadUser?.C_Mobile;
  117. }
  118. if (pushMsgToItem.C_PushTypeCode == "PUSH_TYPE_001")//Email
  119. {
  120. if (!string.IsNullOrEmpty(user.C_Email))
  121. {
  122. if (!string.IsNullOrEmpty(user.C_Email))
  123. {
  124. switch (pushModel.C_MsgTypeCode)
  125. {
  126. case "MSG_TYPE_001"://通知维修消息
  127. break;
  128. case "MSG_TYPE_002"://通知运维消息
  129. break;
  130. case "MSG_TYPE_003"://通知巡检消息
  131. break;
  132. case "MSG_TYPE_004"://巡检异常消息
  133. break;
  134. case "MSG_TYPE_005"://异常消除消息
  135. break;
  136. case "MSG_TYPE_006"://维修确认消息
  137. break;
  138. case "MSG_TYPE_007"://维修取消消息
  139. break;
  140. case "MSG_TYPE_008"://维修完成消息
  141. break;
  142. case "MSG_TYPE_009"://运维取消消息
  143. break;
  144. case "MSG_TYPE_010"://异常确认消息
  145. break;
  146. case "MSG_TYPE_011"://设备启停消息
  147. break;
  148. case "MSG_TYPE_012"://设备点报警
  149. break;
  150. case "MSG_TYPE_013"://设备点报警取消
  151. break;
  152. case "MSG_TYPE_014"://正在维修消息
  153. break;
  154. case "MSG_TYPE_015"://维修返工消息
  155. break;
  156. case "MSG_TYPE_016"://维修完成确认
  157. break;
  158. default:
  159. break;
  160. }
  161. string msg =
  162. "<p><td>设备编号:</td>" + pushModel.DevNumber + "</p>" +
  163. "<p><td>设备名称:</td>" + pushModel.DevName + "</p>" +
  164. "<p><td>消息内容:</td>" + pushModel.Msg + "</p>" +
  165. "<p><td>设备地址:</td>" + pushModel.DevAddress + "</p>" +
  166. "<p><td> 报警时间:</td> " + pushModel.CreateOn + "</p>" +
  167. "<p><td> 上报人:</td> " + pushModel.UserName + "</p>"
  168. //+"<p><td> 上报人手机号:</td> " + pushModel.UserMobile + "</p>"
  169. ;
  170. if (IsSendEmail== "true")
  171. {
  172. var bols= EmailHelper.SendEmail(user.C_Email, tBDMCodeDetailList.Where(i => i.C_Code == pushMsgToItem.C_MsgTypeCode).Select(x => x.C_Name).FirstOrDefault(), pushModel.Subject, msg);
  173. if (!bols)
  174. {
  175. log.Info($"发送邮件失败【C_Email={user.C_Email},C_MsgTypeCode={pushMsgToItem.C_MsgTypeCode} ,C_DevStoreCode={pushModel.C_DevStoreCode}】");
  176. }
  177. }
  178. }
  179. }
  180. pushMsgResultList.Add(new TMTN_PushMsgResult
  181. {
  182. C_ID = Guid.NewGuid().ToString(),
  183. C_PushMsgToCode = pushMsgToItem.C_PushPersonCode,
  184. //C_Content = "消息主题:" + pushModel.Subject + " 设备编号:" + pushModel.DevNumber + " 设备名称:" + pushModel.DevName + " 设备地址:" + pushModel.DevAddress + " 消息内容:" + pushModel.Msg,
  185. C_Content = JsonConvert.SerializeObject(pushModel),
  186. C_PushTypeCode = pushMsgToItem.C_PushTypeCode,
  187. C_DevStoreCode = pushMsgToItem.C_DevStoreCode,
  188. C_MsgTypeCode = pushModel.C_MsgTypeCode,
  189. C_Subject = Subject,
  190. C_CreateBy = new Guid(createBy),
  191. D_CreateOn = DateTime.Now,
  192. C_Status = "1"
  193. }) ;
  194. }
  195. if (pushMsgToItem.C_PushTypeCode == "PUSH_TYPE_002")//wx
  196. {
  197. //if (!string.IsNullOrEmpty(user.C_WechatID)&& IsSendEmail == "true")
  198. //{
  199. // if (!sendUserWechatIDList.Contains(user.C_WechatID))
  200. // sendUserWechatIDList.Add(user.C_WechatID);
  201. //}
  202. log.Info($"发送消息-获取微信C_WxopenID【{user.C_WxopenID}】用户名字【{user.C_Name}】IsSendEmail【{IsSendEmail}】");
  203. if (!string.IsNullOrEmpty(user.C_WxopenID) && IsSendEmail == "true")
  204. {
  205. if (!sendUserWechatIDList.Contains(user.C_WxopenID))
  206. sendUserWechatIDList.Add(user.C_WxopenID);
  207. }
  208. pushMsgResultList.Add(new TMTN_PushMsgResult
  209. {
  210. C_ID = Guid.NewGuid().ToString(),
  211. C_PushMsgToCode = pushMsgToItem.C_PushPersonCode,
  212. //C_Content = "消息主题:" + pushModel.Subject + " 设备编号:" + pushModel.DevNumber + " 设备名称:" + pushModel.DevName + " 设备地址:" + pushModel.DevAddress + " 消息内容:" + pushModel.Msg,
  213. C_Content = JsonConvert.SerializeObject(pushModel),
  214. C_PushTypeCode = pushMsgToItem.C_PushTypeCode,
  215. C_DevStoreCode = pushMsgToItem.C_DevStoreCode,
  216. C_MsgTypeCode = pushModel.C_MsgTypeCode,
  217. C_Subject = Subject,
  218. C_CreateBy = new Guid(createBy),
  219. D_CreateOn = DateTime.Now,
  220. C_Status = "1"
  221. });
  222. }
  223. }
  224. log.Info($"发送消息-sendUserWechatIDList【{JsonConvert.SerializeObject(sendUserWechatIDList)}】pushMsgResultList=【{JsonConvert.SerializeObject(pushMsgResultList)}】");
  225. string GenerationCode = "";
  226. switch (pushModel.GenerationType)
  227. {
  228. case 1: GenerationCode = pushModel.C_DevStoreCode; break;
  229. case 2: GenerationCode = _claims.ApiUserId.ToString(); break;
  230. case 3: GenerationCode = "6e864cbc-5252-11ec-8681-fa163e02b3e4"; break;
  231. }
  232. TSYS_Message message = new TSYS_Message
  233. {
  234. C_ID = Guid.NewGuid().ToString(),
  235. C_LicenseCode = "SYSTEM",
  236. C_Content = JsonConvert.SerializeObject(pushModel),
  237. C_MsgTypeCode = pushModel.C_MsgTypeCode,
  238. C_Subject = Subject,
  239. D_MsgCreateOn = Convert.ToDateTime(pushModel.CreateOn),
  240. C_GenerationCode = GenerationCode,
  241. I_GenerationType = pushModel.GenerationType,
  242. I_MsgStatus = pushModel.msgStatus,
  243. C_DevStoreCode = pushModel.C_DevStoreCode,
  244. C_Remark = "",
  245. C_CreateBy = createBy,
  246. C_Creator = "Api",
  247. D_CreateOn = DateTime.Now,
  248. C_Status = "1"
  249. };
  250. List<TSYS_MessageFile> FileList = null;
  251. if (messageFiles != null)
  252. {
  253. FileList=new List<TSYS_MessageFile>();
  254. foreach (var item in messageFiles)
  255. {
  256. TSYS_MessageFile mesFile = new TSYS_MessageFile
  257. {
  258. C_ID = Guid.NewGuid().ToString(),
  259. C_MessageCode= message.C_ID,
  260. C_Url=item.Url,
  261. C_Text = item.Text,
  262. C_Type = item.Type,
  263. C_CreateBy = createBy,
  264. D_CreateOn = DateTime.Now,
  265. C_Status = "1"
  266. };
  267. FileList.Add(mesFile);
  268. }
  269. }
  270. _messageRepository.Create(message);
  271. bool messResult = await _messageRepository.SaveAsync();
  272. if (messResult)
  273. {
  274. if (FileList != null && FileList.Count > 0)
  275. {
  276. int fileSaveResult = await _tsysMessageFileRepository.CreateRangeAsync(FileList);
  277. }
  278. string miniProgramAppId = "";//跳转小程序的Appid
  279. //获取小程序页面
  280. string miniProgramPagePath = DataDictionaryHelper.GetXCXPage(pushModel.C_MsgTypeCode, message.C_ID, UrlId, pushModel.C_DevStoreCode, status);
  281. if (!string.IsNullOrEmpty(miniProgramPagePath))
  282. {
  283. miniProgramAppId = WXConstModel.XCXAppId;
  284. }
  285. if (sendUserWechatIDList.Any())
  286. {
  287. try
  288. {
  289. string typeName = tBDMCodeDetailList.Where(i => i.C_Code == pushModel.C_MsgTypeCode).Select(x => x.C_Name).FirstOrDefault();
  290. #region 长期订阅 【2025-2-11】
  291. //var content = new
  292. //{
  293. // character_string1 = new { value = devStore.C_NumberCode ?? "" },
  294. // time2 = new { value = DateTime.Now.ToString("yyyy-MM-dd hh:mm") },
  295. // short_thing3 = new { value = typeName ?? "" }
  296. //};
  297. //new WeChatHelper(_httpClientFactory).PushMessageToUser(sendUserWechatIDList, content, WXConstModel.WatchHealthAlarm_TemplateId);
  298. #endregion
  299. #region 公众号模板【2025-3-5】
  300. string msg = pushModel.Msg;
  301. if (string.IsNullOrEmpty(msg))
  302. {
  303. msg = DataDictionaryHelper.GetValNameByCode(pushModel.C_MsgTypeCode);
  304. }
  305. if (msg.Length > 20)
  306. {
  307. msg = msg.Substring(0, 17) + "...";
  308. }
  309. string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm");
  310. if (!string.IsNullOrEmpty(pushModel.CreateOn))
  311. {
  312. time = Convert.ToDateTime(pushModel.CreateOn).ToString("yyyy-MM-dd HH:mm");
  313. }
  314. #region //_wP22WQxAlfYGfS8zlnHTl_-KgKS8j_FP5HDeqfsPtU
  315. //设备编号{ { character_string2.DATA} }
  316. //设备名称{ { thing1.DATA} }
  317. //关闭状态{ { thing3.DATA} }
  318. //关闭时间{ { time4.DATA} }
  319. //var data = new
  320. //{
  321. // thing1 = new { value = devStore.C_Name }, //异常位置
  322. // character_string2 = new { value = devStore.C_NumberCode },//异常点位
  323. // thing3 = new { value = typeName }, //上报人
  324. // time4 = new { value = pushModel.CreateOn}//上报时间
  325. //};
  326. #endregion
  327. #region 7eGjzIBAyysTOLfcn-oqkpOCEL_My5ItXHkd_DdniGw
  328. //设备名称{ { thing2.DATA} }
  329. //设备编号{ { character_string20.DATA} }
  330. //报警时间{ { time4.DATA} }
  331. //报警内容{ { thing5.DATA} }
  332. var data = new
  333. {
  334. thing2 = new { value = devStore.C_Name }, //设备名称
  335. character_string20 = new { value = devStore.C_NumberCode },//设备编号
  336. thing5 = new { value = msg }, //报警内容
  337. time4 = new { value = time }//报警时间
  338. };
  339. #endregion
  340. var row = new WeChatHelper(_httpClientFactory).PushGZHMessageToUser(sendUserWechatIDList, WXConstModel.GZHDevAlarmTemplateId, "", data, miniProgramAppId, miniProgramPagePath);
  341. #endregion
  342. }
  343. catch (Exception ex)
  344. {
  345. log.Info($" 发送消息-WeChatHelper-发送异常【C_MsgTypeCode={pushModel.C_MsgTypeCode}】 异常信息:{ex.Message}");
  346. throw;
  347. }
  348. }
  349. if (pushMsgResultList.Any())
  350. {
  351. //await _tmtnPushMsgResultRepository.CreateRangeAsync(pushMsgResultList);
  352. foreach (var content in pushMsgResultList)
  353. {
  354. try
  355. {
  356. content.C_MessageCode = message.C_ID;
  357. _tmtnPushMsgResultRepository.Create(content);
  358. bool bols = await _tmtnPushMsgResultRepository.SaveAsync();
  359. }
  360. catch (Exception ex)
  361. {
  362. log.Info($" 发送消息-pushMsgResultList-TMTN_PushMsgResult-保存异常【数据:{JsonConvert.SerializeObject(content)}】 异常信息:{ex.Message}");
  363. Console.WriteLine(ex.Message);
  364. }
  365. }
  366. //
  367. if (pushModel.C_MsgTypeCode == "MSG_TYPE_012" && rabbitMQModel != null)
  368. {
  369. rabbitMQModel.msgStr = JsonConvert.SerializeObject(message);
  370. bool bol = await RabbitMQHelper.SnedRabbitMQ_ExchangeDirect(rabbitMQModel);
  371. if (!bol)
  372. {
  373. log.Info($" 发送消息-[MSG_TYPE_012]发送RabbitMQ消息失败【TMTN_PushMsgResult:{rabbitMQModel.msgStr}】");
  374. }
  375. }
  376. }
  377. }
  378. else {
  379. log.Info($"发送消息-TSYS_Message 数据添加失败【{JsonConvert.SerializeObject(message)}】");
  380. }
  381. log.Info($"发送消息-END");
  382. return await Task.FromResult(true);
  383. }
  384. catch (Exception ex)
  385. {
  386. log.Info($"发送消息-Error【{ex.Message}】");
  387. return await Task.FromResult(false);
  388. }
  389. }
  390. public async Task PushRecordMsgAsync(string type,TispRecordItemAlarmDetailViewModel viewModel)
  391. {
  392. try
  393. {
  394. IEnumerable<TSYS_User> users = await _tsysUserRepository.GetByRecordItemCodeAsync(viewModel.C_ID.ToString());
  395. if (!users.Any())
  396. {
  397. return;
  398. }
  399. //List<string> openIds = users.Where(u => u.C_WechatID != null).Select(i => i.C_WechatID).ToList();
  400. //var content = new
  401. //{
  402. // thing2 = new { value = itemDetail.ReportUserName ?? "" },
  403. // time4 = new { value = DateTime.Now.ToString("yyyy-MM-dd hh:mm") },
  404. // thing5 = new { value = "巡检异常取消" ?? "" },
  405. // thing6 = new { value = itemDetail.C_Name ?? "" },
  406. // thing9 = new { value = itemDetail.SpotName ?? "" }
  407. //};
  408. //new WeChatHelper(_httpClientFactory).PushMessageToUser(openIds, content);
  409. List<string> openIds = users.Where(u => u.C_WxopenID != null).Select(i => i.C_WxopenID).ToList();
  410. //var data = new
  411. //{
  412. // thing4 = new { value = viewModel.SpotName }, //异常位置
  413. // thing6 = new { value = viewModel.C_Name },//异常点位
  414. // thing2 = new { value = viewModel.ReportUserName }, //上报人
  415. // time3 = new { value = DateTime.Now.ToString("yyyy-MM-dd HH:mm") }//上报时间
  416. //};
  417. string statusStr = "未知";
  418. //1 = 正常; 0 = 异常; 2 = 恢复; 3 = 确认异常; 4 = 取消异常
  419. switch (viewModel.SecurityStatus)
  420. {
  421. case "0": statusStr = "异常"; break;
  422. case "1": statusStr = "正常"; break;
  423. case "2": statusStr = "恢复"; break;
  424. case "3": statusStr = "确认异常"; break;
  425. case "4": statusStr = "取消异常"; break;
  426. }
  427. var data = new
  428. {
  429. thing1 = new { value = viewModel.SpotName }, //异常位置
  430. character_string2 = new { value = viewModel.SpotNumber },//异常点位
  431. thing3 = new { value = statusStr }, //上报人
  432. time4 = new { value = DateTime.Now.ToString("yyyy-MM-dd HH:mm") }//上报时间
  433. };
  434. var row = new WeChatHelper(_httpClientFactory).PushGZHMessageToUser(openIds, null, "", data, "", "");
  435. }
  436. catch (Exception ex)
  437. {
  438. throw;
  439. }
  440. }
  441. }
  442. }