HostedService.cs 136 KB

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