HostedService.cs 137 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290
  1. using Microsoft.Extensions.DependencyInjection;
  2. using Microsoft.Extensions.Hosting;
  3. using Microsoft.Extensions.Logging;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Text;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. using System.Linq;
  10. using System.Data;
  11. using InitQ.Cache;
  12. using FBoxClientDriver.Contract;
  13. using Ropin.Inspection.Service;
  14. using Ropin.Inspection.Repository;
  15. using Ropin.Inspection.Model.Entities;
  16. using Ropin.Inspection.Model;
  17. using Newtonsoft.Json;
  18. using LinqKit;
  19. using Ropin.Inspection.Common.Helper;
  20. using Microsoft.AspNetCore.NodeServices;
  21. using Microsoft.EntityFrameworkCore;
  22. using InfluxData.Net.InfluxDb;
  23. using InfluxData.Net.Common.Enums;
  24. using InfluxData.Net.InfluxDb.Models;
  25. using Newtonsoft.Json.Linq;
  26. using System.Net.Http;
  27. using System.Net;
  28. using Coravel.Events.Interfaces;
  29. using Ropin.Inspection.Common;
  30. using Castle.Core.Internal;
  31. using System.Collections.Concurrent;
  32. using System.Diagnostics;
  33. using Ropin.Inspection.Model.ViewModel.DEV;
  34. using Ropin.Inspection.Repository.DEV.Interface;
  35. using RabbitMQ.Client;
  36. using log4net;
  37. using Microsoft.AspNetCore.SignalR;
  38. using Ropin.Environmentally.WebScada.Hubs;
  39. using Autofac.Core;
  40. using Google.Protobuf.WellKnownTypes;
  41. using System.Text.RegularExpressions;
  42. namespace Ropin.Environmentally.WebScada.Work
  43. {
  44. public class HostedService : IHostedService, IDisposable
  45. {
  46. private readonly ILogger _logger;
  47. private readonly IServiceProvider _provider;
  48. //private readonly ICacheService _redisService;
  49. private readonly IDbContextFactory<InspectionDbContext> _dbContextFactory;
  50. private readonly Func<InspectionDbContext> _dbFuncContextFactory;
  51. private readonly INodeServices _nodeServices;
  52. private readonly ITdevWebScadaDevSpotRepository _devWebScadaDevSpotRepository;
  53. //private readonly ITdevDevStoreService _devDevStoreService;
  54. private readonly ITdevDevStoreRepository _tdevDevStoreRepository;
  55. private readonly IPushMsgService _pushMsgService;
  56. private readonly IHttpClientFactory httpClientFactory;
  57. private demo fanyi;
  58. private InfluxDbClient clientDb;
  59. private readonly IDispatcher _dispatcher;
  60. private readonly ITdevDevStoreLogRepository _tdevDevStoreLogRepository;
  61. private readonly ITmtnDevOpsRecordRepository _tmtnDevOpsRecordRepository;
  62. private readonly Idev_DevOpeAccountConfigRepository _devDevOpeAccountConfigService;
  63. private readonly IHubContext<MyHub> _hubContext;
  64. private static readonly ILog log = LogManager.GetLogger(typeof(HostedService));
  65. private readonly RabbitMQModel _rabbitMQModel;
  66. private readonly APIUrlData _aPIUrlData;
  67. private readonly IniInfluxData _IniInfluxData;
  68. //bool IsFirst = true;
  69. public HostedService(ILogger<HostedService> logger,
  70. IServiceProvider provider,
  71. ITdevDevStoreRepository devDevStoreRepository,
  72. INodeServices nodeServices,
  73. //IPushMsgService pushMsgService,
  74. Func<InspectionDbContext> dbContextFactory,
  75. IHttpClientFactory httpClientFactory,
  76. IDispatcher dispatcher,
  77. //IDbContextFactory<InspectionDbContext> dbContextFactory,
  78. ITdevWebScadaDevSpotRepository devWebScadaDevSpotRepository,
  79. ITdevDevStoreLogRepository tdevDevStoreLogRepository,
  80. Idev_DevOpeAccountConfigRepository devDevOpeAccountConfigService,
  81. ITmtnDevOpsRecordRepository tmtnDevOpsRecordRepository,
  82. IHubContext<MyHub> hubContext, RabbitMQModel rabbitMQModel, APIUrlData aPIUrlData, IniInfluxData iniInfluxData)
  83. {
  84. _logger = logger;
  85. _provider = provider;
  86. _tdevDevStoreRepository = devDevStoreRepository;
  87. _devWebScadaDevSpotRepository = devWebScadaDevSpotRepository;
  88. _nodeServices = nodeServices;
  89. this.httpClientFactory = httpClientFactory;
  90. _dispatcher = dispatcher;
  91. //_pushMsgService = pushMsgService; 用不了
  92. // _devDevStoreService = devDevStoreService;
  93. //using (var scope = _provider.GetRequiredService<IServiceScopeFactory>().CreateScope())
  94. //{
  95. // _redisService = scope.ServiceProvider.GetService<ICacheService>();
  96. //};
  97. _dbFuncContextFactory = dbContextFactory;
  98. //var v = _provider.GetRequiredService<IDbContextFactory<InspectionDbContext>>();
  99. //_dbContextFactory = dbContextFactory;//
  100. _IniInfluxData = iniInfluxData;
  101. IniInflux();
  102. _tdevDevStoreLogRepository = tdevDevStoreLogRepository;
  103. _tmtnDevOpsRecordRepository = tmtnDevOpsRecordRepository;
  104. _devDevOpeAccountConfigService = devDevOpeAccountConfigService;
  105. _hubContext = hubContext;
  106. _rabbitMQModel = rabbitMQModel;
  107. _aPIUrlData = aPIUrlData;
  108. }
  109. private object _locker = new object();
  110. public Task StartAsync(CancellationToken cancellationToken)
  111. {
  112. //Task.Run(async () =>
  113. //{
  114. // await Test(new TDEV_DevStore { C_ID = "59e98720-f26a-4322-9dad-c92bb5d7ae8b" });
  115. //});
  116. //测试定时
  117. Task.Run(async() =>
  118. {
  119. fanyi = new demo();
  120. fanyi._fbox.DataMonitorValueChanged += _fbox_DataMonitorValueChanged;
  121. //fanyi.Start().Wait();
  122. //while (true)
  123. //{
  124. // //string str = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  125. // //log.Info("-testWebSocket:" + str);
  126. // //await _hubContext.Clients.All.SendAsync("testWebSocket", str);
  127. // using (var scope = _provider.GetRequiredService<IServiceScopeFactory>().CreateScope())
  128. // {
  129. // var _redisService = scope.ServiceProvider.GetService<ICacheService>();
  130. // var devValues = _redisService.Get("fanyibox_devStore_015ea688-0698-408c-94b7-0475b14a20fc");
  131. // log.Info("-testWebSocket:" + devValues.ToString());
  132. // await _hubContext.Clients.All.SendAsync("testWebSocket_015ea688-0698-408c-94b7-0475b14a20fc", devValues.ToString());
  133. // }
  134. // await Task.Delay(60000);
  135. // }
  136. });
  137. //Task.Run(() =>
  138. //{
  139. // Timer t0 = new Timer(async (o) => {
  140. // using (var dbContext = _dbFuncContextFactory())
  141. // {
  142. // IEnumerable<TDEV_DevStore> devStore = dbContext.TDEV_DevStore.AsEnumerable();
  143. // //IList<TDEV_DevStore> itemList = items.ToList();
  144. // //var devStore = await _tdevDevStoreRepository.GetAllAsync();
  145. // await _redisService.SetAsync("fanyibox_devStore", devStore.ToList());
  146. // }
  147. // }, null, 500, 5000);
  148. //});
  149. #region
  150. Task.Run(async () =>
  151. {
  152. while (true)
  153. {
  154. try
  155. {
  156. //await this._dispatcher.Broadcast(new DevEvent("niu","aa"));
  157. //var services = new ServiceCollection();
  158. //var provider = services.BuildServiceProvider();
  159. //var dispatcher = provider.GetRequiredService<IDispatcher>() as Dispatcher;
  160. //dispatcher.Register<DevEvent>()
  161. // .Subscribe<DevEventListener>();
  162. //await dispatcher.Broadcast(new DevEvent("niu"));
  163. //List<Task> tasks = new List<Task>();
  164. //tasks.Add();
  165. IList<TDEV_DevStore> devStore = null;
  166. IList<TDEV_WebScadaDevSpot> devStoreSpot = null;
  167. using (var scope = _provider.GetRequiredService<IServiceScopeFactory>().CreateScope())
  168. {
  169. var _redisService = scope.ServiceProvider.GetService<ICacheService>();
  170. //var _tmtnDevOpsRecordRepository = scope.ServiceProvider.GetService<ITmtnDevOpsRecordRepository>();
  171. //var solidWasteRecordItems = await _tmtnDevOpsRecordRepository.GetRecordsConditionAsync(new TmtnDevOpsRecordDetailSearchModel { bSolidWaste = true, C_DevStoreCode = "8793c6c8-d855-421e-9fa1-d25f914bb730", IsPagination = false, Start = DateTime.Now.AddDays(-1), End = DateTime.Now });
  172. //var devAccountConfig = await _devDevOpeAccountConfigService.GetByConditionAsync(t => t.C_DevStoreCode == "8793c6c8-d855-421e-9fa1-d25f914bb730");
  173. using (var dbContext = scope.ServiceProvider.GetService<InspectionDbContext>())
  174. {
  175. devStore = dbContext.TDEV_DevStore.AsQueryable().ToList();
  176. devStoreSpot = dbContext.TDEV_WebScadaDevSpot.AsQueryable().ToList();
  177. if (devStore != null && devStore.Count > 0)
  178. {
  179. //devStore = devStore.Where(t => t.C_Status != "0" && t.C_Status != "5").ToList();
  180. devStore = devStore.Where(t => t.C_Status != "0").ToList();
  181. }
  182. await _redisService.SetAsync("fanyibox_devStore", devStore);
  183. }
  184. if (devStore != null)
  185. {
  186. foreach (var devstore in devStore)
  187. {
  188. var predicate = PredicateBuilder.New<TDEV_WebScadaDevSpot>(true);//查询条件,推荐后台使用这种方式灵活筛选
  189. predicate = predicate.And(i => i.C_Status.Equals("1"));
  190. predicate = predicate.And(i => i.C_DevCode.Equals(devstore.C_ID));
  191. IEnumerable<TDEV_WebScadaDevSpot> items = devStoreSpot.Where(predicate).OrderBy(x => x.I_Sort).AsEnumerable();
  192. await _redisService.SetAsync("fanyibox_devStore_" + devstore.C_ID + "_spot", items);
  193. }
  194. }
  195. };
  196. await Task.Delay(10000);
  197. }
  198. catch (Exception ex)
  199. {
  200. _logger.LogInformation(ex.Message);
  201. await Task.Delay(1000);
  202. }
  203. }
  204. });
  205. Task.Run(async () =>
  206. {
  207. while (true)
  208. {
  209. try
  210. {
  211. //List<Task> tasks = new List<Task>();
  212. //tasks.Add();
  213. IEnumerable<TDEV_DevStore> devStoresList = null;
  214. using (var scope = _provider.GetRequiredService<IServiceScopeFactory>().CreateScope())
  215. {
  216. var _redisService = scope.ServiceProvider.GetService<ICacheService>();
  217. if (await _redisService.ExistsAsync("fanyibox_devStore"))
  218. {
  219. var devStores = await _redisService.GetAsync("fanyibox_devStore");
  220. if (string.IsNullOrWhiteSpace(devStores))
  221. {
  222. Console.WriteLine("队列中数据不存在!");
  223. await _redisService.SetAsync("fanyibox_error", "队列中数据不存在!");
  224. }
  225. else
  226. {
  227. devStoresList = JsonConvert.DeserializeObject<IList<TDEV_DevStore>>(devStores);
  228. if (devStoresList != null)
  229. {
  230. devStoresList = devStoresList.Where(t => t.C_Status != "0").ToList();
  231. foreach (var devstore in devStoresList)
  232. {
  233. JObject result = new JObject { { "device", new JArray() }, { "alarmlight", new JArray() } };
  234. JArray deviceJarray = new JArray();
  235. JArray alarmlightJarray = new JArray();
  236. if (!jObjectDic.ContainsKey(devstore.C_ID)) jObjectDic.TryAdd(devstore.C_ID, result);
  237. if (!jArrayDic.ContainsKey(devstore.C_ID)) jArrayDic.TryAdd(devstore.C_ID, deviceJarray);
  238. if (!alarmlightJarrayDic.ContainsKey(devstore.C_ID)) alarmlightJarrayDic.TryAdd(devstore.C_ID, alarmlightJarray);
  239. if (!webScadaDevSpotDic.ContainsKey(devstore.C_ID))
  240. webScadaDevSpotDic.TryAdd(devstore.C_ID, null);
  241. }
  242. //wait SendInterval(devStoresList);
  243. await SendIntervalNoDb(devStoresList);
  244. }
  245. }
  246. }
  247. }
  248. await Task.Delay(10000); //10000
  249. }
  250. catch (Exception ex)
  251. {
  252. log.Info("Task2-异常:" + ex.Message);
  253. await Task.Delay(1000);
  254. }
  255. }
  256. });
  257. Task.Run(async () =>
  258. {
  259. while (true)
  260. {
  261. try
  262. {
  263. IEnumerable<TDEV_DevStore> devStore = null;
  264. using (var scope = _provider.GetRequiredService<IServiceScopeFactory>().CreateScope())
  265. {
  266. var _redisService = scope.ServiceProvider.GetService<ICacheService>();
  267. if (await _redisService.ExistsAsync("fanyibox_devStore"))
  268. {
  269. var devStores = await _redisService.GetAsync("fanyibox_devStore");
  270. if (string.IsNullOrWhiteSpace(devStores))
  271. {
  272. Console.WriteLine("队列中数据不存在!");
  273. await _redisService.SetAsync("fanyibox_error", "队列中数据不存在!");
  274. }
  275. else
  276. {
  277. devStore = JsonConvert.DeserializeObject<IList<TDEV_DevStore>>(devStores);
  278. if (devStore != null)
  279. {
  280. devStore = devStore.Where(t => t.C_Status != "0").ToList();
  281. }
  282. if (devStore != null)
  283. {
  284. await WebScadaDevSpotInterval(devStore);
  285. }
  286. }
  287. }
  288. }
  289. await Task.Delay(100); //10000
  290. }
  291. catch (Exception ex)
  292. {
  293. _logger.LogInformation(ex.Message);
  294. await Task.Delay(100);
  295. }
  296. }
  297. });
  298. Task.Run(async () =>
  299. {
  300. while (true)
  301. {
  302. try
  303. {
  304. IEnumerable<TDEV_DevStore> devStoresList = null;
  305. using (var scope = _provider.GetRequiredService<IServiceScopeFactory>().CreateScope())
  306. {
  307. var _redisService = scope.ServiceProvider.GetService<ICacheService>();
  308. if (await _redisService.ExistsAsync("fanyibox_devStore"))
  309. {
  310. var devStores = await _redisService.GetAsync("fanyibox_devStore");
  311. if (string.IsNullOrWhiteSpace(devStores))
  312. {
  313. Console.WriteLine("队列中数据不存在!");
  314. await _redisService.SetAsync("fanyibox_error", "队列中数据不存在!");
  315. }
  316. else
  317. {
  318. devStoresList = JsonConvert.DeserializeObject<IList<TDEV_DevStore>>(devStores);
  319. if (devStoresList.Any())
  320. {
  321. devStoresList = devStoresList.Where(t => t.C_Status != "0").ToList();
  322. foreach (var devstore in devStoresList)
  323. {
  324. string value = _redisService.Get("fanyibox_devStore_" + devstore.C_ID);
  325. if (!string.IsNullOrWhiteSpace(value) && value != "\"\"")
  326. {
  327. var devValues = JsonConvert.DeserializeObject<JObject>(value);
  328. await AddData(devValues);
  329. }
  330. }
  331. }
  332. }
  333. }
  334. }
  335. await Task.Delay(60000);
  336. }
  337. catch (Exception ex)
  338. {
  339. _logger.LogInformation(ex.Message);
  340. await Task.Delay(1000);
  341. }
  342. }
  343. });
  344. #endregion
  345. #region //AI报警同步
  346. Task.Run(async () =>
  347. {
  348. while (true)
  349. {
  350. try
  351. {
  352. using (HttpClient httpClient = httpClientFactory.CreateClient())
  353. {
  354. var httpRequestMessage = new HttpRequestMessage
  355. {
  356. Method = HttpMethod.Get,
  357. RequestUri = new Uri(_aPIUrlData.PublicPushMessageAPI)
  358. };
  359. var response = await httpClient.SendAsync(httpRequestMessage);
  360. string responseResult = await response.Content.ReadAsStringAsync();
  361. log.Info($"AI报警数据同步接口返回【{responseResult}】");
  362. }
  363. }
  364. catch (Exception ex)
  365. {
  366. _logger.LogInformation("AI报警同步"+ex.Message);
  367. }
  368. await Task.Delay(60000);
  369. }
  370. });
  371. #endregion
  372. #region
  373. //Timer t = new Timer(async (o) => {
  374. // if (await _redisService.ExistsAsync("fanyibox_devStore"))
  375. // {
  376. // var devStores = await _redisService.GetAsync("fanyibox_devStore");
  377. // if (string.IsNullOrWhiteSpace(devStores))
  378. // {
  379. // Console.WriteLine("队列中数据不存在!");
  380. // await _redisService.SetAsync("fanyibox_error", "队列中数据不存在!");
  381. // }
  382. // else
  383. // {
  384. // IList<TDEV_DevStore> devStoresList = JsonConvert.DeserializeObject<IList<TDEV_DevStore>>(devStores);
  385. // ParallelLoopResult result = Parallel.ForEach<TDEV_DevStore>(devStoresList, (devstore, loopState, curIndex) =>
  386. // {
  387. // using (var dbContext = _dbFuncContextFactory())
  388. // {
  389. // var predicate = PredicateBuilder.New<TDEV_WebScadaDevSpot>(true);//查询条件,推荐后台使用这种方式灵活筛选
  390. // predicate = predicate.And(i => i.C_Status.Equals("1"));
  391. // predicate = predicate.And(i => i.C_DevCode.Equals(devstore.C_ID));
  392. // IEnumerable<TDEV_WebScadaDevSpot> items = dbContext.TDEV_WebScadaDevSpot.Where(predicate).AsEnumerable();
  393. // IList<TDEV_WebScadaDevSpot> itemList = items.ToList();
  394. // if (!itemList.Any())
  395. // {
  396. // _redisService.SetAsync("fanyibox_devStore_" + devstore.C_ID, string.Empty);
  397. // loopState.Break();
  398. // }
  399. // List<string> names = items.Select(x => x.C_Name).ToList();
  400. // List<string> groupnames = items.Select(x => x.C_GroupName).ToList();
  401. // List<string> calFormula = items.Select(x => x.C_CalFormula).ToList();
  402. // List<List<CalFormula>> calFormulaList = new List<List<CalFormula>>();
  403. // //var calFormulaList = JsonConvert.DeserializeObject<List<List<CalFormula>>>(JsonConvert.SerializeObject(calFormula));
  404. // foreach (var v in calFormula)
  405. // {
  406. // if (v != null)
  407. // calFormulaList.Add(JsonConvert.DeserializeObject<List<CalFormula>>(v));
  408. // }
  409. // if (calFormulaList.Count == 0)
  410. // {
  411. // calFormulaList = null;
  412. // calFormula = null;
  413. // }
  414. // string boxno = items.Select(x => x.C_BoxNo).FirstOrDefault();
  415. // string storeCode = items.Select(x => x.C_StoreCode).FirstOrDefault();
  416. // lock (_locker)
  417. // {
  418. // //var result = FanyiHelper.GetWebScadaDevSpotValue(devstore.C_ID, boxno, storeCode, names, groupnames, calFormula, _nodeServices, calFormulaList);
  419. // var result = "";
  420. // _redisService.SetAsync("fanyibox_msgalarmdic", FanyiHelper.msgAlarmDic);
  421. // _redisService.SetAsync("fanyibox_devStore_" + devstore.C_ID, result);
  422. // }
  423. // }
  424. // });
  425. // }
  426. // }
  427. // }, null, 500, 5000);
  428. //Task.Run(() =>
  429. //{
  430. // Timer t = new Timer( async (o) =>
  431. // {
  432. // if (await _redisService.ExistsAsync("fanyibox_devStore"))
  433. // {
  434. // var devStores = await _redisService.GetAsync("fanyibox_devStore");
  435. // if (string.IsNullOrWhiteSpace(devStores))
  436. // {
  437. // Console.WriteLine("队列中数据不存在!");
  438. // await _redisService.SetAsync("fanyibox_error", "队列中数据不存在!");
  439. // }
  440. // else
  441. // {
  442. // IList <TDEV_DevStore> devStoresList = JsonConvert.DeserializeObject<IList<TDEV_DevStore>>(devStores);
  443. // foreach (var devstore in devStoresList)
  444. // {
  445. // //using (var dbContext = _dbContextFactory.CreateDbContext())
  446. // using (var dbContext = _dbFuncContextFactory())
  447. // {
  448. // var predicate = PredicateBuilder.New<TDEV_WebScadaDevSpot>(true);//查询条件,推荐后台使用这种方式灵活筛选
  449. // predicate = predicate.And(i => i.C_Status.Equals("1"));
  450. // predicate = predicate.And(i => i.C_DevCode.Equals(devstore.C_ID));
  451. // IEnumerable<TDEV_WebScadaDevSpot> items = dbContext.TDEV_WebScadaDevSpot.Where(predicate).AsEnumerable();
  452. // IList<TDEV_WebScadaDevSpot> itemList = items.ToList();
  453. // if (!itemList.Any())
  454. // {
  455. // _redisService.Set("fanyibox_devStore_" + devstore.C_ID, string.Empty);
  456. // continue;
  457. // }
  458. // List<string> names = items.Select(x => x.C_Name).ToList();
  459. // List<string> groupnames = items.Select(x => x.C_GroupName).ToList();
  460. // List<string> calFormula = items.Select(x => x.C_CalFormula).ToList();
  461. // List<List<CalFormula>> calFormulaList = new List<List<CalFormula>>();
  462. // //var calFormulaList = JsonConvert.DeserializeObject<List<List<CalFormula>>>(JsonConvert.SerializeObject(calFormula));
  463. // foreach (var v in calFormula)
  464. // {
  465. // if (v != null)
  466. // calFormulaList.Add(JsonConvert.DeserializeObject<List<CalFormula>>(v));
  467. // }
  468. // if (calFormulaList.Count == 0)
  469. // {
  470. // calFormulaList = null;
  471. // calFormula = null;
  472. // }
  473. // string boxno = items.Select(x => x.C_BoxNo).FirstOrDefault();
  474. // string storeCode = items.Select(x => x.C_StoreCode).FirstOrDefault();
  475. // var result = await FanyiHelper.GetWebScadaDevSpotValue(devstore.C_ID, boxno, storeCode, names, groupnames, calFormula, _nodeServices, calFormulaList);
  476. // _redisService.Set("fanyibox_msgalarmdic", FanyiHelper.msgAlarmDic);
  477. // _redisService.Set("fanyibox_devStore_" + devstore.C_ID, result);
  478. // }
  479. // }
  480. // //查询是否还有,如果有返回yes,没有返回no
  481. // }
  482. // }
  483. // else
  484. // Thread.Sleep(500);
  485. // //为避免CPU空转,在队列为空时休息0.5秒
  486. // }, null, 500, 5000);//每5秒取一次
  487. //});
  488. #endregion
  489. return Task.CompletedTask;
  490. }
  491. private async Task Test(TDEV_DevStore devstore)
  492. {
  493. //await _redisService.SetAsync("fanyibox_devStore_" + devstore.C_ID, "");
  494. #region xiaoxi
  495. HttpClient httpClient = httpClientFactory.CreateClient();
  496. var msgData = new TpushMsgModel
  497. {
  498. C_DevStoreCode = "2ff323d3-fa27-4d02-836f-30d7c2bf6654",
  499. C_MsgTypeCode = "MSG_TYPE_012",
  500. Msg = "设备点报警",
  501. Subject = devstore.C_Name + "的设备点报警",
  502. DevNumber = devstore.C_NumberCode,
  503. DevName = devstore.C_Name,
  504. CreateOn = DateTime.Now.ToString(),
  505. UserName = "设备",
  506. GenerationType = 1,
  507. msgStatus = 1,
  508. };
  509. var httpRequestMessage = new HttpRequestMessage
  510. {
  511. Method = HttpMethod.Post,
  512. RequestUri = new Uri(_aPIUrlData.PublicPushMessageAPI),
  513. Content = new StringContent(JsonConvert.SerializeObject(msgData), Encoding.UTF8, "application/json")
  514. };
  515. var response = await httpClient.SendAsync(httpRequestMessage);
  516. string responseResult = await response.Content.ReadAsStringAsync();
  517. if (response.StatusCode != HttpStatusCode.OK)
  518. {
  519. }
  520. else
  521. {
  522. //todo
  523. }
  524. #endregion
  525. using (var scope = _provider.GetRequiredService<IServiceScopeFactory>().CreateScope())
  526. {
  527. var _redisService = scope.ServiceProvider.GetService<ICacheService>();
  528. using (var dbContext = scope.ServiceProvider.GetService<InspectionDbContext>())
  529. {
  530. //using (var dbContext = _dbFuncContextFactory())
  531. //{
  532. var predicate = PredicateBuilder.New<TDEV_WebScadaDevSpot>(true);//查询条件,推荐后台使用这种方式灵活筛选
  533. predicate = predicate.And(i => i.C_Status.Equals("1"));
  534. predicate = predicate.And(i => i.C_DevCode.Equals(devstore.C_ID));
  535. IEnumerable<TDEV_WebScadaDevSpot> items = dbContext.TDEV_WebScadaDevSpot.Where(predicate).OrderBy(x => x.I_Sort).AsEnumerable();
  536. //var list = await _repository.GetPageAsync(predicate, "I_Sort", searchModel.IsPagination, searchModel.PageIndex, searchModel.PageSize);
  537. //searchModel.TotalCount = list.Totals;
  538. //var dtoList = _mapper.Map<List<TDEV_WebScadaDevSpot>, List<TdevWebScadaDevSpotViewModel>>(list.Rows);
  539. IList<TDEV_WebScadaDevSpot> itemList = items.ToList();
  540. if (!itemList.Any())
  541. {
  542. await _redisService.SetAsync("fanyibox_devStore_" + devstore.C_ID, string.Empty);
  543. }
  544. else
  545. {
  546. List<string> devSpotCodes = items.Select(x => x.C_DevSpotCode).ToList();
  547. List<string> names = items.Select(x => x.C_Name).ToList();
  548. List<string> unitNames = items.Select(x => x.C_UnitName).ToList();
  549. List<string> groupnames = items.Select(x => x.C_GroupName).ToList();
  550. List<string> calFormula = items.Select(x => x.C_CalFormula).ToList();
  551. List<string> runs = items.Select(x => x.C_Run).ToList();
  552. List<string> Public = items.Select(x => x.C_Public).ToList();
  553. List<int> sort = items.Select(x => x.I_Sort).ToList();
  554. List<List<CalFormula>> calFormulaList = new List<List<CalFormula>>();
  555. foreach (var v in calFormula)
  556. {
  557. if (v != null)
  558. calFormulaList.Add(JsonConvert.DeserializeObject<List<CalFormula>>(v));
  559. }
  560. if (calFormulaList.Count == 0)
  561. {
  562. calFormulaList = null;
  563. calFormula = null;
  564. }
  565. string boxno = items.Select(x => x.C_BoxNo).FirstOrDefault();
  566. string storeCode = items.Select(x => x.C_StoreCode).FirstOrDefault();
  567. //lock (_locker)
  568. //{
  569. var result = await FanyiHelper.GetWebScadaDevSpotValue(boxno, storeCode, names, unitNames, groupnames, calFormula, sort, runs, _nodeServices, calFormulaList, devSpotCodes, Public);
  570. //var result = "";
  571. await _redisService.SetAsync("fanyibox_msgalarmdic", FanyiHelper.msgAlarmDic);
  572. await _redisService.SetAsync("fanyibox_devStore_" + devstore.C_ID, result);
  573. await AddData(result);
  574. string bAlaColour = "black";
  575. foreach (var ala in result["alarmlight"])
  576. {
  577. string strAlaColour = (string)ala["alarmcolour"];
  578. if (strAlaColour == "red")
  579. {
  580. bAlaColour = "red";
  581. }
  582. }
  583. if (bAlaColour == "red")
  584. {
  585. devstore.C_Status = "4";
  586. dbContext.TDEV_DevStore.Update(devstore);
  587. await dbContext.SaveChangesAsync();
  588. }
  589. else if (bAlaColour == "black")
  590. {
  591. devstore.C_Status = "2"; //后期通过TDEV_DevStore_Log取设备是否报警
  592. dbContext.TDEV_DevStore.Update(devstore);
  593. await dbContext.SaveChangesAsync();
  594. //await _pushMsgService.PushAlarmMsgAsync(new TpushMsgModel
  595. //{
  596. // C_DevStoreCode = devstore.C_ID,
  597. // C_MsgTypeCode = "MSG_TYPE_013",
  598. // Msg = "设备点报警已消除",
  599. // Subject = devstore.C_Name + "的设备点报警已消除",
  600. // DevNumber = devstore.C_NumberCode,
  601. // DevName = devstore.C_Name,
  602. //});
  603. }
  604. //}
  605. }
  606. //}
  607. }
  608. }
  609. }
  610. private static readonly object boxnolocker = new object();
  611. ConcurrentDictionary<string, JObject> jObjectDic = new ConcurrentDictionary<string, JObject>();
  612. ConcurrentDictionary<string, JArray> jArrayDic = new ConcurrentDictionary<string, JArray>();
  613. ConcurrentDictionary<string, JArray> alarmlightJarrayDic = new ConcurrentDictionary<string, JArray>();
  614. ConcurrentDictionary<string, IEnumerable<TDEV_WebScadaDevSpot>> webScadaDevSpotDic = new ConcurrentDictionary<string, IEnumerable<TDEV_WebScadaDevSpot>>();
  615. private async Task<JObject> IntervalBoxnoList(TDEV_DevStore devstore, IEnumerable<TDEV_WebScadaDevSpot> items)
  616. {
  617. List<Task> boxnotasks = new List<Task>();
  618. JObject result;
  619. lock (boxnolocker)
  620. {
  621. result = new JObject {
  622. {"device",new JArray() },{ "alarmlight", new JArray() },{ "package", new JObject() }
  623. };
  624. JArray deviceJarray = new JArray();
  625. JArray alarmlightJarray = new JArray();
  626. jObjectDic[devstore.C_ID] = result;
  627. jArrayDic[devstore.C_ID] = alarmlightJarray;
  628. alarmlightJarrayDic[devstore.C_ID] = alarmlightJarray;
  629. List<string> boxnoList = items.Select(x => x.C_BoxNo).Distinct(StringComparer.InvariantCultureIgnoreCase).ToList();
  630. if (!jObjectDic.ContainsKey(devstore.C_ID)) jObjectDic.TryAdd(devstore.C_ID, result);
  631. if (!jArrayDic.ContainsKey(devstore.C_ID)) jArrayDic.TryAdd(devstore.C_ID, deviceJarray);
  632. if (!alarmlightJarrayDic.ContainsKey(devstore.C_ID)) alarmlightJarrayDic.TryAdd(devstore.C_ID, alarmlightJarray);
  633. boxnoList.ForEach(async boxno => {
  634. boxnotasks.Add(Task.Run(async () =>
  635. {
  636. List<string> devSpotCodes = items.Where(a => a.C_BoxNo == boxno).Select(x => x.C_DevSpotCode).ToList();
  637. List<string> names = items.Where(a => a.C_BoxNo == boxno).Select(x => x.C_Name).ToList();
  638. List<string> unitNames = items.Where(a => a.C_BoxNo == boxno).Select(x => x.C_UnitName).ToList();
  639. List<string> groupnames = items.Where(a => a.C_BoxNo == boxno).Select(x => x.C_GroupName).ToList();
  640. List<string> calFormula = items.Where(a => a.C_BoxNo == boxno).Select(x => x.C_CalFormula).ToList();
  641. List<int> sort = items.Where(a => a.C_BoxNo == boxno).Select(x => x.I_Sort).ToList();
  642. List<string> Public = items.Where(a => a.C_BoxNo == boxno).Select(x => x.C_Public).ToList();
  643. List<string> runs = items.Where(a => a.C_BoxNo == boxno).Select(x => x.C_Run).ToList();
  644. List<List<CalFormula>> calFormulaList = new List<List<CalFormula>>();
  645. foreach (var v in calFormula)
  646. {
  647. if (v != null)
  648. calFormulaList.Add(JsonConvert.DeserializeObject<List<CalFormula>>(v));
  649. }
  650. if (calFormulaList.Count == 0)
  651. {
  652. calFormulaList = null;
  653. calFormula = null;
  654. }
  655. string storeCode = items.Where(a => a.C_BoxNo == boxno).Select(x => x.C_StoreCode).FirstOrDefault();
  656. JObject re = await FanyiHelper.GetWebScadaDevSpotValue(boxno, storeCode, names, unitNames, groupnames, calFormula, sort, runs, _nodeServices, calFormulaList, devSpotCodes, Public);
  657. if (re != null)
  658. {
  659. //if (devstore.C_ID == "5b6368b1-3bbb-410f-945c-4d1b2783ab47")
  660. //{
  661. jArrayDic.TryGetValue(devstore.C_ID, out deviceJarray);
  662. alarmlightJarrayDic.TryGetValue(devstore.C_ID, out alarmlightJarray);
  663. deviceJarray?.Merge(re.SelectToken("device") as JArray, new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Union });
  664. alarmlightJarray?.Merge(re.SelectToken("alarmlight") as JArray, new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Union });
  665. jArrayDic[devstore.C_ID] = deviceJarray;
  666. alarmlightJarrayDic[devstore.C_ID] = alarmlightJarray;
  667. JArray deviceOrderJarray = new JArray(deviceJarray.OrderBy(obj => (int)obj["sort"]));//升序
  668. Console.WriteLine(deviceOrderJarray);
  669. result = new JObject { { "device", deviceOrderJarray }, { "alarmlight", alarmlightJarray }, { "package", new JObject() { { "time", DateTime.Now } } } };
  670. if (devstore.C_ID == "8793c6c8-d855-421e-9fa1-d25f914bb730")
  671. {
  672. int idebug = 0;
  673. }
  674. jObjectDic[devstore.C_ID] = result;
  675. //}
  676. }
  677. await Task.Delay(100);
  678. }));
  679. });
  680. }
  681. await Task.WhenAll(boxnotasks);
  682. //Task.WaitAll();
  683. return await Task.FromResult(result);
  684. }
  685. private async Task WebScadaDevSpotInterval(IEnumerable<TDEV_DevStore> devStoresList)
  686. {
  687. //devStoresList.AsParallel().ForAll(async devstore =>
  688. //{
  689. //});
  690. foreach (var devstore in devStoresList)
  691. {
  692. using (var scope = _provider.GetRequiredService<IServiceScopeFactory>().CreateScope())
  693. {
  694. var _redisService = scope.ServiceProvider.GetService<ICacheService>();
  695. IEnumerable<TDEV_WebScadaDevSpot> items = null;
  696. webScadaDevSpotDic.TryGetValue(devstore.C_ID, out items);
  697. if (devstore.C_ID == "8793c6c8-d855-421e-9fa1-d25f914bb730")
  698. {
  699. int idebug = 0;
  700. }
  701. if (items == null || !items.ToList().Any())
  702. {
  703. await _redisService.SetAsync("fanyibox_devStore_" + devstore.C_ID, string.Empty);
  704. bool bol = await _redisService.ExistsAsync($"webSocket_devStore_{devstore.C_ID}");
  705. if (bol)
  706. {
  707. var webSocketVal = _redisService.Get($"webSocket_devStore_{devstore.C_ID}");
  708. if (webSocketVal == "1")
  709. {
  710. await _hubContext.Clients.All.SendAsync("webSocket_devStore_" + devstore.C_ID, string.Empty);
  711. }
  712. }
  713. }
  714. else
  715. {
  716. await IntervalBoxnoList(devstore, items);
  717. }
  718. }
  719. }
  720. }
  721. //private readonly object devRunLock = new object();
  722. List<JObject> jol = new List<JObject>();
  723. private async Task SendIntervalNoDb(IEnumerable<TDEV_DevStore> devStoresList)
  724. {
  725. List<Task> tasks = new List<Task>();
  726. foreach (var dev in devStoresList)
  727. {
  728. //线程
  729. tasks.Add(Task.Run(async () =>
  730. {
  731. //lock (devRunLock)
  732. //{
  733. //}
  734. using (var scope = _provider.GetRequiredService<IServiceScopeFactory>().CreateScope())
  735. {
  736. var _redisService = scope.ServiceProvider.GetService<ICacheService>();
  737. using (var dbContext = scope.ServiceProvider.GetService<InspectionDbContext>())
  738. {
  739. IEnumerable<TDEV_WebScadaDevSpot> items = _redisService.Get<IEnumerable<TDEV_WebScadaDevSpot>>("fanyibox_devStore_" + dev.C_ID + "_spot");
  740. TDEV_DevStore devstore = await dbContext.TDEV_DevStore.Where(x => x.C_ID == dev.C_ID).FirstOrDefaultAsync();
  741. if (devstore == null) {
  742. devstore = dev;
  743. }
  744. //#region 修正设备点ID
  745. //foreach (var dev in jsonObject["device"])
  746. //{
  747. // if (string.IsNullOrEmpty((string)dev["id"]) || string.IsNullOrEmpty((string)dev["value"]))
  748. // continue;
  749. // string strId = (string)dev["id"];
  750. // float dValue = (float)dev["value"];
  751. // string strName = (string)dev["name"];
  752. // var v = items.Select(y =>y.C_StoreCode == devstore.C_ID && y.C_Name == strName);
  753. //}
  754. ////更新
  755. //dbContext.TDEV_WebScadaDevSpot.UpdateRange(items);
  756. //await dbContext.SaveChangesAsync();
  757. //#endregion
  758. if (!webScadaDevSpotDic.ContainsKey(devstore.C_ID))
  759. webScadaDevSpotDic.TryAdd(devstore.C_ID, items);
  760. else
  761. {
  762. webScadaDevSpotDic[devstore.C_ID] = items;
  763. }
  764. if (items != null && items.ToList().Any())
  765. {
  766. JObject devValue = (JObject)jObjectDic[devstore.C_ID]?.DeepClone();
  767. if (devValue != null && devValue["device"].Any())
  768. {
  769. var devValues = _redisService.Get("fanyibox_devStore_" + devstore.C_ID);
  770. await _redisService.SetAsync("fanyibox_devStore_" + devstore.C_ID, devValue);
  771. await _redisService.SetAsync("fanyibox_alarmDic_" + devstore.C_ID, FanyiHelper.alarmDic);
  772. await _redisService.SetAsync("fanyibox_msgalarmdic", FanyiHelper.msgAlarmDic);
  773. if (_redisService.Exists($"webSocket_devStore_{devstore.C_ID}"))
  774. {
  775. var webSocketVal = _redisService.Get($"webSocket_devStore_{devstore.C_ID}");
  776. if (!String.Equals(devValues, devValue.ToString()) && webSocketVal == "1")
  777. {
  778. await _hubContext.Clients.All.SendAsync("webSocket_devStore_" + devstore.C_ID, devValue.ToString());
  779. log.Info($"webSocket_devStore_{devstore.C_ID}数据:【{devValue.ToString()}】");
  780. }
  781. }
  782. int alarmCount = 0;
  783. //设备点报警推送
  784. foreach (var ala in devValue["device"])
  785. {
  786. //_logger.LogInformation($"SendIntervalNoDb设备信息中【device】有数据【{devstore.C_ID},数据={ala}】 ");
  787. if (ala["id"] == null) continue;
  788. string strDotName = (string)ala["name"];
  789. string strDotRun = (string)ala["run"];
  790. if ("86b61dbd-0f45-4d68-95ed-4b7da82f3740" == devstore.C_ID) //东清 8453d5ed-8a21-4880-88e7-f872e93551bf
  791. {
  792. //jol.Add(devValue);
  793. if (!string.IsNullOrEmpty(strDotName) && strDotName.Contains("温度"))
  794. {
  795. Debug.WriteLine("温度 " + ala["value"] + DateTime.Now.ToString());
  796. //continue;
  797. }
  798. }
  799. //if (!string.IsNullOrEmpty(strDotName) && strDotName.Contains("风机") && (strDotName.Contains("主机")|| strDotName.Contains("运行")))
  800. //_logger.LogInformation($"-设备点开关机开始【设备ID={devstore.C_ID},strDotName={strDotName},strDotRun={strDotRun}】");
  801. if (!string.IsNullOrEmpty(strDotRun) && strDotRun == "1")
  802. {
  803. //_logger.LogInformation($"-设备点开关机开始-进入-Begin【设备ID={devstore.C_ID}】");
  804. if ("86b61dbd-0f45-4d68-95ed-4b7da82f3740" == devstore.C_ID)
  805. {
  806. int idebug = 0;
  807. //ala["value"] = "0";
  808. //ala["value"] = "1";
  809. }
  810. try
  811. {
  812. Convert.ToDouble(ala["value"]);
  813. }
  814. catch(Exception ex)
  815. {
  816. continue;
  817. }
  818. string nowDevStatus = Math.Abs(Convert.ToDouble(ala["value"])) > 0.01 ? "1" : "0";
  819. string strMsg = Math.Abs(Convert.ToDouble(ala["value"])) > 0.01 ? "开启" : "关闭";
  820. devstore.C_Status = Math.Abs(Convert.ToDouble(ala["value"])) > 0.01 ? ((int)DevStatusEnum.Start).ToString() : ((int)DevStatusEnum.Stop).ToString();
  821. if ("224870650814550567" == (string)ala["id"])
  822. {
  823. int idebug = 0;
  824. }
  825. string devRunStatus = _redisService.Get("fanyibox_devRunStatus_" + (string)ala["id"]);
  826. //_logger.LogInformation($"-设备点开关机开始-进入【设备ID={devstore.C_ID},nowDevStatus={nowDevStatus},strMsg={strMsg},devstore.C_Status={devstore.C_Status},devRunStatus={devRunStatus}】");
  827. if (devRunStatus.IsNullOrEmpty())
  828. {
  829. bool bSet = _redisService.Set("fanyibox_devRunStatus_" + (string)ala["id"], nowDevStatus);
  830. if (!bSet) continue;
  831. //devstore.C_Status = Math.Abs(Convert.ToDouble(ala["value"])) > 0.01 ? ((int)DevStatusEnum.Start).ToString() : ((int)DevStatusEnum.Stop).ToString();
  832. dbContext.TDEV_DevStore.Update(devstore);
  833. await dbContext.SaveChangesAsync();
  834. }
  835. if (devRunStatus?.Replace("\"", "") != nowDevStatus)
  836. {
  837. _logger.LogInformation($"-设备点开关机开始-进入状态不相等【设备ID={devstore.C_ID},nowDevStatus={nowDevStatus},devRunStatus={devRunStatus}】");
  838. bool bSet = _redisService.Set("fanyibox_devRunStatus_" + (string)ala["id"], nowDevStatus);
  839. if (!bSet) continue;
  840. //devstore.C_Status = Math.Abs(Convert.ToDouble(ala["value"])) > 0.01 ? ((int)DevStatusEnum.Start).ToString() : ((int)DevStatusEnum.Stop).ToString();
  841. HttpClient httpClient = httpClientFactory.CreateClient();
  842. DateTime time = DateTime.Now;
  843. var msgData = new TpushMsgModel
  844. {
  845. C_DevStoreCode = devstore.C_ID,
  846. C_MsgTypeCode = "MSG_TYPE_011",
  847. Msg = strMsg,
  848. Subject = "设备开启关闭报警",
  849. DevNumber = devstore.C_NumberCode,
  850. DevName = devstore.C_Name,
  851. CreateOn = time.ToString(),
  852. UserName = "设备",
  853. GenerationType = 1,
  854. msgStatus = 4,
  855. };
  856. await SnedAlarmRabbitMQ(JsonConvert.SerializeObject(msgData));//发送RabbitMQ消息-设备开关机报警
  857. #region 原设备开关机报警代码【2025-2-24】
  858. //try
  859. //{
  860. // var httpRequestMessage = new HttpRequestMessage
  861. // {
  862. // Method = HttpMethod.Post,
  863. // RequestUri = new Uri(_aPIUrlData.PublicPushMessageAPI),
  864. // Content = new StringContent(JsonConvert.SerializeObject(msgData), Encoding.UTF8, "application/json")
  865. // };
  866. // var response = await httpClient.SendAsync(httpRequestMessage);
  867. // string responseResult = await response.Content.ReadAsStringAsync();
  868. // _logger.LogInformation($"-设备点开关机开始-进入状态不相等-调用接口【设备ID={devstore.C_ID},参数={JsonConvert.SerializeObject(msgData)},接口返回结果={response.StatusCode}】");
  869. // if (response.StatusCode != HttpStatusCode.OK)
  870. // {
  871. // }
  872. // else
  873. // {
  874. // //todo
  875. // }
  876. //}
  877. //catch (Exception ex)
  878. //{
  879. // _logger.LogInformation($"-设备点开关机开始-进入状态不相等-调用接口异常【设备ID={devstore.C_ID},参数={JsonConvert.SerializeObject(msgData)} ,异常信息={ex.Message}】");
  880. //}
  881. #endregion
  882. log.Info($"-设备点开关机开始-进入状态不相等【设备ID={devstore.C_ID},ala[value]={Math.Abs(Convert.ToDouble(ala["value"]))}】");
  883. if (Math.Abs(Convert.ToDouble(ala["value"])) > 0.01)
  884. _redisService.Set("fanyibox_devStartRun_" + (string)ala["id"], DateTime.Now);
  885. if (Math.Abs(Convert.ToDouble(ala["value"])) <= 0.01)
  886. {
  887. _redisService.Set("fanyibox_devEndRun_" + (string)ala["id"], DateTime.Now);
  888. var msg = new
  889. {
  890. devStoreCode = devstore.C_ID,
  891. devRunSpot = (string)ala["id"],
  892. time = DateTime.Now
  893. };
  894. string msgStr = JsonConvert.SerializeObject(msg);
  895. log.Info($"{msgStr};发送RabbitMQ消息");
  896. await SnedRabbitMQ(msgStr);
  897. //await DevStatusChange("0", devstore.C_ID, (string)ala["id"], DateTime.Now); //设备运行状态
  898. }
  899. dbContext.TDEV_DevStore.Update(devstore);
  900. await dbContext.SaveChangesAsync();
  901. _logger.LogInformation($"-设备点开关机开始-进入状态不相等结束【设备ID={devstore.C_ID}】");
  902. }
  903. //_logger.LogInformation($"-设备点开关机开始-进入-End【设备ID={devstore.C_ID}】");
  904. }
  905. //_logger.LogInformation($"-设备点开关机结束【设备ID={devstore.C_ID},strDotName={strDotName},strDotRun={strDotRun}】");
  906. string strAlaColour = (string)ala["changecolour"];
  907. string sendmsg = _redisService.Get("fanyibox_devspot_" + (string)ala["id"]);
  908. string devspotColour = _redisService.Get("fanyibox_devspotColour_" + (string)ala["id"])?.Replace("\"", "");
  909. string redisAlaColour = strAlaColour;
  910. //_logger.LogInformation($"-设备点预警报警开始【设备ID={devstore.C_ID},strAlaColour={strAlaColour},sendmsg={sendmsg},devspotColour={devspotColour}】");
  911. if (strAlaColour != null && (strAlaColour == "red" || strAlaColour == "yellow") && ((sendmsg == "true" && devspotColour != strAlaColour) || sendmsg != "true" || sendmsg == null))
  912. {
  913. log.Info($"1log-设备点预警报警-进入报警-Begin【设备ID={devstore.C_ID};ala[id]={(string)ala["id"]};strAlaColour={strAlaColour};sendmsg={sendmsg};devspotColour={devspotColour}】---");
  914. _redisService.Set("fanyibox_devspot_" + (string)ala["id"], true);
  915. HttpClient httpClient = httpClientFactory.CreateClient();
  916. TpushMsgModel msgData = null; int updResult = 0;
  917. if (strAlaColour == "red")
  918. {
  919. msgData = new TpushMsgModel
  920. {
  921. C_DevStoreCode = devstore.C_ID,
  922. C_MsgTypeCode = "MSG_TYPE_012",
  923. Msg = devstore.C_Name + "的" + (string)ala["name"] + "设备点报警" + " 设备点值:" + (string)ala["value"],
  924. Subject = "设备点报警",
  925. DevNumber = devstore.C_NumberCode,
  926. DevName = devstore.C_Name,
  927. CreateOn = DateTime.Now.ToString(),
  928. UserName = "设备",
  929. GenerationType = 1,
  930. msgStatus = 1,
  931. };
  932. //updResult = await _tdevDevStoreRepository.UpdateDevStoreStatus(devstore.C_ID, "4");
  933. devstore.C_Status = "4";
  934. dbContext.TDEV_DevStore.Update(devstore);
  935. await dbContext.SaveChangesAsync();
  936. }
  937. if (strAlaColour == "yellow")
  938. {
  939. msgData = new TpushMsgModel
  940. {
  941. C_DevStoreCode = devstore.C_ID,
  942. C_MsgTypeCode = "MSG_TYPE_017",
  943. Msg = devstore.C_Name + "的" + (string)ala["name"] + "设备点预警" + " 设备点值:" + (string)ala["value"],
  944. Subject = "设备点预警",
  945. DevNumber = devstore.C_NumberCode,
  946. DevName = devstore.C_Name,
  947. CreateOn = DateTime.Now.ToString(),
  948. UserName = "设备",
  949. GenerationType = 1,
  950. msgStatus = 1,
  951. };
  952. //updResult = await _tdevDevStoreRepository.UpdateDevStoreStatus(devstore.C_ID, "6");
  953. devstore.C_Status = "6";
  954. dbContext.TDEV_DevStore.Update(devstore);
  955. await dbContext.SaveChangesAsync();
  956. }
  957. //_logger.LogInformation($"-设备点预警报警-进入报警-修改设备状态【设备ID={devstore.C_ID},修改结果:{updResult}】");
  958. _logger.LogInformation($"1logger-设备点预警报警-发送RabbitMQ消息-设备报警【设备ID={devstore.C_ID};ala[id]={(string)ala["id"]};strAlaColour={strAlaColour};sendmsg={sendmsg};devspotColour={devspotColour};msgData={JsonConvert.SerializeObject(msgData)}】---");
  959. log.Info($"1log-设备点预警报警-发送RabbitMQ消息-设备报警【设备ID={devstore.C_ID};ala[id]={(string)ala["id"]};strAlaColour={strAlaColour};sendmsg={sendmsg};devspotColour={devspotColour};msgData={JsonConvert.SerializeObject(msgData)}】---");
  960. await SnedAlarmRabbitMQ(JsonConvert.SerializeObject(msgData));//发送RabbitMQ消息-设备报警
  961. #region 原发送设备报警数据【2024-12-31】
  962. //try
  963. //{
  964. // var httpRequestMessage = new HttpRequestMessage
  965. // {
  966. // Method = HttpMethod.Post,
  967. // RequestUri = new Uri(_aPIUrlData.PublicPushMessageAPI),
  968. // Content = new StringContent(JsonConvert.SerializeObject(msgData), Encoding.UTF8, "application/json")
  969. // };
  970. // var response = await httpClient.SendAsync(httpRequestMessage);
  971. // string responseResult = await response.Content.ReadAsStringAsync();
  972. // _logger.LogInformation($"-设备点预警报警-进入报警-发送数据【设备ID={devstore.C_ID},发送数据={JsonConvert.SerializeObject(msgData)},返回消息结果={response.StatusCode}】");
  973. // if (response.StatusCode != HttpStatusCode.OK)
  974. // {
  975. // }
  976. // else
  977. // {
  978. // //todo
  979. // }
  980. // }
  981. // catch (Exception ex)
  982. // {
  983. // redisAlaColour = null;
  984. // _redisService.Set("fanyibox_devspot_" + (string)ala["id"], false);
  985. // _logger.LogInformation($"-设备点预警报警-进入报警-发送数据异常【设备ID={devstore.C_ID},异常信息={ex.Message}】");
  986. // throw;
  987. // }
  988. #endregion
  989. await AddDevAlarmData(devstore.C_ID);
  990. }
  991. if (strAlaColour != null && (strAlaColour != "red" && strAlaColour != "yellow") && sendmsg == "true")
  992. {
  993. log.Info($"2log-设备点预警报警-【fanyibox_devspot{ (string)ala["id"]}】修改为false【设备ID={devstore.C_ID};ala[id]={(string)ala["id"]};strAlaColour={strAlaColour};sendmsg={sendmsg};devspotColour={devspotColour}】---");
  994. _redisService.Set("fanyibox_devspot_" + (string)ala["id"], false);
  995. }
  996. if ((strAlaColour == "red" || strAlaColour == "yellow"))
  997. {
  998. alarmCount++;
  999. }
  1000. _redisService.Set("fanyibox_devspotColour_" + (string)ala["id"], redisAlaColour);
  1001. //_logger.LogInformation($"-设备点预警报警结束【设备ID={devstore.C_ID},strAlaColour={strAlaColour},sendmsg={sendmsg},存储的devspotColour={_redisService.Get("fanyibox_devspotColour_" + (string)ala["id"])}】");
  1002. }
  1003. if (alarmCount == 0)//FanyiHelper.alarmDic==null||FanyiHelper.alarmDic.Count==0
  1004. {
  1005. //int upd = await _tdevDevStoreRepository.UpdateDevStoreStatus(devstore.C_ID, "2");
  1006. devstore.C_Status = "2";
  1007. dbContext.TDEV_DevStore.Update(devstore);
  1008. await dbContext.SaveChangesAsync();
  1009. }
  1010. //await AddData(devValue);
  1011. }
  1012. await Task.Delay(10); //1000
  1013. }
  1014. //await dbContext.SaveChangesAsync();
  1015. }
  1016. }
  1017. }));
  1018. }
  1019. await Task.WhenAll(tasks);
  1020. //Task.WaitAll();
  1021. }
  1022. private async Task SendInterval(IEnumerable<TDEV_DevStore> devStoresList)
  1023. {
  1024. List<Task> tasks = new List<Task>();
  1025. //using (var dbContext = _dbFuncContextFactory())
  1026. //{
  1027. foreach (var devstore in devStoresList)
  1028. {
  1029. //线程
  1030. tasks.Add(Task.Run(async () =>
  1031. {
  1032. using (var scope = _provider.GetRequiredService<IServiceScopeFactory>().CreateScope())
  1033. {
  1034. var _redisService = scope.ServiceProvider.GetService<ICacheService>();
  1035. using (var dbContext = scope.ServiceProvider.GetService<InspectionDbContext>())
  1036. {
  1037. var predicate = PredicateBuilder.New<TDEV_WebScadaDevSpot>(true);//查询条件,推荐后台使用这种方式灵活筛选
  1038. predicate = predicate.And(i => i.C_Status.Equals("1"));
  1039. predicate = predicate.And(i => i.C_DevCode.Equals(devstore.C_ID));
  1040. IEnumerable<TDEV_WebScadaDevSpot> items = dbContext.TDEV_WebScadaDevSpot.Where(predicate).OrderBy(x => x.I_Sort).AsEnumerable();
  1041. if (!webScadaDevSpotDic.ContainsKey(devstore.C_ID))
  1042. webScadaDevSpotDic.TryAdd(devstore.C_ID, items);
  1043. else
  1044. {
  1045. webScadaDevSpotDic[devstore.C_ID] = items;
  1046. }
  1047. if (items != null && items.ToList().Any())
  1048. {
  1049. //var result = await IntervalBoxnoList(devstore, items);
  1050. //lock (_locker)
  1051. //{
  1052. // var result = await FanyiHelper.GetWebScadaDevSpotValue(boxno, storeCode, names, unitNames, groupnames, calFormula, _nodeServices, calFormulaList);
  1053. if (jObjectDic[devstore.C_ID]["device"].Any())
  1054. {
  1055. await _redisService.SetAsync("fanyibox_devStore_" + devstore.C_ID, jObjectDic[devstore.C_ID]);
  1056. await _redisService.SetAsync("fanyibox_alarmDic_" + devstore.C_ID, FanyiHelper.alarmDic);
  1057. await _redisService.SetAsync("fanyibox_msgalarmdic", FanyiHelper.msgAlarmDic);
  1058. #region 开关机
  1059. //foreach (var oc in result["device"])
  1060. //{
  1061. // string oldResult = await _redisService.GetAsync("fanyibox_devStore_" + (string)oc["id"]);
  1062. // if (string.IsNullOrWhiteSpace(oldResult))
  1063. // continue;
  1064. // JObject jObjectContent = JsonConvert.DeserializeObject<JObject>(oldResult);
  1065. // string strContent = JsonConvert.SerializeObject(jObjectContent["device"]);
  1066. // string strNewContent = JsonConvert.SerializeObject(result);
  1067. // if (string.IsNullOrEmpty(strContent) || string.IsNullOrEmpty(strNewContent))
  1068. // continue;
  1069. // else
  1070. // {
  1071. // JArray ja = JsonConvert.DeserializeObject<JArray>(strContent);
  1072. // for (int i = 0; i < ja.Count; i++)
  1073. // {
  1074. // JObject jo = JObject.Parse(strContent);
  1075. // if (jo["name"].ToString().Contains("风机") && jo["name"].ToString().Contains("主机"))
  1076. // {
  1077. // JArray jaNew = JsonConvert.DeserializeObject<JArray>(strNewContent);
  1078. // var jt = jaNew.FirstOrDefault(x => x.Value<string>("name").Contains("风机") && x.Value<string>("name").Contains("主机"));
  1079. // var oldFenjiValue = jt.Value<string>("value");
  1080. // if (string.IsNullOrWhiteSpace(oldFenjiValue) || oldFenjiValue == jo["value"].ToString())
  1081. // {
  1082. // break;
  1083. // }
  1084. // HttpClient httpClient = httpClientFactory.CreateClient();
  1085. // var msgData = new DevOperateCreateModel
  1086. // {
  1087. // C_DevStoreCode = devstore.C_ID,
  1088. // C_LogMsg = "设备开启关闭",
  1089. // C_Remark = jo["value"].ToString() == "1" ? "开启" : "关闭",
  1090. // C_Type = jo["value"].ToString() == "1" ? "2" : "3",
  1091. // };
  1092. // var httpRequestMessage = new HttpRequestMessage
  1093. // {
  1094. // Method = HttpMethod.Post,
  1095. // RequestUri = new Uri("http://www.dgt.net.cn:93/api/TdevDevStore/DevOperateByQRCodeAsync"),
  1096. // Content = new StringContent(JsonConvert.SerializeObject(msgData), Encoding.UTF8, "application/json")
  1097. // };
  1098. // var response = await httpClient.SendAsync(httpRequestMessage);
  1099. // string responseResult = await response.Content.ReadAsStringAsync();
  1100. // if (response.StatusCode != HttpStatusCode.OK)
  1101. // {
  1102. // }
  1103. // else
  1104. // {
  1105. // //todo
  1106. // }
  1107. // }
  1108. // }
  1109. // }
  1110. //}
  1111. #endregion
  1112. //await _redisService.SetAsync("fanyibox_devStore_" + devstore.C_ID, result);
  1113. await AddData(jObjectDic[devstore.C_ID]);
  1114. //string sChange = await _redisService.GetAsync("fanyibox_devStoreChange_" + devstore.C_ID);
  1115. //ceshi
  1116. //DateTime startTime = await _redisService.GetAsync<DateTime>("fanyibox_devStartRun_" + "224873679711261516");
  1117. //DateTime endTime = await _redisService.GetAsync<DateTime>("fanyibox_devEndRun_" + "224873679711261516");
  1118. //await GetMeanData("224873679711261516", DateTime.UtcNow.AddMinutes(-5), DateTime.UtcNow);
  1119. //if (!startTime.IsNotEmptyOrNull()&& !endTime.IsNotEmptyOrNull())
  1120. //await GetMeanData("224873679711261516", startTime, endTime);
  1121. //设备点报警推送
  1122. foreach (var ala in jObjectDic[devstore.C_ID]["device"])
  1123. {
  1124. string strDotName = (string)ala["name"];
  1125. if (strDotName.Contains("风机") && strDotName.Contains("主机"))
  1126. {
  1127. string devRunStatus = await _redisService.GetAsync("fanyibox_devRunStatus_" + (string)ala["id"]);
  1128. if (devRunStatus.IsNullOrEmpty())
  1129. {
  1130. await _redisService.SetAsync("fanyibox_devRunStatus_" + (string)ala["id"], (string)ala["value"]);
  1131. devstore.C_Status = (string)ala["value"] == "1" ? ((int)DevStatusEnum.Start).ToString() : ((int)DevStatusEnum.Stop).ToString();
  1132. dbContext.TDEV_DevStore.Update(devstore);
  1133. await dbContext.SaveChangesAsync();
  1134. }
  1135. if (devRunStatus?.Replace("\"", "") != (string)ala["value"])
  1136. {
  1137. //await AddDevAlarmData(devstore.C_ID);//测试
  1138. await _redisService.SetAsync("fanyibox_devRunStatus_" + (string)ala["id"], (string)ala["value"]);
  1139. devstore.C_Status = (string)ala["value"] == "1" ? ((int)DevStatusEnum.Start).ToString() : ((int)DevStatusEnum.Stop).ToString();
  1140. dbContext.TDEV_DevStore.Update(devstore);
  1141. await dbContext.SaveChangesAsync();
  1142. if ((string)ala["value"] == "1")
  1143. await _redisService.SetAsync("fanyibox_devStartRun_" + (string)ala["id"], DateTime.Now);
  1144. if ((string)ala["value"] == "0")
  1145. {
  1146. await _redisService.SetAsync("fanyibox_devEndRun_" + (string)ala["id"], DateTime.Now);
  1147. //await this._dispatcher.Broadcast(new DevEvent("devrunend", (string)ala["id"]));
  1148. //var tdevDevStoreUpdateModel = new TdevDevStoreUpdateModel
  1149. //{
  1150. // C_Status = devstore.C_Status,
  1151. //};
  1152. //var httpRequestMessage = new HttpRequestMessage
  1153. //{
  1154. // Method = HttpMethod.Put,
  1155. // RequestUri = new Uri("http://www.dgt.net.cn:93/api/Account/UpdateDevStoreAsync" + devstore.C_ID),
  1156. // Content = new StringContent(JsonConvert.SerializeObject(tdevDevStoreUpdateModel), Encoding.UTF8, "application/json")
  1157. //};
  1158. //await httpClient.SendAsync(httpRequestMessage);
  1159. await DevStatusChange((string)ala["value"], devstore.C_ID, (string)ala["id"], DateTime.Now);
  1160. }
  1161. HttpClient httpClient = httpClientFactory.CreateClient();
  1162. //var msgData = new DevOperateCreateModel
  1163. //{
  1164. // C_DevStoreCode = devstore.C_ID,
  1165. // C_LogMsg = "设备开启关闭",
  1166. // C_Remark = (string)ala["value"] == "1" ? "开启" : "关闭",
  1167. // C_Type = (string)ala["value"] == "1" ? "2" : "3",
  1168. //};
  1169. #region 开启关闭报警
  1170. #endregion
  1171. var msgData = new TpushMsgModel
  1172. {
  1173. C_DevStoreCode = devstore.C_ID,
  1174. C_MsgTypeCode = "MSG_TYPE_011",
  1175. Msg = (string)ala["value"] == "1" ? "开启" : "关闭",
  1176. Subject = "设备开启关闭报警",
  1177. DevNumber = devstore.C_NumberCode,
  1178. DevName = devstore.C_Name,
  1179. CreateOn = DateTime.Now.ToString(),
  1180. UserName = "设备",
  1181. GenerationType = 1,
  1182. msgStatus = 4,
  1183. };
  1184. var httpRequestMessage = new HttpRequestMessage
  1185. {
  1186. Method = HttpMethod.Post,
  1187. RequestUri = new Uri(_aPIUrlData.PublicPushMessageAPI),
  1188. Content = new StringContent(JsonConvert.SerializeObject(msgData), Encoding.UTF8, "application/json")
  1189. };
  1190. var response = await httpClient.SendAsync(httpRequestMessage);
  1191. string responseResult = await response.Content.ReadAsStringAsync();
  1192. if (response.StatusCode != HttpStatusCode.OK)
  1193. {
  1194. }
  1195. else
  1196. {
  1197. //todo
  1198. }
  1199. //var doData = new DevOperateCreateModel
  1200. //{
  1201. // C_DevStoreCode = devstore.C_ID,
  1202. // C_Type = (string)ala["value"] == "1" ? "1" : "2",
  1203. // C_LogMsg = (string)ala["value"] == "1" ? "开启" : "关闭",
  1204. // C_Remark = "设备开关机",
  1205. //};
  1206. //var dohttpRequestMessage = new HttpRequestMessage
  1207. //{
  1208. // Method = HttpMethod.Post,
  1209. // RequestUri = new Uri("http://www.dgt.net.cn:93/api/TdevDevStore/DevOperateByQRCodeAsync"),
  1210. // Content = new StringContent(JsonConvert.SerializeObject(doData), Encoding.UTF8, "application/json")
  1211. //};
  1212. //var responseTwo = await httpClient.SendAsync(dohttpRequestMessage);
  1213. //await responseTwo.Content.ReadAsStringAsync();
  1214. }
  1215. }
  1216. string strAlaColour = (string)ala["changecolour"];
  1217. string sendmsg = await _redisService.GetAsync("fanyibox_devspot_" + (string)ala["id"]);
  1218. if ((string)ala["id"] == "224870650814550567")
  1219. {
  1220. int a = 1;
  1221. }
  1222. if (strAlaColour != null && strAlaColour == "red" && sendmsg != "true")
  1223. {
  1224. await _redisService.SetAsync("fanyibox_devspot_" + (string)ala["id"], true);
  1225. HttpClient httpClient = httpClientFactory.CreateClient();
  1226. var msgData = new TpushMsgModel
  1227. {
  1228. C_DevStoreCode = devstore.C_ID,
  1229. C_MsgTypeCode = "MSG_TYPE_012",
  1230. Msg = devstore.C_Name + "的" + (string)ala["name"] + "设备点报警" + " 设备点值:" + (string)ala["value"],
  1231. Subject = "设备点报警",
  1232. DevNumber = devstore.C_NumberCode,
  1233. DevName = devstore.C_Name,
  1234. CreateOn = DateTime.Now.ToString(),
  1235. UserName = "设备",
  1236. GenerationType = 1,
  1237. msgStatus = 1,
  1238. };
  1239. var httpRequestMessage = new HttpRequestMessage
  1240. {
  1241. Method = HttpMethod.Post,
  1242. RequestUri = new Uri(_aPIUrlData.PublicPushMessageAPI),
  1243. Content = new StringContent(JsonConvert.SerializeObject(msgData), Encoding.UTF8, "application/json")
  1244. };
  1245. var response = await httpClient.SendAsync(httpRequestMessage);
  1246. string responseResult = await response.Content.ReadAsStringAsync();
  1247. if (response.StatusCode != HttpStatusCode.OK)
  1248. {
  1249. }
  1250. else
  1251. {
  1252. //todo
  1253. }
  1254. await AddDevAlarmData(devstore.C_ID);
  1255. }
  1256. if (strAlaColour != null && strAlaColour != "red" && sendmsg == "true")
  1257. {
  1258. await _redisService.SetAsync("fanyibox_devspot_" + (string)ala["id"], false);
  1259. }
  1260. }
  1261. #region 放到设备点中了
  1262. //bool bChange = false;
  1263. //string bAlaColour = "black";
  1264. //foreach (var ala in result["alarmlight"])
  1265. //{
  1266. // string strAlaColour = (string)ala["alarmcolour"];
  1267. // if (strAlaColour == "red")
  1268. // {
  1269. // bAlaColour = "red";
  1270. // }
  1271. //}
  1272. //if (bAlaColour == "red" && !bChange)
  1273. //{
  1274. // devstore.C_Status = "4";
  1275. // dbContext.TDEV_DevStore.Update(devstore);
  1276. // await dbContext.SaveChangesAsync();
  1277. // bChange = true;
  1278. // HttpClient httpClient = httpClientFactory.CreateClient();
  1279. // var msgData = new TpushMsgModel
  1280. // {
  1281. // C_DevStoreCode = devstore.C_ID,
  1282. // C_MsgTypeCode = "MSG_TYPE_012",
  1283. // Msg = "设备点报警",
  1284. // Subject = devstore.C_Name + "的设备点报警",
  1285. // DevNumber = devstore.C_NumberCode,
  1286. // DevName = devstore.C_Name,
  1287. // CreateOn = DateTime.Now.ToString(),
  1288. // UserName = "设备",
  1289. // };
  1290. // var httpRequestMessage = new HttpRequestMessage
  1291. // {
  1292. // Method = HttpMethod.Post,
  1293. // RequestUri = new Uri("http://www.dgt.net.cn:93/api/Account/PublicPushMessage"),
  1294. // Content = new StringContent(JsonConvert.SerializeObject(msgData), Encoding.UTF8, "application/json")
  1295. // };
  1296. // var response = await httpClient.SendAsync(httpRequestMessage);
  1297. // string responseResult = await response.Content.ReadAsStringAsync();
  1298. // if (response.StatusCode != HttpStatusCode.OK)
  1299. // {
  1300. // }
  1301. // else
  1302. // {
  1303. // //todo
  1304. // }
  1305. //}
  1306. //else if (bAlaColour == "black" && bChange)
  1307. //{
  1308. // devstore.C_Status = "1"; //2 后期通过TDEV_DevStore_Log取设备是否报警
  1309. // dbContext.TDEV_DevStore.Update(devstore);
  1310. // await dbContext.SaveChangesAsync();
  1311. // bChange = false;
  1312. // HttpClient httpClient = httpClientFactory.CreateClient();
  1313. // var msgData = new TpushMsgModel
  1314. // {
  1315. // C_DevStoreCode = devstore.C_ID,
  1316. // C_MsgTypeCode = "MSG_TYPE_013",
  1317. // Msg = "设备点报警已消除",
  1318. // Subject = devstore.C_Name + "的设备点报警已消除",
  1319. // DevNumber = devstore.C_NumberCode,
  1320. // DevName = devstore.C_Name,
  1321. // CreateOn = DateTime.Now.ToString(),
  1322. // UserName = "设备",
  1323. // };
  1324. // var httpRequestMessage = new HttpRequestMessage
  1325. // {
  1326. // Method = HttpMethod.Post,
  1327. // RequestUri = new Uri("http://www.dgt.net.cn:93/api/Account/PublicPushMessage"),
  1328. // Content = new StringContent(JsonConvert.SerializeObject(msgData), Encoding.UTF8, "application/json")
  1329. // };
  1330. // var response = await httpClient.SendAsync(httpRequestMessage);
  1331. // string responseResult = await response.Content.ReadAsStringAsync();
  1332. // if (response.StatusCode != HttpStatusCode.OK)
  1333. // {
  1334. // }
  1335. // else
  1336. // {
  1337. // //todo
  1338. // }
  1339. //}
  1340. #endregion
  1341. //}
  1342. }
  1343. // await Task.Delay(4000);
  1344. }
  1345. }
  1346. }
  1347. }));
  1348. }
  1349. //}
  1350. await Task.WhenAll(tasks);
  1351. //Task.WaitAll();
  1352. }
  1353. //声明InfluxDbClient
  1354. private async Task SendAlarmMsg(string devStoreId)
  1355. {
  1356. Dictionary<string, DeviceVlue> alarmDic = null;
  1357. using (var scope = _provider.GetRequiredService<IServiceScopeFactory>().CreateScope())
  1358. {
  1359. var _redisService = scope.ServiceProvider.GetService<ICacheService>();
  1360. if (await _redisService.ExistsAsync("fanyibox_alarmDic_" + devStoreId))
  1361. {
  1362. string sAlarmDic = await _redisService.GetAsync("fanyibox_alarmDic_" + devStoreId);
  1363. if (string.IsNullOrWhiteSpace(sAlarmDic))
  1364. {
  1365. Console.WriteLine("队列中数据不存在!");
  1366. }
  1367. else
  1368. {
  1369. alarmDic = JsonConvert.DeserializeObject<Dictionary<string, DeviceVlue>>(sAlarmDic);
  1370. if (alarmDic != null)
  1371. {
  1372. foreach (var alarm in alarmDic)
  1373. {
  1374. }
  1375. }
  1376. }
  1377. }
  1378. }
  1379. }
  1380. private void IniInflux()
  1381. {
  1382. //连接InfluxDb的API地址、账号、密码
  1383. var infuxUrl = _IniInfluxData.infuxUrl;// "http://60.204.212.71:8085/";
  1384. var infuxUser = _IniInfluxData.infuxUser;// "admin";
  1385. var infuxPwd = _IniInfluxData.infuxPwd;// "123456";
  1386. //创建InfluxDbClient实例
  1387. clientDb = new InfluxDbClient(infuxUrl, infuxUser, infuxPwd, InfluxDbVersion.Latest);
  1388. }
  1389. /// <summary>
  1390. /// 从InfluxDB中读取数据
  1391. /// </summary>
  1392. public async Task GetData()
  1393. {
  1394. //传入查询命令,支持多条
  1395. var queries = new[]
  1396. {
  1397. " SELECT * FROM fanyidev WHERE time> now() - 24h "
  1398. };
  1399. var dbName = "fanyidb";
  1400. //从指定库中查询数据
  1401. var response = await clientDb.Client.QueryAsync(queries, dbName);
  1402. //得到Serie集合对象(返回执行多个查询的结果)
  1403. var series = response.ToList();
  1404. //取出第一条命令的查询结果,是一个集合
  1405. var list = series[0].Values;
  1406. //从集合中取出第一条数据
  1407. var info_model = list.FirstOrDefault();
  1408. }
  1409. public async Task<string> GetMeanData(string id, DateTime start, DateTime end)
  1410. {
  1411. //传入查询命令,支持多条
  1412. var queries = new[]
  1413. {
  1414. //"SELECT mean(Val) FROM fanyidev where (Id ='"+id+"') and time > '"+ start.ToUniversalTime().ToString("yyyy-MM-dd hh:mm:ss") +"' and time < '" + end.ToUniversalTime().ToString("yyyy-MM-dd hh:mm:ss") + "'"
  1415. "SELECT mean(Val) FROM fanyidev where (Id ='"+id+"') and time > '"+ start.AddHours(-8).ToString("yyyy-MM-ddTHH:mm:ssZ") +"' and time < '" + end.AddHours(-8).ToString("yyyy-MM-ddTHH:mm:ssZ") + "' TZ('Asia/Shanghai')"
  1416. //"SELECT mean(Val) FROM fanyidev where (Id ='224873679711261516') and time > now() - 5m and time < now()"
  1417. };
  1418. var dbName = "fanyidb";
  1419. //从指定库中查询数据
  1420. var response = await clientDb.Client.QueryAsync(queries, dbName);
  1421. if (!response.Any())
  1422. return "0";
  1423. //得到Serie集合对象(返回执行多个查询的结果)
  1424. var series = response.ToList();
  1425. //取出第一条命令的查询结果,是一个集合
  1426. var list = series[0].Values;
  1427. //从集合中取出第一条数据
  1428. var info_model = list.FirstOrDefault();
  1429. Console.WriteLine($"GetMeanData from DevEvent: ${info_model[1]}");
  1430. using (var scope = _provider.GetRequiredService<IServiceScopeFactory>().CreateScope())
  1431. {
  1432. var _redisService = scope.ServiceProvider.GetService<ICacheService>();
  1433. await _redisService.SetAsync("fanyibox_devspot_mean_" + id, info_model[1]);
  1434. }
  1435. return info_model[1]?.ToString();
  1436. }
  1437. public async Task<string> GetDataMax(string id, DateTime start, DateTime end)
  1438. {
  1439. //传入查询命令,支持多条
  1440. var queries = new[]
  1441. {
  1442. "SELECT Max(Val) FROM fanyidev where (Id ='"+id+"') and time > '"+ start.AddHours(-8).ToString("yyyy-MM-ddTHH:mm:ssZ") +"' and time < '" + end.AddHours(-8).ToString("yyyy-MM-ddTHH:mm:ssZ") + "' TZ('Asia/Shanghai')"
  1443. };
  1444. var dbName = "fanyidb";
  1445. //从指定库中查询数据
  1446. var response = await clientDb.Client.QueryAsync(queries, dbName);
  1447. if (!response.Any())
  1448. return "0";
  1449. //得到Serie集合对象(返回执行多个查询的结果)
  1450. var series = response.ToList();
  1451. //取出第一条命令的查询结果,是一个集合
  1452. var list = series[0].Values;
  1453. //从集合中取出第一条数据
  1454. var info_model = list.FirstOrDefault();
  1455. Console.WriteLine($"GetMeanData from DevEvent: ${info_model[1]}");
  1456. using (var scope = _provider.GetRequiredService<IServiceScopeFactory>().CreateScope())
  1457. {
  1458. var _redisService = scope.ServiceProvider.GetService<ICacheService>();
  1459. await _redisService.SetAsync("fanyibox_devspot_max_" + id, info_model[1]);
  1460. }
  1461. return info_model[1]?.ToString();
  1462. }
  1463. public async Task<string> GetDataMin(string id, DateTime start, DateTime end)
  1464. {
  1465. //传入查询命令,支持多条
  1466. var queries = new[]
  1467. {
  1468. "SELECT MIN(Val) FROM fanyidev where (Id ='"+id+"') and time > '"+ start.AddHours(-8).ToString("yyyy-MM-ddTHH:mm:ssZ") +"' and time < '" + end.AddHours(-8).ToString("yyyy-MM-ddTHH:mm:ssZ") + "' TZ('Asia/Shanghai')"
  1469. };
  1470. var dbName = "fanyidb";
  1471. //从指定库中查询数据
  1472. var response = await clientDb.Client.QueryAsync(queries, dbName);
  1473. if (!response.Any())
  1474. return "0";
  1475. //得到Serie集合对象(返回执行多个查询的结果)
  1476. var series = response.ToList();
  1477. //取出第一条命令的查询结果,是一个集合
  1478. var list = series[0].Values;
  1479. //从集合中取出第一条数据
  1480. var info_model = list.FirstOrDefault();
  1481. Console.WriteLine($"GetMeanData from DevEvent: ${info_model[1]}");
  1482. using (var scope = _provider.GetRequiredService<IServiceScopeFactory>().CreateScope())
  1483. {
  1484. var _redisService = scope.ServiceProvider.GetService<ICacheService>();
  1485. await _redisService.SetAsync("fanyibox_devspot_min_" + id, info_model[1]);
  1486. }
  1487. return info_model[1]?.ToString();
  1488. }
  1489. public async Task<int> GetDevAlarmData(string id, DateTime start, DateTime end)
  1490. {
  1491. //传入查询命令,支持多条
  1492. var queries = new[]
  1493. {
  1494. //"SELECT Max(Val) FROM fanyidevalarm where (Id ='"+id+"') and time > '"+ start.ToUniversalTime().ToString("yyyy-MM-dd hh:mm:ss") +"' and time < '" + end.ToUniversalTime().ToString("yyyy-MM-dd hh:mm:ss") + "'"
  1495. "SELECT Max(Val) FROM fanyidevalarm where (Id ='"+id+"') and time > '"+ start.AddHours(-8).ToString("yyyy-MM-ddTHH:mm:ssZ") +"' and time < '" + end.AddHours(-8).ToString("yyyy-MM-ddTHH:mm:ssZ") + "' TZ('Asia/Shanghai')"
  1496. //"SELECT mean(Val) FROM fanyidev where (Id ='224873679711261516') and time > now() - 5m and time < now()"
  1497. };
  1498. var dbName = "fanyidb";
  1499. //从指定库中查询数据
  1500. var response = await clientDb.Client.QueryAsync(queries, dbName);
  1501. if (!response.Any())
  1502. return 0;
  1503. //得到Serie集合对象(返回执行多个查询的结果)
  1504. var series = response.ToList();
  1505. //取出第一条命令的查询结果,是一个集合
  1506. var list = series[0].Values;
  1507. //从集合中取出第一条数据
  1508. var info_model = list.FirstOrDefault();
  1509. if (!info_model.Any())
  1510. return 0;
  1511. Console.WriteLine($"GetMeanData from DevEvent: ${info_model[1]}");
  1512. return await Task.FromResult<int>(Convert.ToInt32(info_model[1]));
  1513. }
  1514. /// <summary>
  1515. /// 往InfluxDB中写入数据
  1516. /// </summary>
  1517. public async Task AddData(JObject jsonObject)
  1518. {
  1519. IList<Point> points = new List<Point>();
  1520. var dbName = "fanyidb";
  1521. foreach (var dev in jsonObject["device"])
  1522. {
  1523. try
  1524. {
  1525. if (string.IsNullOrEmpty((string)dev["id"]) || string.IsNullOrEmpty((string)dev["value"]) || (string)dev["value"] == "null")
  1526. continue;
  1527. bool isDecimal = Regex.IsMatch((string)dev["value"], @"^\d+(\.\d+)?$");//true是非负数的整数和小数
  1528. if ((string)dev["value"] == "NaN" || !isDecimal)
  1529. {
  1530. continue;
  1531. }
  1532. string strId = (string)dev["id"];
  1533. string strDevSpotCode = (string)dev["devSpotCode"];
  1534. float dValue = Convert.ToSingle((string)dev["value"]);
  1535. string strName = (string)dev["name"];
  1536. //string unitName = (string)dev["unitName"];
  1537. var point_model = new Point()
  1538. {
  1539. Name = "fanyidev",//表名
  1540. Tags = new Dictionary<string, object>()
  1541. {
  1542. { "Id", strDevSpotCode },
  1543. //{ "Id", strId + "-" + strDevSpotCode },
  1544. //{ "code", strDevSpotCode },
  1545. { "name", strName }
  1546. // ,
  1547. //{ "unitName", unitName }
  1548. },
  1549. Fields = new Dictionary<string, object>()
  1550. {
  1551. { "Val",dValue }
  1552. },
  1553. Timestamp = DateTime.UtcNow //DateTime.Now
  1554. };
  1555. points.Add(point_model);
  1556. //从指定库中写入数据,支持传入多个对象的集合
  1557. //var response = await clientDb.Client.WriteAsync(point_model, dbName);
  1558. }
  1559. catch (Exception ex)
  1560. {
  1561. continue;
  1562. }
  1563. }
  1564. if (points.Any())
  1565. await clientDb.Client.WriteAsync(points, dbName);
  1566. }
  1567. public async Task AddDevAlarmData(string devId)
  1568. {
  1569. var point_model = new Point()
  1570. {
  1571. Name = "fanyidevalarm",//表名
  1572. Tags = new Dictionary<string, object>()
  1573. {
  1574. { "Id", devId }
  1575. },
  1576. Fields = new Dictionary<string, object>()
  1577. {
  1578. { "Val",1 }
  1579. },
  1580. Timestamp = DateTime.UtcNow
  1581. };
  1582. var dbName = "fanyidb";
  1583. //从指定库中写入数据,支持传入多个对象的集合
  1584. var response = await clientDb.Client.WriteAsync(point_model, dbName);
  1585. }
  1586. /// <summary>
  1587. /// 运行台账-【固定的实体字段】
  1588. /// </summary>
  1589. /// <param name="devStatus"></param>
  1590. /// <param name="devStoreCode"></param>
  1591. /// <param name="devRunSpot"></param>
  1592. /// <returns></returns>
  1593. private async Task DevStatusChange0(string devStatus, string devStoreCode, string devRunSpot)
  1594. {
  1595. try
  1596. {
  1597. //运行台账
  1598. if (devStatus == "0")
  1599. {
  1600. using (var scope = _provider.GetRequiredService<IServiceScopeFactory>().CreateScope())
  1601. {
  1602. var _redisService = scope.ServiceProvider.GetService<ICacheService>();
  1603. using (var dbContext = scope.ServiceProvider.GetService<InspectionDbContext>())
  1604. {
  1605. //using (var dbContext = _dbFuncContextFactory())
  1606. //{
  1607. //var devStoreLogSet = dbContext.GetDbSet<TDEV_DevStoreLog>().AsNoTracking();
  1608. //var devStoreStartLog = devStoreLogSet.Where(x => x.C_Type == ((int)DevStatusEnum.Start).ToString()).OrderByDescending(x => x.D_CreateOn).Take(1).FirstOrDefault();
  1609. //if (devStoreStartLog == null) goto next;
  1610. //var devstore_log_datas = devStoreLogSet.Where(t => t.C_DeviceCode == devStoreCode && t.D_CreateOn > devStoreStartLog.D_CreateOn).OrderByDescending(x => x.D_CreateOn);//.Take(5)
  1611. //bool isAlarm = devstore_log_datas.Where(t => t.C_Type == ((int)DevStatusEnum.Alarm).ToString()).Any() ? true : false;
  1612. bool isAlarm = false;
  1613. var devOpeAccountS = dbContext.GetDbSet<TDEV_DevOpeAccount>();
  1614. //读取特性,属性名
  1615. //PropertyInfo[] peroperties = typeof(TdevDevOpeContentViewModel).GetProperties(BindingFlags.Public | BindingFlags.Instance);
  1616. //foreach (PropertyInfo property in peroperties)
  1617. //{
  1618. // object[] objs = property.GetCustomAttributes(typeof(DescriptionAttribute), true);
  1619. // if (objs.Length > 0)
  1620. // {
  1621. // Console.WriteLine("{0}: {1}", property.Name, ((DescriptionAttribute)objs[0]).Description);
  1622. // }
  1623. //}
  1624. //var result = await FanyiHelper.GetWebScadaDevSpotValue(boxno, storeCode, names, unitNames, groupnames, calFormula, _nodeServices, calFormulaList);
  1625. var devStore = await _tdevDevStoreRepository.GetByConditionAsync(x => x.C_ID == devStoreCode);
  1626. string sRunSpotConfig = devStore.FirstOrDefault().C_RunSpotConfig;
  1627. if (string.IsNullOrEmpty(sRunSpotConfig))
  1628. return;
  1629. TdevDevStoreRunSpotConfigViewModel runSpotConfig = JsonConvert.DeserializeObject<TdevDevStoreRunSpotConfigViewModel>(sRunSpotConfig);
  1630. if (!runSpotConfig.RunSpotConfigList.Any())
  1631. return;
  1632. var devSpotGroupNames = runSpotConfig?.RunSpotConfigList?.Where(x => x.BReadDevSpot == true).Select(y => y.DevSpotGroupName).ToList();
  1633. var devSpotNames = runSpotConfig?.RunSpotConfigList?.Where(x => x.BReadDevSpot == true).Select(y => y.DevSpotName).ToList();
  1634. var devSpotBoxNos = runSpotConfig?.RunSpotConfigList?.Where(x => x.BReadDevSpot == true).Select(y => y.DevSpotBoxNo).ToList();
  1635. //if(devSpotBoxNos.Any())
  1636. var devSpotValues = await FanyiHelper.GetDevSpotValue(devSpotBoxNos.FirstOrDefault(), devSpotNames, devSpotGroupNames);
  1637. string fSpotId = devSpotValues?.Where(x => x.name == devSpotNames.FirstOrDefault()).FirstOrDefault()?.id.ToString();
  1638. string sSpotId = devSpotValues?.Where(x => x.name == devSpotNames.ElementAtOrDefault(1)).FirstOrDefault()?.id.ToString();
  1639. DateTime startTime = await _redisService.GetAsync<DateTime>("fanyibox_devStartRun_" + devRunSpot);
  1640. DateTime endTime = await _redisService.GetAsync<DateTime>("fanyibox_devEndRun_" + devRunSpot);
  1641. if (startTime.IsNotEmptyOrNull() && endTime.IsNotEmptyOrNull())
  1642. {
  1643. isAlarm = await GetDevAlarmData(devStoreCode, startTime, endTime) >= 1;
  1644. if (!string.IsNullOrEmpty(fSpotId))
  1645. await GetMeanData(fSpotId, startTime, endTime);
  1646. if (!string.IsNullOrEmpty(sSpotId))
  1647. await GetMeanData(sSpotId, startTime, endTime);
  1648. }
  1649. var solidWasteRecordItems = await _tmtnDevOpsRecordRepository.GetRecordsConditionAsync(new TmtnDevOpsRecordDetailSearchModel { bSolidWaste = true, C_DevStoreCode = devStoreCode, IsPagination = false, Start = startTime, End = endTime });
  1650. List<SolidWaste> DevOpsRecordSolidWaste = new List<SolidWaste>();
  1651. if (solidWasteRecordItems.Any() && solidWasteRecordItems.FirstOrDefault() != null)
  1652. foreach (var item in solidWasteRecordItems.ToList())
  1653. {
  1654. if (item.C_Status == "7")
  1655. {
  1656. if (!string.IsNullOrWhiteSpace(item.C_SolidWaste))
  1657. DevOpsRecordSolidWaste.Add(JsonConvert.DeserializeObject<SolidWaste>(item.C_SolidWaste));
  1658. }
  1659. }
  1660. //DevOpsRecordSolidWaste.ForEach(x => {
  1661. // if (x.RoleName.Contains("设备管理员"))
  1662. // vm.DevManager += x.C_Name + " " + x.C_Mobile + " ";
  1663. // if (x.RoleName.Contains("设备运维员"))
  1664. // vm.DevOpser += x.C_Name + " " + x.C_Mobile + " ";
  1665. //});
  1666. TdevDevOpeContentViewModel devOpeContent = new TdevDevOpeContentViewModel
  1667. {
  1668. Date = DateTime.Now,//.ToString("yyyy-MM-dd HH:mm:ss.fff")
  1669. DrainOutletNumber = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "DrainOutletNumber").FirstOrDefault().Value,
  1670. DevStoreName = devStore.FirstOrDefault().C_Name,// runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "DevStoreName").FirstOrDefault().Value,
  1671. DevStoreType = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "DevStoreType").FirstOrDefault().Value,
  1672. SpecificationsParameterName = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "SpecificationsParameterName").FirstOrDefault().Value,
  1673. SpecificationsDesignValue = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "SpecificationsDesignValue").FirstOrDefault().Value,
  1674. SpecificationsUnit = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "SpecificationsUnit").FirstOrDefault().Value,
  1675. RunStartTime = startTime,
  1676. RunEndTime = DateTime.Now,
  1677. RunWhetherNormal = !isAlarm,
  1678. FlueGasVolume = await _redisService.GetAsync<string>("fanyibox_devspot_mean_" + fSpotId),// devSpotValues?.Where(x => x.name == devSpotNames.FirstOrDefault()).FirstOrDefault()?.value.ToString(),
  1679. PollutionFactor = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "PollutionFactor").FirstOrDefault().Value,
  1680. GovernanceEfficiency = await _redisService.GetAsync<string>("fanyibox_devspot_mean_" + sSpotId),// devSpotValues?.Where(x => x.name == devSpotNames.ElementAtOrDefault(1)).FirstOrDefault()?.value.ToString(),
  1681. DataSources = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "DataSources").FirstOrDefault().Value,
  1682. HeightOfFlue = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "HeightOfFlue").FirstOrDefault().Value,
  1683. DischargeTemperature = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "DischargeTemperature").FirstOrDefault().Value,
  1684. Pressure = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "Pressure").FirstOrDefault().Value,
  1685. DischargeTime = (DateTime.Now - startTime).TotalHours.ToString("F2"),
  1686. ConsumablePowerConsumption = runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "ConsumablePowerConsumption").FirstOrDefault().Value,
  1687. ConsumableName = DevOpsRecordSolidWaste.Any() ? string.Join(",", DevOpsRecordSolidWaste.Select(x => x.NameSpecification).ToList().ToArray()) : "/"
  1688. , // runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "ConsumableName").FirstOrDefault().Value,
  1689. ConsumableReplacementQuantity = DevOpsRecordSolidWaste.Any() ? string.Join(",", DevOpsRecordSolidWaste.Select(x => x.SpecificationNumber).ToList().ToArray()) : "/",//runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "ConsumableReplacementQuantity").FirstOrDefault().Value,
  1690. WasteName = DevOpsRecordSolidWaste.Any() ? string.Join(",", DevOpsRecordSolidWaste.Select(x => x.SolidWasteUnit).ToList().ToArray()) : "/",
  1691. //runSpotConfig?.RunSpotConfigList?.Where(x=>x.Name == "WasteName").FirstOrDefault().Value,
  1692. WasteProduction = DevOpsRecordSolidWaste.Any() ? string.Join(",", DevOpsRecordSolidWaste.Select(x => x.SolidWasteNumber).ToList().ToArray()) : "/",
  1693. //runSpotConfig?.RunSpotConfigList?.Where(x => x.Name == "WasteProduction").FirstOrDefault().Value,
  1694. //C_Content = "",
  1695. //C_Remark = "",
  1696. //C_CreateBy = _claims.ApiUserId,
  1697. //D_CreateOn = DateTime.Now
  1698. };
  1699. await devOpeAccountS.AddRangeAsync(new TDEV_DevOpeAccount
  1700. {
  1701. C_ID = Guid.NewGuid().ToString(),
  1702. C_DevStoreCode = devStoreCode,
  1703. C_Content = JsonConvert.SerializeObject(devOpeContent),
  1704. C_Remark = "",
  1705. C_CreateBy = Guid.Parse("6e864cbc-5252-11ec-8681-fa163e02b3e4"),
  1706. D_CreateOn = DateTime.Now
  1707. });
  1708. var qty = await dbContext.SaveChangesAsync();
  1709. //}
  1710. }
  1711. }
  1712. //next:
  1713. await _tdevDevStoreLogRepository.CreateOneAsync(new TDEV_DevStoreLog
  1714. {
  1715. C_ID = Guid.NewGuid().ToString(),
  1716. C_DeviceCode = devStoreCode,
  1717. C_Type = devStatus == "1" ? ((int)DevStatusEnum.Start).ToString() : ((int)DevStatusEnum.Stop).ToString(),
  1718. C_LogMsg = devStatus == "1" ? "开启" : "关闭",
  1719. C_CreateBy = Guid.Parse("6e864cbc-5252-11ec-8681-fa163e02b3e4"),
  1720. D_CreateOn = DateTime.Now
  1721. });
  1722. await _tdevDevStoreLogRepository.SaveAsync();
  1723. }
  1724. }
  1725. catch (Exception ex)
  1726. {
  1727. _logger.LogInformation(ex.Message);
  1728. }
  1729. }
  1730. /// <summary>
  1731. /// 运行台账-【动态】
  1732. /// </summary>
  1733. /// <param name="devStatus"></param>
  1734. /// <param name="devStoreCode"></param>
  1735. /// <param name="devRunSpot"></param>
  1736. /// <returns></returns>
  1737. private async Task DevStatusChange(string devStatus, string devStoreCode, string devRunSpot, DateTime time)
  1738. {
  1739. try
  1740. {
  1741. using (var scope = _provider.GetRequiredService<IServiceScopeFactory>().CreateScope())
  1742. {
  1743. var _redisService = scope.ServiceProvider.GetService<ICacheService>();
  1744. DateTime startTime = await _redisService.GetAsync<DateTime>("fanyibox_devStartRun_" + devRunSpot);
  1745. DateTime endTime = await _redisService.GetAsync<DateTime>("fanyibox_devEndRun_" + devRunSpot);
  1746. var _tmtnDevOpsRecordRepository = scope.ServiceProvider.GetService<ITmtnDevOpsRecordRepository>();
  1747. var solidWasteRecordItems = await _tmtnDevOpsRecordRepository.GetRecordsConditionAsync(new TmtnDevOpsRecordDetailSearchModel { bSolidWaste = true, C_DevStoreCode = devStoreCode, IsPagination = false, Start = startTime, End = endTime });
  1748. var devAccountConfig = await _devDevOpeAccountConfigService.GetByConditionAsync(t => t.C_DevStoreCode == devStoreCode);
  1749. using (var dbContext = scope.ServiceProvider.GetService<InspectionDbContext>())
  1750. {
  1751. //运行台账
  1752. if (devStatus == "0")
  1753. {
  1754. //using (var dbContext = _dbFuncContextFactory())
  1755. //{
  1756. bool isAlarm = false;
  1757. var devOpeAccountS = dbContext.GetDbSet<TDEV_DevOpeAccount>();
  1758. //var devStore = await _tdevDevStoreRepository.GetByConditionAsync(x => x.C_ID == devStoreCode);
  1759. var devStore = await dbContext.TDEV_DevStore.Where(x => x.C_ID == devStoreCode).FirstOrDefaultAsync();
  1760. //var devAccountConfig = await _devDevOpeAccountConfigService.GetByConditionAsync(t => t.C_DevStoreCode == devStoreCode);
  1761. //var devAccountConfig = await dbContext.TDEV_DevOpeAccountConfig.Where(t => t.C_DevStoreCode == devStoreCode).FirstOrDefaultAsync();
  1762. var devAccountConfigModel = devAccountConfig.OrderByDescending(t => t.D_CreateOn).FirstOrDefault();
  1763. if (devAccountConfigModel != null)
  1764. {
  1765. if (!string.IsNullOrEmpty(devAccountConfigModel.C_Config))
  1766. {
  1767. TdevDevOpeAccountConfigViewModel configList = JsonConvert.DeserializeObject<TdevDevOpeAccountConfigViewModel>(devAccountConfigModel.C_Config);
  1768. if (configList != null)
  1769. {
  1770. var devSpotGroupNames = configList.RunSpotConfigList?.Where(x => x.BReadDevSpot == true).Select(y => y.DevSpotGroupName).ToList();
  1771. var devSpotNames = configList.RunSpotConfigList?.Where(x => x.BReadDevSpot == true).Select(y => y.DevSpotName).ToList();
  1772. var devSpotBoxNos = configList.RunSpotConfigList?.Where(x => x.BReadDevSpot == true).Select(y => y.DevSpotBoxNo).ToList();
  1773. //var devSpotValues = await FanyiHelper.GetDevSpotValue(devSpotBoxNos.FirstOrDefault(), devSpotNames, devSpotGroupNames);
  1774. IEnumerable<TDEV_WebScadaDevSpot> items = _redisService.Get<IEnumerable<TDEV_WebScadaDevSpot>>("fanyibox_devStore_" + devStoreCode + "_spot");
  1775. //DateTime startTime = await _redisService.GetAsync<DateTime>("fanyibox_devStartRun_" + devRunSpot);
  1776. //DateTime endTime = await _redisService.GetAsync<DateTime>("fanyibox_devEndRun_" + devRunSpot);
  1777. if (startTime.IsNotEmptyOrNull() && endTime.IsNotEmptyOrNull() && startTime != DateTime.MinValue && endTime != DateTime.MinValue)
  1778. {
  1779. isAlarm = await GetDevAlarmData(devStoreCode, startTime, endTime) >= 1;
  1780. }
  1781. //var solidWasteRecordItems = await _tmtnDevOpsRecordRepository.GetRecordsConditionAsync(new TmtnDevOpsRecordDetailSearchModel { bSolidWaste = true, C_DevStoreCode = devStoreCode, IsPagination = false, Start = startTime, End = endTime });
  1782. List<SolidWaste> DevOpsRecordSolidWaste = new List<SolidWaste>();
  1783. if (solidWasteRecordItems.Any() && solidWasteRecordItems.FirstOrDefault() != null)
  1784. foreach (var item in solidWasteRecordItems.ToList())
  1785. {
  1786. if (item.C_Status == "4")
  1787. {
  1788. if (!string.IsNullOrWhiteSpace(item.C_SolidWaste))
  1789. DevOpsRecordSolidWaste.Add(JsonConvert.DeserializeObject<SolidWaste>(item.C_SolidWaste));
  1790. }
  1791. }
  1792. Dictionary<string, object> datas = new Dictionary<string, object>();
  1793. #region
  1794. datas.Add("Date", time);
  1795. foreach (Inspection.Model.ViewModel.DEV.RunSpotConfig item in configList.RunSpotConfigList)
  1796. {
  1797. if (item.Name == "DevStoreName")
  1798. {
  1799. datas.Add(item.Name, devStore.C_Name);
  1800. }
  1801. else if (item.Name == "RunStartTime")
  1802. {
  1803. datas.Add(item.Name, startTime);
  1804. }
  1805. else if (item.Name == "RunEndTime")
  1806. {
  1807. datas.Add(item.Name, DateTime.Now);
  1808. }
  1809. else if (item.Name == "RunWhetherNormal")
  1810. {
  1811. datas.Add(item.Name, isAlarm);
  1812. }
  1813. else if (item.Name == "DischargeTime")
  1814. { datas.Add(item.Name, (DateTime.Now - startTime).TotalHours.ToString("F2")); }
  1815. else if (item.Name == "ConsumableName" || item.Name == "WasteName")
  1816. {
  1817. datas.Add(item.Name, DevOpsRecordSolidWaste.Any() ? string.Join(",", DevOpsRecordSolidWaste.Select(x => x.NameSpecification).ToList().ToArray()) : "/");
  1818. }
  1819. else if (item.Name == "ConsumableReplacementQuantity")
  1820. {
  1821. int number = DevOpsRecordSolidWaste.Any() ? DevOpsRecordSolidWaste.Sum(x => (string.IsNullOrEmpty(x.SolidWasteNumber) ? 0 : Convert.ToInt32(x.SolidWasteNumber))) : 0;
  1822. datas.Add(item.Name, number);
  1823. }
  1824. else if (item.Name == "WasteProduction")
  1825. {
  1826. //string.Join(",", DevOpsRecordSolidWaste.Select(x => x.DropNumber).ToList().ToArray())
  1827. int number = DevOpsRecordSolidWaste.Any() ? DevOpsRecordSolidWaste.Sum(x => (string.IsNullOrEmpty(x.DropNumber) ? 0 : Convert.ToInt32(x.DropNumber))) : 0;
  1828. datas.Add(item.Name, number);
  1829. }
  1830. //"DrainOutletNumber"|| "DevStoreType"||"SpecificationsParameterName"||"SpecificationsDesignValue"||"SpecificationsUnit"||"PollutionFactor"||"DataSources"||"HeightOfFlue"||"DischargeTemperature"||"Pressure"||"ConsumablePowerConsumption"||"FlueGasVolume"||"GovernanceEfficiency"
  1831. else
  1832. {
  1833. if (item.BReadDevSpot)
  1834. {
  1835. string vals = "0"; string valsMax = "0"; string valsMin = "0";
  1836. //string SpotId = devSpotValues?.Where(x => x.name == item.DevSpotName).FirstOrDefault()?.id.ToString();
  1837. TDEV_WebScadaDevSpot webScadaDevSpot = items?.Where(x => x.C_Name == item.DevSpotName).FirstOrDefault();
  1838. if (webScadaDevSpot == null)
  1839. {
  1840. datas.Add(item.Name, vals);
  1841. datas.Add(item.Name + "_Max", valsMax);
  1842. datas.Add(item.Name + "_Min", valsMin);
  1843. continue;
  1844. }
  1845. string SpotId = webScadaDevSpot.C_DevSpotCode.ToString();
  1846. if (!string.IsNullOrEmpty(SpotId) && startTime.IsNotEmptyOrNull() && endTime.IsNotEmptyOrNull() && startTime != DateTime.MinValue && endTime != DateTime.MinValue)
  1847. {
  1848. endTime = DateTime.Now;
  1849. vals = await GetMeanData(SpotId, startTime, endTime);
  1850. valsMax = await GetDataMax(SpotId, startTime, endTime);
  1851. valsMin = await GetDataMin(SpotId, startTime, endTime);
  1852. if (vals == null)
  1853. {
  1854. SpotId = webScadaDevSpot.C_ID.ToString();
  1855. vals = await GetMeanData(SpotId, startTime, endTime);
  1856. valsMax = await GetDataMax(SpotId, startTime, endTime);
  1857. valsMin = await GetDataMin(SpotId, startTime, endTime);
  1858. }
  1859. }
  1860. vals = string.IsNullOrEmpty(vals) ? "0" : Convert.ToDouble(vals).ToString("0.0");
  1861. valsMax = string.IsNullOrEmpty(valsMax) ? "0" : Convert.ToDouble(valsMax).ToString("0.0");
  1862. valsMin = string.IsNullOrEmpty(valsMin) ? "0" : Convert.ToDouble(valsMin).ToString("0.0");
  1863. datas.Add(item.Name, vals);
  1864. datas.Add(item.Name + "_Max", valsMax);
  1865. datas.Add(item.Name + "_Min", valsMin);
  1866. }
  1867. else
  1868. {
  1869. var itemData = configList.RunSpotConfigList?.Where(x => x.Name == item.Name).FirstOrDefault();
  1870. datas.Add(item.Name, itemData?.Value);
  1871. }
  1872. }
  1873. }
  1874. #endregion
  1875. await devOpeAccountS.AddRangeAsync(new TDEV_DevOpeAccount
  1876. {
  1877. C_ID = Guid.NewGuid().ToString(),
  1878. C_DevStoreCode = devStoreCode,
  1879. C_Content = JsonConvert.SerializeObject(datas),
  1880. C_Remark = "",
  1881. C_DevOpeAccountConfigCode = devAccountConfigModel.C_ID,
  1882. C_CreateBy = Guid.Parse("6e864cbc-5252-11ec-8681-fa163e02b3e4"),
  1883. D_CreateOn = DateTime.Now
  1884. });
  1885. var qty = await dbContext.SaveChangesAsync();
  1886. }
  1887. }
  1888. }
  1889. //}
  1890. }
  1891. //var devStoreLog = dbContext.GetDbSet<TDEV_DevStoreLog>();
  1892. //await devStoreLog.AddAsync(new TDEV_DevStoreLog
  1893. //{
  1894. // C_ID = Guid.NewGuid().ToString(),
  1895. // C_DeviceCode = devStoreCode,
  1896. // C_Type = devStatus == "1" ? ((int)DevStatusEnum.Start).ToString() : ((int)DevStatusEnum.Stop).ToString(),
  1897. // C_LogMsg = devStatus == "1" ? "开启" : "关闭",
  1898. // C_CreateBy = Guid.Parse("6e864cbc-5252-11ec-8681-fa163e02b3e4"),
  1899. // D_CreateOn = DateTime.Now
  1900. //});
  1901. ////await _tdevDevStoreLogRepository.CreateOneAsync(new TDEV_DevStoreLog
  1902. ////{
  1903. //// C_ID = Guid.NewGuid().ToString(),
  1904. //// C_DeviceCode = devStoreCode,
  1905. //// C_Type = devStatus == "1" ? ((int)DevStatusEnum.Start).ToString() : ((int)DevStatusEnum.Stop).ToString(),
  1906. //// C_LogMsg = devStatus == "1" ? "开启" : "关闭",
  1907. //// C_CreateBy = Guid.Parse("6e864cbc-5252-11ec-8681-fa163e02b3e4"),
  1908. //// D_CreateOn = DateTime.Now
  1909. ////});
  1910. ////await _tdevDevStoreLogRepository.SaveAsync();
  1911. //await dbContext.SaveChangesAsync();
  1912. }
  1913. }
  1914. }
  1915. catch (Exception ex)
  1916. {
  1917. _logger.LogInformation(ex.Message);
  1918. }
  1919. }
  1920. private void _fbox_DataMonitorValueChanged(object sender, IList<DataMonitorValueChangedArgs> e)
  1921. {
  1922. using (var scope = _provider.GetRequiredService<IServiceScopeFactory>().CreateScope())
  1923. {
  1924. var _redisService = scope.ServiceProvider.GetService<ICacheService>();
  1925. _redisService.ListLeftPushAsync("fanyibox", e);
  1926. }
  1927. //AddData();
  1928. }
  1929. #region RabbitMQ消息
  1930. /// <summary>
  1931. /// 发送RabbitMQ消息-台账
  1932. /// </summary>
  1933. /// <param name="msgStr"></param>
  1934. /// <returns></returns>
  1935. public async Task SnedRabbitMQ(string msgStr)
  1936. {
  1937. try
  1938. {
  1939. Ropin.Inspection.Common.Helper.RabbitMQModel rabbit = new Ropin.Inspection.Common.Helper.RabbitMQModel();
  1940. rabbit.HostName = _rabbitMQModel.HostName;// "60.204.212.71",//IP地址
  1941. rabbit.Port = _rabbitMQModel.Port;// 5672,//端口号
  1942. rabbit.UserName = _rabbitMQModel.UserName;//"guest",//用户账号
  1943. rabbit.VirtualHost = _rabbitMQModel.VirtualHost;// "/",
  1944. rabbit.Password = _rabbitMQModel.Password;//"guest"//用户密码
  1945. rabbit.msgStr = msgStr;
  1946. rabbit.QueueName = "rabbit@rabbitmq01";
  1947. bool bol = await RabbitMQHelper.SnedRabbitMQ_ExchangeDirect(rabbit);
  1948. if (!bol)
  1949. {
  1950. log.Info($"【{msgStr}】【设备台账数据发送失败-RabbitMQ】");
  1951. }
  1952. }
  1953. catch (Exception ex)
  1954. {
  1955. log.Info($"【{msgStr}】【设备台账数据发送异常-RabbitMQ】" + ex.Message);
  1956. throw;
  1957. }
  1958. }
  1959. /// <summary>
  1960. /// 发送RabbitMQ消息-设备报警
  1961. /// </summary>
  1962. /// <param name="msgStr"></param>
  1963. /// <returns></returns>
  1964. public async Task SnedAlarmRabbitMQ(string msgStr)
  1965. {
  1966. try
  1967. {
  1968. Ropin.Inspection.Common.Helper.RabbitMQModel rabbit = new Ropin.Inspection.Common.Helper.RabbitMQModel();
  1969. rabbit.HostName = _rabbitMQModel.HostName;// "60.204.212.71",//IP地址
  1970. rabbit.Port = _rabbitMQModel.Port;// 5672,//端口号
  1971. rabbit.UserName = _rabbitMQModel.UserName;//"guest",//用户账号
  1972. rabbit.VirtualHost = _rabbitMQModel.VirtualHost;// "/",
  1973. rabbit.Password = _rabbitMQModel.Password;//"guest"//用户密码
  1974. rabbit.msgStr = msgStr;
  1975. rabbit.QueueName = "rabbit.alarmDevice";
  1976. bool bol = await RabbitMQHelper.SnedRabbitMQ_ExchangeDirect(rabbit);
  1977. if (!bol)
  1978. {
  1979. log.Info($"【{msgStr}】【设备报警发送失败-RabbitMQ】");
  1980. }
  1981. }
  1982. catch (Exception ex)
  1983. {
  1984. log.Info($"【{msgStr}】【设备报警发送异常-RabbitMQ】" + ex.Message);
  1985. throw;
  1986. }
  1987. }
  1988. #endregion
  1989. public Task StopAsync(CancellationToken cancellationToken)
  1990. {
  1991. Dispose();
  1992. _logger.LogInformation("内部任务计划结束");
  1993. return Task.CompletedTask;
  1994. }
  1995. public void Dispose()
  1996. {
  1997. fanyi?.Dispose();
  1998. //t?.Dispose();
  1999. }
  2000. }
  2001. }