using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using Mesnac.Action.Base; using Mesnac.Controls.Base; using System.Windows.Forms; using Mesnac.Codd.Session; using Mesnac.Equips; using Mesnac.Equips.BaseInfo; namespace Mesnac.Action.Default.SynchroData { #region 数据回放类 /// /// 按倍速进行数据回放 /// public class EquipReadDataSpeed : DatabaseAction, IAction { private class SelectParameters { public SelectParameters() { this.StartTime = null; this.EndTime = null; this.PlaySpeed = 1; this.SearchCount = 0; } public DateTime? StartTime { get; set; } public DateTime? EndTime { get; set; } private double _playspeed = 1; public double PlaySpeed { get { return _playspeed; } set { _playspeed = value; if (_playspeed <= 0) { _playspeed = 0; } } } public int SearchCount { get; set; } public object[] ToData() { object[] Result = new object[3]; Result[0] = this.StartTime; Result[1] = this.EndTime; Result[2] = this.PlaySpeed; return Result; } } public void Run(RuntimeParameter runtime) { base.RunIni(runtime); SelectParameters par = new SelectParameters(); IBaseControl StartDate = this.GetAllFormMCControlByKey("StartDate").FirstOrDefault(); IBaseControl EndDate = this.GetAllFormMCControlByKey("EndDate").FirstOrDefault(); IBaseControl StartTime = this.GetAllFormMCControlByKey("StartTime").FirstOrDefault(); IBaseControl EndTime = this.GetAllFormMCControlByKey("EndTime").FirstOrDefault(); if (StartTime != null && EndTime != null && StartDate != null && EndDate != null) { par.StartTime = Convert.ToDateTime(Convert.ToDateTime(StartDate.MCValue).ToString("yyyy-MM-dd") + " " + Convert.ToDateTime(StartTime.MCValue).ToString("HH:mm:ss")); par.EndTime = Convert.ToDateTime(Convert.ToDateTime(EndDate.MCValue).ToString("yyyy-MM-dd") + " " + Convert.ToDateTime(EndTime.MCValue).ToString("HH:mm:ss")); } double speed = 1; if (double.TryParse(runtime.Parameters, out speed)) { par.PlaySpeed = speed; foreach (BaseEquip equip in Factory.Instance.AllEquips.Values) { if (equip.GetType().FullName.StartsWith("Mesnac.Equip.Display")) { equip.Write(0, 0, par.ToData()); } } } } } #endregion #region 回放数据存储 /// /// 设备数据存储 /// public class EquipAutoSaveData : DatabaseAction, IAction { private DbHelper dbHelper = null; private DateTime dt_lastSave = DateTime.Now; private int KeyMaxIndex = 0; private Dictionary KeyIndex = new Dictionary(); private void RefreshKeyIndex(int ideep) { #region 添加所有的信息 if (KeyIndex.Count == 0) { foreach (BaseEquip equip in Mesnac.Equips.Factory.Instance.AllEquips.Values) { foreach (Group group in equip.Group.Values) { foreach (Data data in group.Data.Values) { if (data.IsSave) { KeyIndex.Add(data.KeyName, 0); } } } } } #endregion #region 配置数据位置 //数据查询 string sqlstr = "SELECT * FROM PptVariable"; dbHelper.CommandType = CommandType.Text; dbHelper.CommandText = sqlstr; DataTable dt = dbHelper.ToDataTable(); foreach (DataRow dr in dt.Rows) { string key = dr["VariableName"].ToString(); int idx = Convert.ToInt32(dr["Seq"].ToString()); if (KeyIndex.ContainsKey(key)) { KeyIndex[key] = idx; if (idx > KeyMaxIndex) { KeyMaxIndex = idx; } } } List noTableKey = new List(); foreach (KeyValuePair d in KeyIndex) { if (d.Value == 0) { noTableKey.Add(d.Key); } } #endregion #region 生成数据位置 if (ideep < 1 && noTableKey.Count > 0) { foreach (string keyName in noTableKey) { //插入语句 dbHelper.ClearParameter(); dbHelper.CommandText = "INSERT INTO PptVariable (VariableName) VALUES (@VariableName)"; dbHelper.AddParameter("@VariableName", keyName); if (dbHelper.DbSession.ProviderFactory.GetType().FullName.Contains("OracleClientFactory")) { dbHelper.CommandText = "INSERT INTO PptVariable (VariableName) VALUES (:VariableName)"; dbHelper.AddParameter("VariableName", keyName); } dbHelper.ExecuteNonQuery(); } ideep++; RefreshKeyIndex(ideep); } #endregion } private string DataValue(Dictionary data) { string[] dataList = new string[KeyMaxIndex + 1]; foreach (KeyValuePair d in data) { int idx = 0; if (d.Value != null && d.Value != DBNull.Value && KeyIndex.TryGetValue(d.Key, out idx)) { if (idx > 0) { if (d.Value is DataTable) { dataList[idx] = (d.Value as DataTable).TableName; } else { dataList[idx] = d.Value.ToString(); } } } } string ss = ":"; StringBuilder Result = new StringBuilder(); for (int i = 0; i < dataList.Length; i++) { if (string.IsNullOrWhiteSpace(dataList[i])) { Result.Append(string.Empty).Append(ss); } else { Result.Append(dataList[i].Replace(ss, string.Empty)).Append(ss); } } return Result.ToString(); } private class RunningData { public RunningData(string data) { this.RecordTime = DateTime.Now; this.Data = data; } public DateTime RecordTime { get; private set; } public string Data { get; private set; } } private List SaveRunningDataList = new List(); private void ReadData(object sender, Mesnac.Equips.ReadEventArgs e) { //if (dt_lastSave.AddSeconds(1) < DateTime.Now) { dt_lastSave = DateTime.Now; #region 数据转存 Dictionary datas = new Dictionary(); foreach (KeyValuePair data in e.Data) { datas.Add(data.Key, data.Value); } string value = DataValue(datas); //base.LogDebug(value); SaveRunningDataList.Add(new RunningData(value)); if (SaveRunningDataList.Count < 20) { return; } #endregion #region 数据转存 List saveData = new List(); foreach (RunningData d in SaveRunningDataList) { saveData.Add(d); } SaveRunningDataList.Clear(); #endregion #region 组合执行语句 StringBuilder sqlstr = new StringBuilder("INSERT INTO PptRunningData(RecordTime,Data) VALUES "); dbHelper.ClearParameter(); for (int i = 0; i < saveData.Count; i++) { RunningData d = saveData[i]; #region 过滤掉同一秒的重复记录 if (i > 0) { if (String.Format("{0:yyyyMMddHHmmss}", saveData[i - 1].RecordTime) == String.Format("{0:yyyyMMddHHmmss}", d.RecordTime)) { continue; } } #endregion string key1 = "@RecordTime" + i.ToString(); string key2 = "@Data" + i.ToString(); if (dbHelper.DbSession.ProviderFactory.GetType().FullName.Contains("OracleClientFactory")) { key1 = ":RecordTime" + i.ToString(); key2 = ":Data" + i.ToString(); } sqlstr.Append(" (").Append(key1).Append(",").Append(key2).Append(")"); if (i < saveData.Count - 1) { sqlstr.AppendLine(","); } dbHelper.AddParameter(key1, d.RecordTime); dbHelper.AddParameter(key2, d.Data); } //插入语句 dbHelper.CommandText = sqlstr.ToString(); dbHelper.ExecuteNonQuery(); #endregion } } private static bool OnlyRun = false; public void Run(RuntimeParameter runtime) { if (OnlyRun) { return; } OnlyRun = true; dbHelper = NewDbHelper(Mesnac.Basic.DataSourceFactory.MCDbType.Local); dbHelper.OpenConnection(false); RefreshKeyIndex(0); #region 查找读取频率最小的设备 BaseEquip minRZEquip = null; foreach (BaseEquip equip in Mesnac.Equips.Factory.Instance.AllEquips.Values) { if (minRZEquip == null) { minRZEquip = equip; } else { if (equip.Main.ReadHz < minRZEquip.Main.ReadHz) { minRZEquip = equip; } } } #endregion //订阅读取频率最小设备的读取事件 if (minRZEquip != null) { minRZEquip.EquipReadData += ReadData; } } } #endregion }