BIStatusServer.cs 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973
  1. using Cksoft.Data;
  2. using Cksoft.Data.Repository;
  3. using Cksoft.Unity;
  4. using DllEapDal;
  5. using DllEapEntity;
  6. using DllHsms;
  7. using Microsoft.Extensions.Logging;
  8. using RabbitMQ.Client;
  9. using RabbitMQ.Client.Events;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.IO;
  13. using System.Linq;
  14. using System.Text;
  15. using System.Threading;
  16. using System.Threading.Tasks;
  17. using Microsoft.Extensions.Caching.Memory;
  18. using WebStatusToolkit;
  19. using DllEapDal.OFILM;
  20. using DllEapCommon.Notice;
  21. using WebStatusToolkit.Notice;
  22. namespace DllBIStatusServer
  23. {
  24. public class BIStatusServer : IBIStatusServer
  25. {
  26. private ILogger loger = null;
  27. public BIStatusServer(ILogger<BIStatusServer> loger)
  28. {
  29. this.loger = loger;
  30. CurrMaxBlock = long.Parse(AppConfigurtaionServices.Configuration["MaxBlock"]);
  31. CurrShareFileDir = AppConfigurtaionServices.Configuration["ShareFileDir"];
  32. CurrProgramDir = AppConfigurtaionServices.Configuration["ProgramDir"];
  33. delay = Convert.ToInt32(AppConfigurtaionServices.Configuration["BIDelay"]);
  34. ignore = Convert.ToInt32(AppConfigurtaionServices.Configuration["BIIgnore"]);
  35. }
  36. private long CurrCount = 0;
  37. private IModel CurrQueueChannel = null;
  38. private string CurrRecQueueName = "hello";//
  39. private string CurrStatusQueueName = "hello";//状态显示队列名称
  40. private string StatusQueueName = "BIStatus";
  41. private string StatusExchange = "";//状态交换机名称
  42. private string StatusTotalExchange = "";
  43. private DateTime CurrSTime = DateTime.Now;//开始时间
  44. //private int CurrDbTime = 30;//提交数据到数据库的间接时间,以秒为单位
  45. private List<ReportDetail> CurrReportDetail = null;
  46. private List<MacOrder> CurrMacOrder = null;
  47. private List<OrderStatus> CurrOrderStatus = null;
  48. private List<ServerInfo> CurrInfo = new List<ServerInfo>();//记录错误信息
  49. private IDatabase CurrDb = null;
  50. private int CurrStatus = -1;//未启动状态
  51. private string DbCode = "eap";
  52. private string ReadDbCode = "eapslave";
  53. public long CurrMaxBlock = 0;
  54. public string CurrShareFileDir = "";
  55. private string CurrProgramDir = "";
  56. private int delay = 0;
  57. private int ignore = 0;
  58. List<MacStatus> lastStatuses = new List<MacStatus>();
  59. List<Task> Tasks = new List<Task>();
  60. List<Thread> threads = new List<Thread>();
  61. List<MacStatus> macStatuses = new List<MacStatus>();
  62. //开始接收队列线程
  63. public int StartRecQueue(ref string errorinfo)
  64. {
  65. try
  66. {
  67. CurrQueueChannel.QueueDeclare(CurrRecQueueName, false, false, false, null);
  68. CurrQueueChannel.BasicQos(0, 1, false);
  69. var consumer = new EventingBasicConsumer(CurrQueueChannel);
  70. CurrQueueChannel.BasicConsume(queue: CurrRecQueueName,
  71. autoAck: false, //是否不要手动应答(no manual Ack),ture自动应答,自动删除处理消息;false手动应答,服务器的消息会等待应答结果才消除
  72. consumer: consumer);
  73. consumer.Received += QueueReceive;
  74. Thread thread = new Thread(async () =>
  75. {
  76. while (true)
  77. {
  78. try
  79. {
  80. Thread.Sleep(delay * 1000);
  81. var now = DateTime.Now;
  82. var pushedStatuses = macStatuses.Where(c => c.MacCode.Length == 7).ToList();
  83. var temp = new List<MacStatus>();
  84. var grouped = pushedStatuses.GroupBy(c => c.MacCode);
  85. foreach (var item in grouped)
  86. {
  87. //var last = lastStatuses.FirstOrDefault(c => c.MacCode == item.Key);
  88. //if (last == null || (item.First().STime - last.STime).TotalSeconds >= 5)
  89. //{
  90. // temp.Add(item.First());
  91. //}
  92. var last = lastStatuses.FirstOrDefault(c => c.MacCode == item.Key);
  93. for (int i = 0; i < item.Count(); i++)
  94. {
  95. var currStatus = item.ElementAt(i);
  96. var currLastStatus = temp.LastOrDefault(c => c.MacCode == currStatus.MacCode);
  97. if (currLastStatus == null)
  98. {
  99. if (last == null || last.StatusID != currStatus.StatusID)
  100. {
  101. temp.Add(currStatus);
  102. }
  103. continue;
  104. }
  105. var lastRecipe = (!string.IsNullOrEmpty(currLastStatus.Remark)) ? currLastStatus.Remark.Replace(" ", "-").Replace("_", "-").Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries)[0] : "";
  106. var currRecipe = (!string.IsNullOrEmpty(currStatus.Remark)) ? currStatus.Remark?.Replace(" ", "-").Replace("_", "-").Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries)[0] : "";
  107. if (currStatus.StatusID != currLastStatus.StatusID || lastRecipe != currRecipe)
  108. {
  109. if ((currStatus.STime - currLastStatus.STime).TotalSeconds < ignore)
  110. {
  111. temp.Remove(currLastStatus);
  112. }
  113. temp.Add(currStatus);
  114. }
  115. }
  116. }
  117. var temps = grouped.Select(c => c.Last()).ToList();
  118. foreach (var status in temps)
  119. {
  120. var model = lastStatuses.FirstOrDefault(c => c.MacCode == status.MacCode);
  121. if (model == null)
  122. {
  123. lastStatuses.Add(status);
  124. }
  125. else
  126. {
  127. lastStatuses.Remove(model);
  128. lastStatuses.Add(status);
  129. }
  130. }
  131. // lastStatuses = grouped.Select(c => c.Last()).ToList();
  132. using (IDatabase db = DbFactory.Base("eapslave"))
  133. {
  134. string error = string.Empty;
  135. var dal = new BICollectDal(db);
  136. await dal.PushStatusToBIBatch(temp, error);
  137. }
  138. lock (macStatuses)
  139. {
  140. macStatuses = macStatuses.Except(pushedStatuses).ToList();
  141. }
  142. }
  143. catch (Exception ex)
  144. {
  145. loger.LogError(ex.ToString());
  146. string error1 = string.Empty;
  147. string content = $"推送BI状态数据失败[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}],服务器:[{AppConfigurtaionServices.Configuration["SystemCode"]}],异常为:{ex.Message}";
  148. ServiceErrorNoticeHelper.Notice(content, ref error1);
  149. }
  150. }
  151. });
  152. thread.Start();
  153. return 1;
  154. }
  155. catch (Exception ex)
  156. {
  157. errorinfo = ex.Message.ToString();
  158. return -1;
  159. }
  160. }
  161. //注册通道
  162. private IModel RegeditChannel(ref string errorinfo)
  163. {
  164. try
  165. {
  166. var factory = new ConnectionFactory();
  167. factory.HostName = AppConfigurtaionServices.Configuration["rabbitmq:IPAddress"];
  168. factory.UserName = AppConfigurtaionServices.Configuration["rabbitmq:UserName"];
  169. factory.Password = AppConfigurtaionServices.Configuration["rabbitmq:Password"];
  170. //CurrQueueName = AppConfigurtaionServices.Configuration["mqname:macrecmqname"];
  171. var connection = factory.CreateConnection();
  172. var channel = connection.CreateModel();
  173. return channel;
  174. }
  175. catch (Exception ex)
  176. {
  177. errorinfo = ex.Message.ToString();
  178. return null;
  179. }
  180. }
  181. private int ClearRecQueue(ref string errorinfo)
  182. {
  183. try
  184. {
  185. CurrQueueChannel.QueueDelete(CurrRecQueueName, true, false);
  186. return 1;
  187. }
  188. catch (Exception ex)
  189. {
  190. errorinfo = ex.Message.ToString();
  191. return -1;
  192. }
  193. }
  194. private void QueueReceive(object model, BasicDeliverEventArgs ea)
  195. {
  196. var obj = model as EventingBasicConsumer;
  197. obj.Model.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
  198. CurrCount++;
  199. string errorinfo = string.Empty;
  200. var entity = EntityHelper.DeSerializeBytes<MacStatus>(ea.Body);
  201. lock (macStatuses)
  202. {
  203. // macStatuses.Add(entity);
  204. var lastStatus = macStatuses?.OrderBy(c => c.STime).LastOrDefault(c => c.MacCode == entity.MacCode);
  205. if (lastStatus == null)
  206. {
  207. }
  208. else
  209. {
  210. if (!((entity.STime - lastStatus.STime).TotalSeconds >= ignore))
  211. {
  212. macStatuses.Remove(lastStatus);
  213. }
  214. }
  215. macStatuses.Add(entity);
  216. }
  217. }
  218. private List<McaSecVDetail> ComParams(OrderDetail order, List<OrderData> lists, ref string errorinfo)
  219. {
  220. try
  221. {
  222. int sval = order.SVal;
  223. int fval = order.FVal;
  224. List<McaSecVDetail> tempdt = null;
  225. tempdt = HsmsUnity.GetOrderS6F11Dt(lists, CurrReportDetail, ref errorinfo);
  226. if (tempdt == null)
  227. {
  228. errorinfo = "GetOrderS6F11Dt函数错误:" + errorinfo;
  229. return null;
  230. }
  231. return tempdt;
  232. }
  233. catch (Exception ex)
  234. {
  235. errorinfo = ex.Message.ToString();
  236. return null;
  237. }
  238. }
  239. private void ProcessEventForTask(byte[] datas)
  240. {
  241. try
  242. {
  243. string errorinfo = "";
  244. int result = ProcessEvent(datas, ref errorinfo);
  245. if (result <= 0)
  246. {
  247. string logerrorinfo = "";
  248. SetText(errorinfo + "\r\n");
  249. }
  250. }
  251. catch (Exception ex)
  252. {
  253. SetText(ex.Message.ToString() + "\r\n");
  254. }
  255. }
  256. private int ProcessEvent(byte[] datas, ref string errorinfo)
  257. {
  258. try
  259. {
  260. OrderBlock entity = EntityHelper.DeSerializeBytes<OrderBlock>(datas);
  261. int result = entity.RecoverData(CurrShareFileDir, ref errorinfo);
  262. if (result <= 0)
  263. return -1;
  264. //loger.LogError($"机台编号={entity.MainMsg.McaCode};开始处理:{entity.ToJson()}");
  265. if (entity.MainMsg.McaCode == "LHA0021")
  266. {
  267. int aa = 100;
  268. }
  269. //数据转换
  270. int ftype = entity.MainMsg.FType;// int.Parse(orgds.Tables["McaSecVMst"].Rows[0]["FType"].ToString());
  271. OrderDetail orderdetail = entity.CurrOrder;
  272. List<OrderData> lists = entity.Datalists;
  273. //修改为实时从数据库中读取指令信息
  274. List<MacOrder> tempmacorders = CurrMacOrder.Where(t => t.MacFCode == entity.MainMsg.McaCode).ToList();
  275. if (tempmacorders.Count <= 0)
  276. {
  277. //重新读取一次指令数据
  278. //using (IDatabase db = DbFactory.Base(DbCode))
  279. //{
  280. // result = ReadOrder(db, ref errorinfo);
  281. //}
  282. //if (result <= 0)
  283. //{
  284. // errorinfo = $"读取指令信息失败:{errorinfo}";
  285. // return -1;
  286. //}
  287. tempmacorders = CurrMacOrder.Where(t => t.MacFCode == entity.MainMsg.McaCode).ToList();
  288. if (tempmacorders.Count <= 0)
  289. {
  290. errorinfo = $"未找到机台【{entity.MainMsg.McaCode}】对应的指令信息。";
  291. return -1;
  292. }
  293. }
  294. List<OrderStatus> temporderstatus = CurrOrderStatus.Where(t => t.PreID == tempmacorders[0].PreID).ToList();
  295. //List<OrderStatus> temporderstatus = CallFunction.GetOrderStatus(macorder.PreID, ref errorinfo);
  296. //if (temporderstatus == null)
  297. // return -1;
  298. //说明是断开开事件
  299. if (entity.MainMsg.FType < 0 && entity.MainMsg.FStatus < 0)
  300. {
  301. MacStatus tempstatus = HsmsUnity.GetDisconn(entity.MainMsg.McaCode, entity.MainMsg.ptime, ref errorinfo);
  302. result = ProcessStatus(tempstatus, "", ref errorinfo);
  303. if (result < 0)
  304. return -1;
  305. return 1;
  306. }
  307. //说明是连接成功事件
  308. if (entity.MainMsg.FType < 0 && entity.MainMsg.FStatus > 0)
  309. {
  310. if (entity.MainMsg.McaCode == "DA00003")
  311. {
  312. int aa = 100;
  313. }
  314. //添加连接成功,然后添加当前状态
  315. //MacStatus tempstatus = HsmsUnity.GetMacStatusForIdle(entity.MainMsg.McaCode, entity.MainMsg.ptime, temporderstatus, ref errorinfo);
  316. MacStatus tempstatus = HsmsUnity.GetDisconn(entity.MainMsg.McaCode, entity.MainMsg.ptime, ref errorinfo);
  317. result = ProcessStatus(tempstatus, entity.MainMsg.McaCode, ref errorinfo);
  318. if (result < 0)
  319. return -1;
  320. tempstatus = HsmsUnity.GetMacStatus(entity.MainMsg.McaCode, entity.MainMsg.ptime, entity.MainMsg.EventCode, temporderstatus, ref errorinfo);
  321. result = ProcessStatus(tempstatus, entity.MainMsg.McaCode, ref errorinfo);
  322. if (result < 0)
  323. return -1;
  324. return 1;
  325. }
  326. string eventcode = HsmsUnity.GetEventCode(DbFactory.Base(ReadDbCode), entity.MainMsg.McaCode, entity.CurrOrder, entity.Datalists, ref errorinfo);
  327. if (eventcode == "")
  328. return -1;
  329. entity.MainMsg.EventCode = eventcode;
  330. switch (eventcode)
  331. {
  332. case StandardCode.CEID_StatusChange:
  333. case StandardCode.CEID_AlarmOccurred:
  334. case StandardCode.CEID_AlarmRelease:
  335. case StandardCode.CEID_Exceting:
  336. case StandardCode.CEID_End:
  337. case StandardCode.CEID_Completed:
  338. if (entity.MainMsg.McaCode == "DA00003")
  339. {
  340. int a = 100;
  341. }
  342. //状态改变事件
  343. result = ProcessStatus(entity, tempmacorders[0], lists, ref errorinfo);
  344. if (result < 0)
  345. {
  346. errorinfo = $"机台编号={entity.MainMsg.McaCode};ProcessStatus发生错误:{errorinfo}";
  347. return -1;
  348. }
  349. break;
  350. case StandardCode.CEID_FullAutoEnd://全自动结束
  351. result = ClearProgram(entity, tempmacorders[0], lists, ref errorinfo);
  352. if (result <= 0)
  353. {
  354. errorinfo = $"机台编号={entity.MainMsg.McaCode};ClearProgram发生错误:{errorinfo}";
  355. loger.LogError(errorinfo);
  356. }
  357. else
  358. {
  359. loger.LogError($"机台编号={entity.MainMsg.McaCode}清理程序完成。");
  360. }
  361. loger.LogError($"机台编号={entity.MainMsg.McaCode}开始自动TRACKOUT......");
  362. result = CallFunction.AutoTrackOut(entity, ref errorinfo);
  363. if (result <= 0)
  364. {
  365. loger.LogError($"机台编号={entity.MainMsg.McaCode}自动TRACKOUT失败:{errorinfo}");
  366. }
  367. else
  368. {
  369. loger.LogError($"机台编号={entity.MainMsg.McaCode}自动TRACKOUT成功完成。");
  370. }
  371. return 1;
  372. //case StandardCode.CEID_FullAutoStart://全自动开始
  373. //case StandardCode.CEID_FullAutoReStart://全自动重新开始
  374. case StandardCode.CEID_CutStart://切割开始
  375. result = CallFunction.CompareParams(entity.MainMsg.McaCode, "", ref errorinfo);
  376. if (result <= 0)
  377. {
  378. errorinfo = $"参数比对失败【{entity.MainMsg.McaCode}】:{errorinfo}";
  379. return -1;
  380. }
  381. return 1;
  382. case StandardCode.CEID_UpProgram:
  383. //上传程序事件
  384. result = ProcessUpProgram(entity, ref errorinfo);
  385. if (result < 0)
  386. {
  387. errorinfo = $"机台编号={entity.MainMsg.McaCode};ProcessUpProgram发生错误:{errorinfo}";
  388. return -1;
  389. }
  390. loger.LogError(errorinfo);
  391. SetText("上传程序成功。\r\n");
  392. break;
  393. case StandardCode.CEID_RequestUpProgram:
  394. if (AppConfigurtaionServices.Configuration["CallMesInterface"] != null && Convert.ToBoolean(AppConfigurtaionServices.Configuration["CallMesInterface"]))
  395. {
  396. loger.LogError($"机台编号={entity.MainMsg.McaCode} 开始使用文件方式调程");
  397. //上传程序事件
  398. result = CallFunction.UpProgramForFile(entity, CurrProgramDir, "", ref errorinfo);
  399. if (result < 0)
  400. {
  401. errorinfo = $"机台编号={entity.MainMsg.McaCode};UpProgramForFile发生错误:{errorinfo}";
  402. return -1;
  403. }
  404. loger.LogError(errorinfo);
  405. SetText("上传程序成功。\r\n");
  406. }
  407. break;
  408. case StandardCode.CEID_PPModifyed://修改程序事件,需要比对程序文件参数
  409. result = CallFunction.SaveProgram(entity.MainMsg.McaCode, "", ref errorinfo);
  410. if (result <= 0)
  411. {
  412. errorinfo = $"机台编号={entity.MainMsg.McaCode};SaveProgram发生错误:{errorinfo}";
  413. return -1;
  414. }
  415. break;
  416. case StandardCode.CEID_OutBoxDown:
  417. case StandardCode.CEID_OutBoxLoad:
  418. BroadcastForMes(entity, ref errorinfo);
  419. //统计产量
  420. result = CallFunction.AccountMacCount(entity.MainMsg.McaCode, "", ref errorinfo);
  421. if (result <= 0)
  422. {
  423. errorinfo = $"机台编号={entity.MainMsg.McaCode};统计参量失败:{errorinfo}";
  424. return -1;
  425. }
  426. break;
  427. case StandardCode.CEID_InBoxLoad:
  428. BroadcastForMes(entity, ref errorinfo);
  429. break;
  430. }
  431. return 1;
  432. }
  433. catch (Exception ex)
  434. {
  435. errorinfo = "IMcaSecVMst01" + ex.Message.ToString();
  436. return -1;
  437. }
  438. }
  439. private int BroadcastStatus(MacStatus status, ref string errorinfo)
  440. {
  441. try
  442. {
  443. byte[] queuedata = EntityHelper.SerializeBytes<MacStatus>(status);
  444. if (queuedata == null)
  445. return -1;
  446. CurrQueueChannel.ExchangeDeclare(exchange: StatusExchange, type: "fanout", durable: false, autoDelete: true);
  447. CurrQueueChannel.BasicPublish(StatusExchange, "", null, queuedata); //开始传递
  448. return 1;
  449. }
  450. catch (Exception ex)
  451. {
  452. errorinfo = ex.Message.ToString();
  453. return -1;
  454. }
  455. }
  456. /// <summary>
  457. /// 处理状态改变事件
  458. /// </summary>
  459. /// <param name="entity"></param>
  460. /// <param name="macorder"></param>
  461. /// <param name="lists"></param>
  462. /// <param name="errorinfo"></param>
  463. /// <returns></returns>
  464. private int ProcessStatus(OrderBlock entity, MacOrder macorder, List<OrderData> lists, ref string errorinfo)
  465. {
  466. try
  467. {
  468. List<OrderStatus> temporderstatus = CurrOrderStatus.Where(t => t.PreID == macorder.PreID).ToList();
  469. //List<OrderStatus> temporderstatus = CallFunction.GetOrderStatus(macorder.PreID, ref errorinfo);
  470. //if (temporderstatus == null)
  471. // return -1;
  472. MacStatus currstatus = HsmsUnity.GetMacStatus(macorder, temporderstatus, entity.CurrOrder, lists, CurrReportDetail, ref errorinfo);
  473. currstatus.MacCode = entity.MainMsg.McaCode;
  474. currstatus.STime = entity.MainMsg.ptime;
  475. int result = 0;
  476. //删除3350的程序,
  477. //if (currstatus.StatusID == MacStatusVal.Stop)
  478. //{
  479. // string logerrorinfo = "";
  480. // WriteLog.WriteLogStr(entity.MainMsg.McaCode, "", DateTime.Now, $"开始清除程序", ref logerrorinfo);
  481. // CallFunction.ClearProgram(entity, "", ref errorinfo);
  482. // WriteLog.WriteLogStr(entity.MainMsg.McaCode, "", DateTime.Now, $"清除程序完成:{errorinfo}", ref logerrorinfo);
  483. // result = CallFunction.AutoTrackOut(entity, ref errorinfo);
  484. // if (result <= 0)
  485. // {
  486. // loger.LogError($"机台编号={entity.MainMsg.McaCode}自动TRACKOUT失败:{errorinfo}");
  487. // }
  488. // else
  489. // {
  490. // loger.LogError($"机台编号={entity.MainMsg.McaCode}自动TRACKOUT失败完成。");
  491. // }
  492. // //自动过站
  493. //}
  494. result = ProcessStatus(currstatus, entity.MainMsg.McaCode, ref errorinfo);
  495. return result;
  496. }
  497. catch (Exception ex)
  498. {
  499. errorinfo = ex.Message.ToString();
  500. return -1;
  501. }
  502. }
  503. //清除程序
  504. private int ClearProgram(OrderBlock entity, MacOrder macorder, List<OrderData> lists, ref string errorinfo)
  505. {
  506. try
  507. {
  508. Machine mac = CallFunction.GetMachine(entity.MainMsg.McaCode, ref errorinfo);
  509. if (mac == null)
  510. {
  511. return -1;
  512. }
  513. string logerrorinfo = "";
  514. WriteLog.WriteLogStr(entity.MainMsg.McaCode, "", DateTime.Now, $"开始清除程序", ref logerrorinfo);
  515. int result = CallFunction.ClearProgram(entity, "", ref errorinfo);
  516. if (result <= 0)
  517. {
  518. WriteLog.WriteLogStr(entity.MainMsg.McaCode, "", DateTime.Now, $"清除程序发生错误:{errorinfo}", ref logerrorinfo);
  519. return -1;
  520. }
  521. else
  522. {
  523. WriteLog.WriteLogStr(entity.MainMsg.McaCode, "", DateTime.Now, $"清除程序成功......", ref logerrorinfo);
  524. }
  525. //if (mac.MModeCode.ToLower()=="dad3350")
  526. //{
  527. // List<OrderStatus> temporderstatus = CurrOrderStatus.Where(t => t.PreID == macorder.PreID).ToList();
  528. // MacStatus currstatus = HsmsUnity.GetMacStatus(macorder, temporderstatus, entity.CurrOrder, lists, CurrReportDetail, ref errorinfo);
  529. // currstatus.MacCode = entity.MainMsg.McaCode;
  530. // currstatus.STime = entity.MainMsg.ptime;
  531. // //删除3350的程序,
  532. // if (currstatus.StatusID == MacStatusVal.Stop)
  533. // {
  534. // string logerrorinfo = "";
  535. // WriteLog.WriteLogStr(entity.MainMsg.McaCode, "", DateTime.Now, $"开始清除程序", ref logerrorinfo);
  536. // CallFunction.ClearProgram(entity, "", ref errorinfo);
  537. // WriteLog.WriteLogStr(entity.MainMsg.McaCode, "", DateTime.Now, $"清除程序完成:{errorinfo}", ref logerrorinfo);
  538. // }
  539. // if (currstatus.StatusID == MacStatusVal.Run)
  540. // {
  541. // int result = ProcessStatus(entity, macorder, lists, ref errorinfo);
  542. // if (result <= 0)
  543. // return -1;
  544. // }
  545. //}
  546. //else
  547. //{
  548. // int result = CallFunction.ClearProgram(entity, "", ref errorinfo);
  549. // if (result <= 0)
  550. // {
  551. // string logerrorinfo = "";
  552. // WriteLog.WriteLogStr(entity.MainMsg.McaCode, "", DateTime.Now, $"发生错误:{errorinfo}", ref logerrorinfo);
  553. // return -1;
  554. // }
  555. //}
  556. return 1;
  557. }
  558. catch (Exception ex)
  559. {
  560. errorinfo = ex.Message.ToString();
  561. return -1;
  562. }
  563. }
  564. private int ProcessStatus(MacStatus currstatus, string maccode, ref string errorinfo)
  565. {
  566. try
  567. {
  568. if ((currstatus.Remark is null || currstatus.Remark.Trim() == "") && maccode != "")
  569. {
  570. string programname = CallFunction.GetProgramName(maccode, ref errorinfo);
  571. if (programname == "")
  572. {
  573. errorinfo = $"机台=【{currstatus.MacCode}】获取程序名称失败,{errorinfo}";
  574. return -1;
  575. }
  576. currstatus.Remark = programname;
  577. }
  578. currstatus.RecTime = DateTime.Now;
  579. currstatus.ProgramName = AppConfigurtaionServices.Configuration["SystemCode"];
  580. //如果是状态报警,则做以下处理
  581. if (currstatus.StatusID == MacStatusVal.Error && string.IsNullOrEmpty(currstatus.AlarmCode) && string.IsNullOrEmpty(currstatus.AlarmDescribe))
  582. {
  583. loger.LogError($"机台编号={currstatus.MacCode}的报警代码和描述为空");
  584. currstatus.AlarmCode = "SVID";
  585. currstatus.AlarmDescribe = "SVID状态报警";
  586. }
  587. //lock (macStatuses)
  588. //{
  589. // if (currstatus != null)
  590. // {
  591. // macStatuses.Add(currstatus);
  592. // }
  593. //}
  594. if (AppConfigurtaionServices.Configuration["CallMesInterface"] != null && Convert.ToBoolean(AppConfigurtaionServices.Configuration["CallMesInterface"]))
  595. {
  596. //与上一次的程序名称比较,如果不同则调用QIS首件接口,通知已改机
  597. }
  598. int tempresult = BroadcastStatus(currstatus, ref errorinfo);
  599. if (tempresult <= 0)
  600. {
  601. loger.LogError($"广播状态发生错误:{errorinfo}");
  602. }
  603. // 将数据抛到Status队列上
  604. byte[] queuedata = EntityHelper.SerializeBytes<MacStatus>(currstatus);
  605. CurrQueueChannel.BasicPublish("", StatusQueueName, null, queuedata);
  606. if (currstatus.StatusID == MacStatusVal.Run)
  607. {
  608. //比对参数
  609. //tempresult = CallFunction.CompareParams(currstatus.MacCode, "", ref errorinfo);
  610. //if (tempresult <= 0)
  611. //{
  612. // errorinfo = $"参数比对失败【{currstatus.MacCode}】:{errorinfo}";
  613. // return -1;
  614. //}
  615. if (!(AppConfigurtaionServices.Configuration["CallMesInterface"] != null && Convert.ToBoolean(AppConfigurtaionServices.Configuration["CallMesInterface"])))
  616. {
  617. //不是欧菲光的要比对参数
  618. loger.LogError($"机台={currstatus.MacCode}开始比对参数......");
  619. tempresult = CallFunction.CompareParams(currstatus.MacCode, "", ref errorinfo);
  620. if (tempresult <= 0)
  621. {
  622. errorinfo = $"参数比对失败【{currstatus.MacCode}】:{errorinfo}";
  623. return -1;
  624. }
  625. }
  626. else
  627. {
  628. tempresult = CallFunction.CompareParamsForOfilm(currstatus.MacCode, "", ref errorinfo);
  629. if (tempresult <= 0)
  630. {
  631. errorinfo = $"参数比对失败【{currstatus.MacCode}】:{errorinfo}";
  632. return -1;
  633. }
  634. }
  635. loger.LogError(errorinfo);
  636. }
  637. #region
  638. //if (macStatuses.Count > 20)
  639. //{
  640. // macStatuses = macStatuses.OrderBy(c => c.MacCode).ThenBy(c => c.STime).ToList();
  641. // foreach (var item in macStatuses)
  642. // {
  643. // //插入状态值
  644. // MacStatus resultstatu s= CallFunction.CallIMacStatus(currstatus, "", ref errorinfo);
  645. // if (resultstatus == null)
  646. // return -1;
  647. // //将状态发送给显示客户端
  648. // //int tempresult = WriteBusinessToQueue(CurrStatusQueueName, resultstatus, ref errorinfo);
  649. // //if (tempresult <= 0)
  650. // // return -1;
  651. // //广播消息
  652. // int tempresult = BroadcastStatus(resultstatus, ref errorinfo);
  653. // if (tempresult <= 0)
  654. // return -1;
  655. // //测试参数比对代码,正式环境注销
  656. // //tempresult = CallFunction.CallCompareParams(entity.MainMsg.McaCode, ref errorinfo);
  657. // //if (tempresult <= 0)
  658. // // return -1;
  659. // if (resultstatus.StatusID == MacStatusVal.Run)
  660. // {
  661. // //比对参数
  662. // //tempresult = CallFunction.CompareParams(currstatus.MacCode, "", ref errorinfo);
  663. // //if (tempresult <= 0)
  664. // //{
  665. // // errorinfo = $"参数比对失败【{currstatus.MacCode}】:{errorinfo}";
  666. // // return -1;
  667. // //}
  668. // tempresult = CallFunction.CompareParamsForOfilm(currstatus.MacCode, "", ref errorinfo);
  669. // if (tempresult <= 0)
  670. // {
  671. // errorinfo = $"参数比对失败【{currstatus.MacCode}】:{errorinfo}";
  672. // return -1;
  673. // }
  674. // loger.LogError(errorinfo);
  675. // }
  676. // }
  677. // macStatuses.RemoveAll(c => true);
  678. //}
  679. #endregion
  680. return 1;
  681. }
  682. catch (Exception ex)
  683. {
  684. errorinfo = $"机台编号【{currstatus.MacCode}】" + ex.ToString();
  685. return -1;
  686. }
  687. }
  688. private int ProcessUpProgram(OrderBlock entity, ref string errorinfo)
  689. {
  690. try
  691. {
  692. int result = CallFunction.UpProgram(entity, CurrProgramDir, "", ref errorinfo);
  693. return result;
  694. }
  695. catch (Exception ex)
  696. {
  697. errorinfo = ex.Message.ToString();
  698. return -1;
  699. }
  700. }
  701. private void Test()
  702. {
  703. string filepath = @"D:\eap\1N4148W-7-F.W1003FM-FW001.4CH_1";
  704. string errorinfo = "";
  705. byte[] filedatas = UnityHelper.ReadFile(filepath, ref errorinfo);
  706. byte[] tempbytes = new byte[200];
  707. if (filedatas.Length < 200)
  708. {
  709. tempbytes = filedatas;
  710. }
  711. else
  712. {
  713. Array.Copy(filedatas, 0, tempbytes, 0, 200);
  714. }
  715. //string orgname = DiodesProgramFileHelper.GetProgramName(tempbytes, ref errorinfo);
  716. string programname = DiodesProgramFileHelper.GetProgramName(tempbytes, ref errorinfo);
  717. string filedir = $"d:\\aaaa\\{programname}";
  718. if (!Directory.Exists(@filedir))
  719. {
  720. Directory.CreateDirectory(@filedir);
  721. }
  722. }
  723. /// <summary>
  724. /// 广播状态
  725. /// </summary>
  726. /// <param name="status"></param>
  727. /// <param name="errorinfo"></param>
  728. /// <returns></returns>
  729. private int BroadcastForMes(OrderBlock entity, ref string errorinfo)
  730. {
  731. try
  732. {
  733. loger.LogError($"机台编号={entity.MainMsg.McaCode},料盒事件={entity.MainMsg.EventCode},广播......");
  734. byte[] queuedata = EntityHelper.SerializeBytes<OrderBlock>(entity);
  735. if (queuedata == null)
  736. return -1;
  737. CurrQueueChannel.ExchangeDeclare(exchange: "LOrDExchange", type: "fanout", durable: false, autoDelete: true);
  738. CurrQueueChannel.BasicPublish("LOrDExchange", "", null, queuedata); //开始传递
  739. return 1;
  740. }
  741. catch (Exception ex)
  742. {
  743. errorinfo = ex.Message.ToString();
  744. loger.LogError($"机台编号={entity.MainMsg.McaCode},料盒事件={entity.MainMsg.EventCode},广播发生错误={errorinfo}");
  745. return -1;
  746. }
  747. }
  748. private int WriteBusinessToQueue(string queuename, MacStatus status, ref string errorinfo)
  749. {
  750. try
  751. {
  752. byte[] queuedata = EntityHelper.SerializeBytes<MacStatus>(status);
  753. if (queuedata == null)
  754. return -1;
  755. CurrQueueChannel.QueueDeclare(queuename, false, false, false, null);//创建一个名称为hello的消息队列
  756. CurrQueueChannel.BasicPublish("", queuename, null, queuedata); //开始传递
  757. return 1;
  758. }
  759. catch (Exception ex)
  760. {
  761. errorinfo = ex.Message.ToString();
  762. return -1;
  763. }
  764. }
  765. public void SetText(string str)
  766. {
  767. loger.LogError(str);
  768. if (CurrInfo.Count > 100)
  769. {
  770. lock (CurrInfo)
  771. {
  772. CurrInfo.Clear();
  773. }
  774. }
  775. int id = 1;
  776. if (CurrInfo.Count > 0)
  777. {
  778. id = CurrInfo.Max(t => t.ID);
  779. id++;
  780. }
  781. ServerInfo entity = new ServerInfo();
  782. entity.ID = id;
  783. entity.Info = str;
  784. CurrInfo.Add(entity);
  785. //写入日志
  786. }
  787. public int ReadOrder(IDatabase db, ref string errorinfo)
  788. {
  789. try
  790. {
  791. //db.BeginTrans();
  792. CurrReportDetail = db.FindListForCondition<ReportDetail>("", ref errorinfo).ToList();
  793. if (CurrReportDetail == null)
  794. {
  795. SetText(errorinfo);
  796. return -1;
  797. }
  798. CurrMacOrder = db.FindListForCondition<MacOrder>("", ref errorinfo).ToList();
  799. if (CurrMacOrder == null)
  800. {
  801. SetText(errorinfo);
  802. return -1;
  803. }
  804. CurrOrderStatus = db.FindListForCondition<OrderStatus>("", ref errorinfo).ToList();
  805. if (CurrMacOrder == null)
  806. {
  807. SetText(errorinfo);
  808. return -1;
  809. }
  810. return 1;
  811. }
  812. catch (Exception ex)
  813. {
  814. errorinfo = ex.Message.ToString();
  815. return -1;
  816. }
  817. }
  818. /// <summary>
  819. /// 启动RMS系统
  820. /// </summary>
  821. public int Start(ref string errorinfo)
  822. {
  823. //Test();
  824. //IDatabase CurrDb = null;
  825. try
  826. {
  827. loger.LogInformation("开始启动服务。");
  828. Stop(ref errorinfo);
  829. if (errorinfo != "")
  830. {
  831. SetText($"停止服务发生错误,错误信息为:{errorinfo}");
  832. }
  833. CurrRecQueueName = AppConfigurtaionServices.Configuration["mqname:recmqname"];
  834. CurrStatusQueueName = AppConfigurtaionServices.Configuration["mqname:statusmqname"];
  835. StatusExchange = AppConfigurtaionServices.Configuration["mqname:statusexchange"];
  836. StatusTotalExchange = AppConfigurtaionServices.Configuration["mqname:StatusTotalExchange"];
  837. CurrDb = DbFactory.Base(CallFunction.CurrDbCode);
  838. CurrStatus = -1;
  839. int result = ReadOrder(CurrDb, ref errorinfo);
  840. if (result <= 0)
  841. {
  842. errorinfo = $"读取指令信息失败:{errorinfo}";
  843. return -1;
  844. }
  845. CurrQueueChannel = RegeditChannel(ref errorinfo);
  846. if (CurrQueueChannel == null)
  847. {
  848. SetText("注册队列通道发生错误:" + errorinfo);
  849. return -1;
  850. }
  851. result = StartRecQueue(ref errorinfo);
  852. if (result < 0)
  853. {
  854. SetText("启动发生错误:" + errorinfo);
  855. return -1;
  856. }
  857. SetText("启动成功。");
  858. CurrStatus = 1;
  859. return 1;
  860. }
  861. catch (Exception ex)
  862. {
  863. SetText(ex.Message.ToString());
  864. return -1;
  865. }
  866. //finally
  867. //{
  868. // if (CurrDb != null)
  869. // CurrDb.Close();
  870. //}
  871. }
  872. public int GetStatus(ref string errorinfo)
  873. {
  874. if (CurrStatus <= 0 && CurrInfo.Count > 0)
  875. {
  876. errorinfo = CurrInfo.Last().Info;
  877. }
  878. return CurrStatus;
  879. }
  880. public long GetAccount()
  881. {
  882. return CurrCount;
  883. }
  884. public List<ServerInfo> GetInfo()
  885. {
  886. if (CurrInfo.Count <= 100)
  887. return CurrInfo;
  888. List<ServerInfo> templist = new List<ServerInfo>();
  889. for (int i = CurrInfo.Count - 100; i < CurrInfo.Count; i++)
  890. templist.Add(CurrInfo[i]);
  891. return templist;
  892. }
  893. public int Stop(ref string errorinfo)
  894. {
  895. try
  896. {
  897. if (CurrDb != null)
  898. CurrDb.Close();
  899. CurrStatus = -1;
  900. if (CurrQueueChannel != null)
  901. CurrQueueChannel.Close();
  902. SetText("停止服务成功。");
  903. return 1;
  904. }
  905. catch (Exception ex)
  906. {
  907. SetText(ex.Message.ToString());
  908. return -1;
  909. }
  910. }
  911. public int ClearInfo(ref string errorinfo)
  912. {
  913. try
  914. {
  915. CurrInfo.Clear();
  916. return 1;
  917. }
  918. catch (Exception ex)
  919. {
  920. SetText(ex.Message.ToString());
  921. return -1;
  922. }
  923. }
  924. /// <summary>
  925. /// 刷新指令信息
  926. /// </summary>
  927. /// <param name="errorinfo"></param>
  928. /// <returns></returns>
  929. public int RefreshOrders(ref string errorinfo)
  930. {
  931. using (IDatabase db = DbFactory.Base(ReadDbCode))
  932. {
  933. return this.ReadOrder(db, ref errorinfo);
  934. }
  935. }
  936. }
  937. }