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 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 CurrReportDetail = null; private List CurrMacOrder = null; private List CurrOrderStatus = null; private List CurrInfo = new List();//记录错误信息 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 lastStatuses = new List(); List Tasks = new List(); List threads = new List(); List macStatuses = new List(); //开始接收队列线程 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(); 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(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 ComParams(OrderDetail order, List lists, ref string errorinfo) { try { int sval = order.SVal; int fval = order.FVal; List 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(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 lists = entity.Datalists; //修改为实时从数据库中读取指令信息 List 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 temporderstatus = CurrOrderStatus.Where(t => t.PreID == tempmacorders[0].PreID).ToList(); //List 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(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; } } /// /// 处理状态改变事件 /// /// /// /// /// /// private int ProcessStatus(OrderBlock entity, MacOrder macorder, List lists, ref string errorinfo) { try { List temporderstatus = CurrOrderStatus.Where(t => t.PreID == macorder.PreID).ToList(); //List 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 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 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(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); } } /// /// 广播状态 /// /// /// /// private int BroadcastForMes(OrderBlock entity, ref string errorinfo) { try { loger.LogError($"机台编号={entity.MainMsg.McaCode},料盒事件={entity.MainMsg.EventCode},广播......"); byte[] queuedata = EntityHelper.SerializeBytes(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(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("", ref errorinfo).ToList(); if (CurrReportDetail == null) { SetText(errorinfo); return -1; } CurrMacOrder = db.FindListForCondition("", ref errorinfo).ToList(); if (CurrMacOrder == null) { SetText(errorinfo); return -1; } CurrOrderStatus = db.FindListForCondition("", ref errorinfo).ToList(); if (CurrMacOrder == null) { SetText(errorinfo); return -1; } return 1; } catch (Exception ex) { errorinfo = ex.Message.ToString(); return -1; } } /// /// 启动RMS系统 /// 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 GetInfo() { if (CurrInfo.Count <= 100) return CurrInfo; List templist = new List(); 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; } } /// /// 刷新指令信息 /// /// /// public int RefreshOrders(ref string errorinfo) { using (IDatabase db = DbFactory.Base(ReadDbCode)) { return this.ReadOrder(db, ref errorinfo); } } } }