123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973 |
- using Cksoft.Data;
- using Cksoft.Data.Repository;
- using Cksoft.Unity;
- using DllEapDal;
- using DllEapEntity;
- using DllHsms;
- using Microsoft.Extensions.Logging;
- using RabbitMQ.Client;
- using RabbitMQ.Client.Events;
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- using Microsoft.Extensions.Caching.Memory;
- using WebStatusToolkit;
- using DllEapDal.OFILM;
- using DllEapCommon.Notice;
- using WebStatusToolkit.Notice;
- namespace DllBIStatusServer
- {
- public class BIStatusServer : IBIStatusServer
- {
- private ILogger loger = null;
- public BIStatusServer(ILogger<BIStatusServer> loger)
- {
- this.loger = loger;
- CurrMaxBlock = long.Parse(AppConfigurtaionServices.Configuration["MaxBlock"]);
- CurrShareFileDir = AppConfigurtaionServices.Configuration["ShareFileDir"];
- CurrProgramDir = AppConfigurtaionServices.Configuration["ProgramDir"];
- delay = Convert.ToInt32(AppConfigurtaionServices.Configuration["BIDelay"]);
- ignore = Convert.ToInt32(AppConfigurtaionServices.Configuration["BIIgnore"]);
- }
- private long CurrCount = 0;
- private IModel CurrQueueChannel = null;
- private string CurrRecQueueName = "hello";//
- private string CurrStatusQueueName = "hello";//状态显示队列名称
- private string StatusQueueName = "BIStatus";
- private string StatusExchange = "";//状态交换机名称
- private string StatusTotalExchange = "";
- private DateTime CurrSTime = DateTime.Now;//开始时间
- //private int CurrDbTime = 30;//提交数据到数据库的间接时间,以秒为单位
- private List<ReportDetail> CurrReportDetail = null;
- private List<MacOrder> CurrMacOrder = null;
- private List<OrderStatus> CurrOrderStatus = null;
- private List<ServerInfo> CurrInfo = new List<ServerInfo>();//记录错误信息
- private IDatabase CurrDb = null;
- private int CurrStatus = -1;//未启动状态
- private string DbCode = "eap";
- private string ReadDbCode = "eapslave";
- public long CurrMaxBlock = 0;
- public string CurrShareFileDir = "";
- private string CurrProgramDir = "";
- private int delay = 0;
- private int ignore = 0;
- List<MacStatus> lastStatuses = new List<MacStatus>();
- List<Task> Tasks = new List<Task>();
- List<Thread> threads = new List<Thread>();
- List<MacStatus> macStatuses = new List<MacStatus>();
- //开始接收队列线程
- public int StartRecQueue(ref string errorinfo)
- {
- try
- {
- CurrQueueChannel.QueueDeclare(CurrRecQueueName, false, false, false, null);
- CurrQueueChannel.BasicQos(0, 1, false);
- var consumer = new EventingBasicConsumer(CurrQueueChannel);
- CurrQueueChannel.BasicConsume(queue: CurrRecQueueName,
- autoAck: false, //是否不要手动应答(no manual Ack),ture自动应答,自动删除处理消息;false手动应答,服务器的消息会等待应答结果才消除
- consumer: consumer);
- consumer.Received += QueueReceive;
- Thread thread = new Thread(async () =>
- {
- while (true)
- {
- try
- {
- Thread.Sleep(delay * 1000);
- var now = DateTime.Now;
- var pushedStatuses = macStatuses.Where(c => c.MacCode.Length == 7).ToList();
- var temp = new List<MacStatus>();
- var grouped = pushedStatuses.GroupBy(c => c.MacCode);
- foreach (var item in grouped)
- {
- //var last = lastStatuses.FirstOrDefault(c => c.MacCode == item.Key);
- //if (last == null || (item.First().STime - last.STime).TotalSeconds >= 5)
- //{
- // temp.Add(item.First());
- //}
- var last = lastStatuses.FirstOrDefault(c => c.MacCode == item.Key);
- for (int i = 0; i < item.Count(); i++)
- {
- var currStatus = item.ElementAt(i);
- var currLastStatus = temp.LastOrDefault(c => c.MacCode == currStatus.MacCode);
- if (currLastStatus == null)
- {
- if (last == null || last.StatusID != currStatus.StatusID)
- {
- temp.Add(currStatus);
- }
- continue;
- }
- var lastRecipe = (!string.IsNullOrEmpty(currLastStatus.Remark)) ? currLastStatus.Remark.Replace(" ", "-").Replace("_", "-").Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries)[0] : "";
- var currRecipe = (!string.IsNullOrEmpty(currStatus.Remark)) ? currStatus.Remark?.Replace(" ", "-").Replace("_", "-").Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries)[0] : "";
- if (currStatus.StatusID != currLastStatus.StatusID || lastRecipe != currRecipe)
- {
- if ((currStatus.STime - currLastStatus.STime).TotalSeconds < ignore)
- {
- temp.Remove(currLastStatus);
- }
- temp.Add(currStatus);
- }
- }
- }
- var temps = grouped.Select(c => c.Last()).ToList();
- foreach (var status in temps)
- {
- var model = lastStatuses.FirstOrDefault(c => c.MacCode == status.MacCode);
- if (model == null)
- {
- lastStatuses.Add(status);
- }
- else
- {
- lastStatuses.Remove(model);
- lastStatuses.Add(status);
- }
- }
- // lastStatuses = grouped.Select(c => c.Last()).ToList();
- using (IDatabase db = DbFactory.Base("eapslave"))
- {
- string error = string.Empty;
- var dal = new BICollectDal(db);
- await dal.PushStatusToBIBatch(temp, error);
- }
- lock (macStatuses)
- {
- macStatuses = macStatuses.Except(pushedStatuses).ToList();
- }
- }
- catch (Exception ex)
- {
- loger.LogError(ex.ToString());
- string error1 = string.Empty;
- string content = $"推送BI状态数据失败[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}],服务器:[{AppConfigurtaionServices.Configuration["SystemCode"]}],异常为:{ex.Message}";
- ServiceErrorNoticeHelper.Notice(content, ref error1);
- }
- }
- });
- thread.Start();
- return 1;
- }
- catch (Exception ex)
- {
- errorinfo = ex.Message.ToString();
- return -1;
- }
- }
- //注册通道
- private IModel RegeditChannel(ref string errorinfo)
- {
- try
- {
- var factory = new ConnectionFactory();
- factory.HostName = AppConfigurtaionServices.Configuration["rabbitmq:IPAddress"];
- factory.UserName = AppConfigurtaionServices.Configuration["rabbitmq:UserName"];
- factory.Password = AppConfigurtaionServices.Configuration["rabbitmq:Password"];
- //CurrQueueName = AppConfigurtaionServices.Configuration["mqname:macrecmqname"];
- var connection = factory.CreateConnection();
- var channel = connection.CreateModel();
- return channel;
- }
- catch (Exception ex)
- {
- errorinfo = ex.Message.ToString();
- return null;
- }
- }
- private int ClearRecQueue(ref string errorinfo)
- {
- try
- {
- CurrQueueChannel.QueueDelete(CurrRecQueueName, true, false);
- return 1;
- }
- catch (Exception ex)
- {
- errorinfo = ex.Message.ToString();
- return -1;
- }
- }
- private void QueueReceive(object model, BasicDeliverEventArgs ea)
- {
- var obj = model as EventingBasicConsumer;
- obj.Model.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
- CurrCount++;
- string errorinfo = string.Empty;
- var entity = EntityHelper.DeSerializeBytes<MacStatus>(ea.Body);
- lock (macStatuses)
- {
- // macStatuses.Add(entity);
- var lastStatus = macStatuses?.OrderBy(c => c.STime).LastOrDefault(c => c.MacCode == entity.MacCode);
- if (lastStatus == null)
- {
- }
- else
- {
- if (!((entity.STime - lastStatus.STime).TotalSeconds >= ignore))
- {
- macStatuses.Remove(lastStatus);
- }
- }
- macStatuses.Add(entity);
- }
- }
- private List<McaSecVDetail> ComParams(OrderDetail order, List<OrderData> lists, ref string errorinfo)
- {
- try
- {
- int sval = order.SVal;
- int fval = order.FVal;
- List<McaSecVDetail> tempdt = null;
- tempdt = HsmsUnity.GetOrderS6F11Dt(lists, CurrReportDetail, ref errorinfo);
- if (tempdt == null)
- {
- errorinfo = "GetOrderS6F11Dt函数错误:" + errorinfo;
- return null;
- }
- return tempdt;
- }
- catch (Exception ex)
- {
- errorinfo = ex.Message.ToString();
- return null;
- }
- }
- private void ProcessEventForTask(byte[] datas)
- {
- try
- {
- string errorinfo = "";
- int result = ProcessEvent(datas, ref errorinfo);
- if (result <= 0)
- {
- string logerrorinfo = "";
- SetText(errorinfo + "\r\n");
- }
- }
- catch (Exception ex)
- {
- SetText(ex.Message.ToString() + "\r\n");
- }
- }
- private int ProcessEvent(byte[] datas, ref string errorinfo)
- {
- try
- {
- OrderBlock entity = EntityHelper.DeSerializeBytes<OrderBlock>(datas);
- int result = entity.RecoverData(CurrShareFileDir, ref errorinfo);
- if (result <= 0)
- return -1;
- //loger.LogError($"机台编号={entity.MainMsg.McaCode};开始处理:{entity.ToJson()}");
- if (entity.MainMsg.McaCode == "LHA0021")
- {
- int aa = 100;
- }
- //数据转换
- int ftype = entity.MainMsg.FType;// int.Parse(orgds.Tables["McaSecVMst"].Rows[0]["FType"].ToString());
- OrderDetail orderdetail = entity.CurrOrder;
- List<OrderData> lists = entity.Datalists;
- //修改为实时从数据库中读取指令信息
- List<MacOrder> tempmacorders = CurrMacOrder.Where(t => t.MacFCode == entity.MainMsg.McaCode).ToList();
- if (tempmacorders.Count <= 0)
- {
- //重新读取一次指令数据
- //using (IDatabase db = DbFactory.Base(DbCode))
- //{
- // result = ReadOrder(db, ref errorinfo);
- //}
- //if (result <= 0)
- //{
- // errorinfo = $"读取指令信息失败:{errorinfo}";
- // return -1;
- //}
- tempmacorders = CurrMacOrder.Where(t => t.MacFCode == entity.MainMsg.McaCode).ToList();
- if (tempmacorders.Count <= 0)
- {
- errorinfo = $"未找到机台【{entity.MainMsg.McaCode}】对应的指令信息。";
- return -1;
- }
- }
- List<OrderStatus> temporderstatus = CurrOrderStatus.Where(t => t.PreID == tempmacorders[0].PreID).ToList();
- //List<OrderStatus> temporderstatus = CallFunction.GetOrderStatus(macorder.PreID, ref errorinfo);
- //if (temporderstatus == null)
- // return -1;
- //说明是断开开事件
- if (entity.MainMsg.FType < 0 && entity.MainMsg.FStatus < 0)
- {
- MacStatus tempstatus = HsmsUnity.GetDisconn(entity.MainMsg.McaCode, entity.MainMsg.ptime, ref errorinfo);
- result = ProcessStatus(tempstatus, "", ref errorinfo);
- if (result < 0)
- return -1;
- return 1;
- }
- //说明是连接成功事件
- if (entity.MainMsg.FType < 0 && entity.MainMsg.FStatus > 0)
- {
- if (entity.MainMsg.McaCode == "DA00003")
- {
- int aa = 100;
- }
- //添加连接成功,然后添加当前状态
- //MacStatus tempstatus = HsmsUnity.GetMacStatusForIdle(entity.MainMsg.McaCode, entity.MainMsg.ptime, temporderstatus, ref errorinfo);
- MacStatus tempstatus = HsmsUnity.GetDisconn(entity.MainMsg.McaCode, entity.MainMsg.ptime, ref errorinfo);
- result = ProcessStatus(tempstatus, entity.MainMsg.McaCode, ref errorinfo);
- if (result < 0)
- return -1;
- tempstatus = HsmsUnity.GetMacStatus(entity.MainMsg.McaCode, entity.MainMsg.ptime, entity.MainMsg.EventCode, temporderstatus, ref errorinfo);
- result = ProcessStatus(tempstatus, entity.MainMsg.McaCode, ref errorinfo);
- if (result < 0)
- return -1;
- return 1;
- }
- string eventcode = HsmsUnity.GetEventCode(DbFactory.Base(ReadDbCode), entity.MainMsg.McaCode, entity.CurrOrder, entity.Datalists, ref errorinfo);
- if (eventcode == "")
- return -1;
- entity.MainMsg.EventCode = eventcode;
- switch (eventcode)
- {
- case StandardCode.CEID_StatusChange:
- case StandardCode.CEID_AlarmOccurred:
- case StandardCode.CEID_AlarmRelease:
- case StandardCode.CEID_Exceting:
- case StandardCode.CEID_End:
- case StandardCode.CEID_Completed:
- if (entity.MainMsg.McaCode == "DA00003")
- {
- int a = 100;
- }
- //状态改变事件
- result = ProcessStatus(entity, tempmacorders[0], lists, ref errorinfo);
- if (result < 0)
- {
- errorinfo = $"机台编号={entity.MainMsg.McaCode};ProcessStatus发生错误:{errorinfo}";
- return -1;
- }
- break;
- case StandardCode.CEID_FullAutoEnd://全自动结束
- result = ClearProgram(entity, tempmacorders[0], lists, ref errorinfo);
- if (result <= 0)
- {
- errorinfo = $"机台编号={entity.MainMsg.McaCode};ClearProgram发生错误:{errorinfo}";
- loger.LogError(errorinfo);
- }
- else
- {
- loger.LogError($"机台编号={entity.MainMsg.McaCode}清理程序完成。");
- }
- loger.LogError($"机台编号={entity.MainMsg.McaCode}开始自动TRACKOUT......");
- result = CallFunction.AutoTrackOut(entity, ref errorinfo);
- if (result <= 0)
- {
- loger.LogError($"机台编号={entity.MainMsg.McaCode}自动TRACKOUT失败:{errorinfo}");
- }
- else
- {
- loger.LogError($"机台编号={entity.MainMsg.McaCode}自动TRACKOUT成功完成。");
- }
- return 1;
- //case StandardCode.CEID_FullAutoStart://全自动开始
- //case StandardCode.CEID_FullAutoReStart://全自动重新开始
- case StandardCode.CEID_CutStart://切割开始
- result = CallFunction.CompareParams(entity.MainMsg.McaCode, "", ref errorinfo);
- if (result <= 0)
- {
- errorinfo = $"参数比对失败【{entity.MainMsg.McaCode}】:{errorinfo}";
- return -1;
- }
- return 1;
- case StandardCode.CEID_UpProgram:
- //上传程序事件
- result = ProcessUpProgram(entity, ref errorinfo);
- if (result < 0)
- {
- errorinfo = $"机台编号={entity.MainMsg.McaCode};ProcessUpProgram发生错误:{errorinfo}";
- return -1;
- }
- loger.LogError(errorinfo);
- SetText("上传程序成功。\r\n");
- break;
- case StandardCode.CEID_RequestUpProgram:
- if (AppConfigurtaionServices.Configuration["CallMesInterface"] != null && Convert.ToBoolean(AppConfigurtaionServices.Configuration["CallMesInterface"]))
- {
- loger.LogError($"机台编号={entity.MainMsg.McaCode} 开始使用文件方式调程");
- //上传程序事件
- result = CallFunction.UpProgramForFile(entity, CurrProgramDir, "", ref errorinfo);
- if (result < 0)
- {
- errorinfo = $"机台编号={entity.MainMsg.McaCode};UpProgramForFile发生错误:{errorinfo}";
- return -1;
- }
- loger.LogError(errorinfo);
- SetText("上传程序成功。\r\n");
- }
- break;
- case StandardCode.CEID_PPModifyed://修改程序事件,需要比对程序文件参数
- result = CallFunction.SaveProgram(entity.MainMsg.McaCode, "", ref errorinfo);
- if (result <= 0)
- {
- errorinfo = $"机台编号={entity.MainMsg.McaCode};SaveProgram发生错误:{errorinfo}";
- return -1;
- }
- break;
- case StandardCode.CEID_OutBoxDown:
- case StandardCode.CEID_OutBoxLoad:
- BroadcastForMes(entity, ref errorinfo);
- //统计产量
- result = CallFunction.AccountMacCount(entity.MainMsg.McaCode, "", ref errorinfo);
- if (result <= 0)
- {
- errorinfo = $"机台编号={entity.MainMsg.McaCode};统计参量失败:{errorinfo}";
- return -1;
- }
- break;
- case StandardCode.CEID_InBoxLoad:
- BroadcastForMes(entity, ref errorinfo);
- break;
- }
- return 1;
- }
- catch (Exception ex)
- {
- errorinfo = "IMcaSecVMst01" + ex.Message.ToString();
- return -1;
- }
- }
- private int BroadcastStatus(MacStatus status, ref string errorinfo)
- {
- try
- {
- byte[] queuedata = EntityHelper.SerializeBytes<MacStatus>(status);
- if (queuedata == null)
- return -1;
- CurrQueueChannel.ExchangeDeclare(exchange: StatusExchange, type: "fanout", durable: false, autoDelete: true);
- CurrQueueChannel.BasicPublish(StatusExchange, "", null, queuedata); //开始传递
- return 1;
- }
- catch (Exception ex)
- {
- errorinfo = ex.Message.ToString();
- return -1;
- }
- }
- /// <summary>
- /// 处理状态改变事件
- /// </summary>
- /// <param name="entity"></param>
- /// <param name="macorder"></param>
- /// <param name="lists"></param>
- /// <param name="errorinfo"></param>
- /// <returns></returns>
- private int ProcessStatus(OrderBlock entity, MacOrder macorder, List<OrderData> lists, ref string errorinfo)
- {
- try
- {
- List<OrderStatus> temporderstatus = CurrOrderStatus.Where(t => t.PreID == macorder.PreID).ToList();
- //List<OrderStatus> temporderstatus = CallFunction.GetOrderStatus(macorder.PreID, ref errorinfo);
- //if (temporderstatus == null)
- // return -1;
- MacStatus currstatus = HsmsUnity.GetMacStatus(macorder, temporderstatus, entity.CurrOrder, lists, CurrReportDetail, ref errorinfo);
- currstatus.MacCode = entity.MainMsg.McaCode;
- currstatus.STime = entity.MainMsg.ptime;
- int result = 0;
- //删除3350的程序,
- //if (currstatus.StatusID == MacStatusVal.Stop)
- //{
- // string logerrorinfo = "";
- // WriteLog.WriteLogStr(entity.MainMsg.McaCode, "", DateTime.Now, $"开始清除程序", ref logerrorinfo);
- // CallFunction.ClearProgram(entity, "", ref errorinfo);
- // WriteLog.WriteLogStr(entity.MainMsg.McaCode, "", DateTime.Now, $"清除程序完成:{errorinfo}", ref logerrorinfo);
- // result = CallFunction.AutoTrackOut(entity, ref errorinfo);
- // if (result <= 0)
- // {
- // loger.LogError($"机台编号={entity.MainMsg.McaCode}自动TRACKOUT失败:{errorinfo}");
- // }
- // else
- // {
- // loger.LogError($"机台编号={entity.MainMsg.McaCode}自动TRACKOUT失败完成。");
- // }
- // //自动过站
- //}
- result = ProcessStatus(currstatus, entity.MainMsg.McaCode, ref errorinfo);
- return result;
- }
- catch (Exception ex)
- {
- errorinfo = ex.Message.ToString();
- return -1;
- }
- }
- //清除程序
- private int ClearProgram(OrderBlock entity, MacOrder macorder, List<OrderData> lists, ref string errorinfo)
- {
- try
- {
- Machine mac = CallFunction.GetMachine(entity.MainMsg.McaCode, ref errorinfo);
- if (mac == null)
- {
- return -1;
- }
- string logerrorinfo = "";
- WriteLog.WriteLogStr(entity.MainMsg.McaCode, "", DateTime.Now, $"开始清除程序", ref logerrorinfo);
- int result = CallFunction.ClearProgram(entity, "", ref errorinfo);
- if (result <= 0)
- {
- WriteLog.WriteLogStr(entity.MainMsg.McaCode, "", DateTime.Now, $"清除程序发生错误:{errorinfo}", ref logerrorinfo);
- return -1;
- }
- else
- {
- WriteLog.WriteLogStr(entity.MainMsg.McaCode, "", DateTime.Now, $"清除程序成功......", ref logerrorinfo);
- }
- //if (mac.MModeCode.ToLower()=="dad3350")
- //{
- // List<OrderStatus> temporderstatus = CurrOrderStatus.Where(t => t.PreID == macorder.PreID).ToList();
- // MacStatus currstatus = HsmsUnity.GetMacStatus(macorder, temporderstatus, entity.CurrOrder, lists, CurrReportDetail, ref errorinfo);
- // currstatus.MacCode = entity.MainMsg.McaCode;
- // currstatus.STime = entity.MainMsg.ptime;
- // //删除3350的程序,
- // if (currstatus.StatusID == MacStatusVal.Stop)
- // {
- // string logerrorinfo = "";
- // WriteLog.WriteLogStr(entity.MainMsg.McaCode, "", DateTime.Now, $"开始清除程序", ref logerrorinfo);
- // CallFunction.ClearProgram(entity, "", ref errorinfo);
- // WriteLog.WriteLogStr(entity.MainMsg.McaCode, "", DateTime.Now, $"清除程序完成:{errorinfo}", ref logerrorinfo);
- // }
- // if (currstatus.StatusID == MacStatusVal.Run)
- // {
- // int result = ProcessStatus(entity, macorder, lists, ref errorinfo);
- // if (result <= 0)
- // return -1;
- // }
- //}
- //else
- //{
- // int result = CallFunction.ClearProgram(entity, "", ref errorinfo);
- // if (result <= 0)
- // {
- // string logerrorinfo = "";
- // WriteLog.WriteLogStr(entity.MainMsg.McaCode, "", DateTime.Now, $"发生错误:{errorinfo}", ref logerrorinfo);
- // return -1;
- // }
- //}
- return 1;
- }
- catch (Exception ex)
- {
- errorinfo = ex.Message.ToString();
- return -1;
- }
- }
- private int ProcessStatus(MacStatus currstatus, string maccode, ref string errorinfo)
- {
- try
- {
- if ((currstatus.Remark is null || currstatus.Remark.Trim() == "") && maccode != "")
- {
- string programname = CallFunction.GetProgramName(maccode, ref errorinfo);
- if (programname == "")
- {
- errorinfo = $"机台=【{currstatus.MacCode}】获取程序名称失败,{errorinfo}";
- return -1;
- }
- currstatus.Remark = programname;
- }
- currstatus.RecTime = DateTime.Now;
- currstatus.ProgramName = AppConfigurtaionServices.Configuration["SystemCode"];
- //如果是状态报警,则做以下处理
- if (currstatus.StatusID == MacStatusVal.Error && string.IsNullOrEmpty(currstatus.AlarmCode) && string.IsNullOrEmpty(currstatus.AlarmDescribe))
- {
- loger.LogError($"机台编号={currstatus.MacCode}的报警代码和描述为空");
- currstatus.AlarmCode = "SVID";
- currstatus.AlarmDescribe = "SVID状态报警";
- }
- //lock (macStatuses)
- //{
- // if (currstatus != null)
- // {
- // macStatuses.Add(currstatus);
- // }
- //}
- if (AppConfigurtaionServices.Configuration["CallMesInterface"] != null && Convert.ToBoolean(AppConfigurtaionServices.Configuration["CallMesInterface"]))
- {
- //与上一次的程序名称比较,如果不同则调用QIS首件接口,通知已改机
- }
- int tempresult = BroadcastStatus(currstatus, ref errorinfo);
- if (tempresult <= 0)
- {
- loger.LogError($"广播状态发生错误:{errorinfo}");
- }
- // 将数据抛到Status队列上
- byte[] queuedata = EntityHelper.SerializeBytes<MacStatus>(currstatus);
- CurrQueueChannel.BasicPublish("", StatusQueueName, null, queuedata);
- if (currstatus.StatusID == MacStatusVal.Run)
- {
- //比对参数
- //tempresult = CallFunction.CompareParams(currstatus.MacCode, "", ref errorinfo);
- //if (tempresult <= 0)
- //{
- // errorinfo = $"参数比对失败【{currstatus.MacCode}】:{errorinfo}";
- // return -1;
- //}
- if (!(AppConfigurtaionServices.Configuration["CallMesInterface"] != null && Convert.ToBoolean(AppConfigurtaionServices.Configuration["CallMesInterface"])))
- {
- //不是欧菲光的要比对参数
- loger.LogError($"机台={currstatus.MacCode}开始比对参数......");
- tempresult = CallFunction.CompareParams(currstatus.MacCode, "", ref errorinfo);
- if (tempresult <= 0)
- {
- errorinfo = $"参数比对失败【{currstatus.MacCode}】:{errorinfo}";
- return -1;
- }
- }
- else
- {
- tempresult = CallFunction.CompareParamsForOfilm(currstatus.MacCode, "", ref errorinfo);
- if (tempresult <= 0)
- {
- errorinfo = $"参数比对失败【{currstatus.MacCode}】:{errorinfo}";
- return -1;
- }
- }
- loger.LogError(errorinfo);
- }
- #region
- //if (macStatuses.Count > 20)
- //{
- // macStatuses = macStatuses.OrderBy(c => c.MacCode).ThenBy(c => c.STime).ToList();
- // foreach (var item in macStatuses)
- // {
- // //插入状态值
- // MacStatus resultstatu s= CallFunction.CallIMacStatus(currstatus, "", ref errorinfo);
- // if (resultstatus == null)
- // return -1;
- // //将状态发送给显示客户端
- // //int tempresult = WriteBusinessToQueue(CurrStatusQueueName, resultstatus, ref errorinfo);
- // //if (tempresult <= 0)
- // // return -1;
- // //广播消息
- // int tempresult = BroadcastStatus(resultstatus, ref errorinfo);
- // if (tempresult <= 0)
- // return -1;
- // //测试参数比对代码,正式环境注销
- // //tempresult = CallFunction.CallCompareParams(entity.MainMsg.McaCode, ref errorinfo);
- // //if (tempresult <= 0)
- // // return -1;
- // if (resultstatus.StatusID == MacStatusVal.Run)
- // {
- // //比对参数
- // //tempresult = CallFunction.CompareParams(currstatus.MacCode, "", ref errorinfo);
- // //if (tempresult <= 0)
- // //{
- // // errorinfo = $"参数比对失败【{currstatus.MacCode}】:{errorinfo}";
- // // return -1;
- // //}
- // tempresult = CallFunction.CompareParamsForOfilm(currstatus.MacCode, "", ref errorinfo);
- // if (tempresult <= 0)
- // {
- // errorinfo = $"参数比对失败【{currstatus.MacCode}】:{errorinfo}";
- // return -1;
- // }
- // loger.LogError(errorinfo);
- // }
- // }
- // macStatuses.RemoveAll(c => true);
- //}
- #endregion
- return 1;
- }
- catch (Exception ex)
- {
- errorinfo = $"机台编号【{currstatus.MacCode}】" + ex.ToString();
- return -1;
- }
- }
- private int ProcessUpProgram(OrderBlock entity, ref string errorinfo)
- {
- try
- {
- int result = CallFunction.UpProgram(entity, CurrProgramDir, "", ref errorinfo);
- return result;
- }
- catch (Exception ex)
- {
- errorinfo = ex.Message.ToString();
- return -1;
- }
- }
- private void Test()
- {
- string filepath = @"D:\eap\1N4148W-7-F.W1003FM-FW001.4CH_1";
- string errorinfo = "";
- byte[] filedatas = UnityHelper.ReadFile(filepath, ref errorinfo);
- byte[] tempbytes = new byte[200];
- if (filedatas.Length < 200)
- {
- tempbytes = filedatas;
- }
- else
- {
- Array.Copy(filedatas, 0, tempbytes, 0, 200);
- }
- //string orgname = DiodesProgramFileHelper.GetProgramName(tempbytes, ref errorinfo);
- string programname = DiodesProgramFileHelper.GetProgramName(tempbytes, ref errorinfo);
- string filedir = $"d:\\aaaa\\{programname}";
- if (!Directory.Exists(@filedir))
- {
- Directory.CreateDirectory(@filedir);
- }
- }
- /// <summary>
- /// 广播状态
- /// </summary>
- /// <param name="status"></param>
- /// <param name="errorinfo"></param>
- /// <returns></returns>
- private int BroadcastForMes(OrderBlock entity, ref string errorinfo)
- {
- try
- {
- loger.LogError($"机台编号={entity.MainMsg.McaCode},料盒事件={entity.MainMsg.EventCode},广播......");
- byte[] queuedata = EntityHelper.SerializeBytes<OrderBlock>(entity);
- if (queuedata == null)
- return -1;
- CurrQueueChannel.ExchangeDeclare(exchange: "LOrDExchange", type: "fanout", durable: false, autoDelete: true);
- CurrQueueChannel.BasicPublish("LOrDExchange", "", null, queuedata); //开始传递
- return 1;
- }
- catch (Exception ex)
- {
- errorinfo = ex.Message.ToString();
- loger.LogError($"机台编号={entity.MainMsg.McaCode},料盒事件={entity.MainMsg.EventCode},广播发生错误={errorinfo}");
- return -1;
- }
- }
- private int WriteBusinessToQueue(string queuename, MacStatus status, ref string errorinfo)
- {
- try
- {
- byte[] queuedata = EntityHelper.SerializeBytes<MacStatus>(status);
- if (queuedata == null)
- return -1;
- CurrQueueChannel.QueueDeclare(queuename, false, false, false, null);//创建一个名称为hello的消息队列
- CurrQueueChannel.BasicPublish("", queuename, null, queuedata); //开始传递
- return 1;
- }
- catch (Exception ex)
- {
- errorinfo = ex.Message.ToString();
- return -1;
- }
- }
- public void SetText(string str)
- {
- loger.LogError(str);
- if (CurrInfo.Count > 100)
- {
- lock (CurrInfo)
- {
- CurrInfo.Clear();
- }
- }
- int id = 1;
- if (CurrInfo.Count > 0)
- {
- id = CurrInfo.Max(t => t.ID);
- id++;
- }
- ServerInfo entity = new ServerInfo();
- entity.ID = id;
- entity.Info = str;
- CurrInfo.Add(entity);
- //写入日志
- }
- public int ReadOrder(IDatabase db, ref string errorinfo)
- {
- try
- {
- //db.BeginTrans();
- CurrReportDetail = db.FindListForCondition<ReportDetail>("", ref errorinfo).ToList();
- if (CurrReportDetail == null)
- {
- SetText(errorinfo);
- return -1;
- }
- CurrMacOrder = db.FindListForCondition<MacOrder>("", ref errorinfo).ToList();
- if (CurrMacOrder == null)
- {
- SetText(errorinfo);
- return -1;
- }
- CurrOrderStatus = db.FindListForCondition<OrderStatus>("", ref errorinfo).ToList();
- if (CurrMacOrder == null)
- {
- SetText(errorinfo);
- return -1;
- }
- return 1;
- }
- catch (Exception ex)
- {
- errorinfo = ex.Message.ToString();
- return -1;
- }
- }
- /// <summary>
- /// 启动RMS系统
- /// </summary>
- public int Start(ref string errorinfo)
- {
- //Test();
- //IDatabase CurrDb = null;
- try
- {
- loger.LogInformation("开始启动服务。");
- Stop(ref errorinfo);
- if (errorinfo != "")
- {
- SetText($"停止服务发生错误,错误信息为:{errorinfo}");
- }
- CurrRecQueueName = AppConfigurtaionServices.Configuration["mqname:recmqname"];
- CurrStatusQueueName = AppConfigurtaionServices.Configuration["mqname:statusmqname"];
- StatusExchange = AppConfigurtaionServices.Configuration["mqname:statusexchange"];
- StatusTotalExchange = AppConfigurtaionServices.Configuration["mqname:StatusTotalExchange"];
- CurrDb = DbFactory.Base(CallFunction.CurrDbCode);
- CurrStatus = -1;
- int result = ReadOrder(CurrDb, ref errorinfo);
- if (result <= 0)
- {
- errorinfo = $"读取指令信息失败:{errorinfo}";
- return -1;
- }
- CurrQueueChannel = RegeditChannel(ref errorinfo);
- if (CurrQueueChannel == null)
- {
- SetText("注册队列通道发生错误:" + errorinfo);
- return -1;
- }
- result = StartRecQueue(ref errorinfo);
- if (result < 0)
- {
- SetText("启动发生错误:" + errorinfo);
- return -1;
- }
- SetText("启动成功。");
- CurrStatus = 1;
- return 1;
- }
- catch (Exception ex)
- {
- SetText(ex.Message.ToString());
- return -1;
- }
- //finally
- //{
- // if (CurrDb != null)
- // CurrDb.Close();
- //}
- }
- public int GetStatus(ref string errorinfo)
- {
- if (CurrStatus <= 0 && CurrInfo.Count > 0)
- {
- errorinfo = CurrInfo.Last().Info;
- }
- return CurrStatus;
- }
- public long GetAccount()
- {
- return CurrCount;
- }
- public List<ServerInfo> GetInfo()
- {
- if (CurrInfo.Count <= 100)
- return CurrInfo;
- List<ServerInfo> templist = new List<ServerInfo>();
- for (int i = CurrInfo.Count - 100; i < CurrInfo.Count; i++)
- templist.Add(CurrInfo[i]);
- return templist;
- }
- public int Stop(ref string errorinfo)
- {
- try
- {
- if (CurrDb != null)
- CurrDb.Close();
- CurrStatus = -1;
- if (CurrQueueChannel != null)
- CurrQueueChannel.Close();
- SetText("停止服务成功。");
- return 1;
- }
- catch (Exception ex)
- {
- SetText(ex.Message.ToString());
- return -1;
- }
- }
- public int ClearInfo(ref string errorinfo)
- {
- try
- {
- CurrInfo.Clear();
- return 1;
- }
- catch (Exception ex)
- {
- SetText(ex.Message.ToString());
- return -1;
- }
- }
- /// <summary>
- /// 刷新指令信息
- /// </summary>
- /// <param name="errorinfo"></param>
- /// <returns></returns>
- public int RefreshOrders(ref string errorinfo)
- {
- using (IDatabase db = DbFactory.Base(ReadDbCode))
- {
- return this.ReadOrder(db, ref errorinfo);
- }
- }
- }
- }
|