private void SaveData(object obj) { while (true) { bool sleep = (bool)obj; try { DeviceData[] recDatas = receivedDatas.ToArray(); if (recDatas.Length > 0) { submitTable.Clear(); foreach (DeviceData item in recDatas) { DataRow dr_bg = submitTable.NewRow(); dr_bg["mt_name"] = "bg"; dr_bg["mt_value"] = item.Value; dr_bg["mt_isnormal"] = TmoDataComm.CheckValueIsNormal("bg", item.Value) ? 1 : 0; dr_bg["mt_time"] = item.ValueTime; dr_bg["mt_timestamp"] = TmoShare.DateTime2TimeStamp(item.ValueTime).ToString(); dr_bg["user_id"] = item.SerialNumber; dr_bg["dev_type"] = item.DeviceType; submitTable.Rows.Add(dr_bg); AddListMsg(null, item.ToString()); } bool addsuc = tmo_monitorManager.Instance.AddMonitorData(submitTable); if (!addsuc) { AddListMsg(null, "保存无线设备数据到数据库失败"); LogHelper.Log.Error("保存无线设备数据", new Exception("保存无线设备数据到数据库失败")); } else { foreach (DeviceData item in recDatas) { receivedDatas.Remove(item); } } } } catch (Exception ex) { AddListMsg(null, "SaveData 保存无线设备数据异常"); LogHelper.Log.Error("保存无线设备数据异常", ex); } if (sleep) { Thread.Sleep(10000); //10秒检测一次数据 } else { break; } } }
public bool AddMonitorData(DataTable submitTable) { try { if (TmoShare.DataTableIsNotEmpty(submitTable)) { List <string> sqlList = new List <string>(); DataTable dtstruct = MemoryCacheHelper.GetCacheItem <DataTable>("ts_tmo_monitor", () => MySQLHelper.QueryTableStruct("tmo_monitor").Tables[0], DateTime.Now.AddHours(24)); DataTable dtstruct1 = MemoryCacheHelper.GetCacheItem <DataTable>("ts_tmo_monitor_received", () => MySQLHelper.QueryTableStruct("tmo_monitor_received").Tables[0], DateTime.Now.AddHours(24)); DataTable dtdic = MemoryCacheHelper.GetCacheItem <DataTable>("tmo_dicmonitor", () => MySQLHelper.QueryTable("select * from tmo_dicmonitor where is_del=0"), DateTime.Now.AddHours(12)); foreach (DataRow dr in submitTable.Rows) { int mt_code = TmoDataComm.GetMtCode(dr["mt_name"].ToString()); if (mt_code == 0) { continue; } if (dr["mt_value"] == null) { continue; //跳过空值 } string mt_valuetype = "mt_valuetext"; DataRow[] drsdic = dtdic.Select("mt_code=" + mt_code); if (drsdic.Length > 0) { switch (drsdic[0]["mt_valuetype"].ToString()) { case "0": mt_valuetype = "mt_valueint"; break; case "1": mt_valuetype = "mt_valuefloat"; break; case "2": default: mt_valuetype = "mt_valuetext"; break; } } if (mt_valuetype != "mt_valuetext" && string.IsNullOrWhiteSpace(dr["mt_value"].ToString())) { continue; //跳过无效值 } string user_id = dr["user_id"].ToString(); string errmsg; bool isUserId = TmoShare.isIdCardNo(user_id, out errmsg); if (!isUserId) { //查找设备绑定关系 object tmp_userid = MySQLHelper.QuerySingle( $"select a.dev_userid from tmo_monitor_devicebind a left join tmo_userinfo b on a.dev_userid=b.user_id where b.is_del!=1 and a.dev_sn='{user_id}'"); if (tmp_userid != null) { user_id = tmp_userid.ToString(); //找到绑定关系 isUserId = true; } } Dictionary <string, string> colVals = new Dictionary <string, string>(); colVals.Add("mt_code", mt_code.ToString()); colVals.Add("user_id", user_id); DateTime mt_time = dr.GetDataRowDateTimeValue("mt_time"); int mt_timestamp = dr.GetDataRowIntValue("mt_timestamp"); if (mt_timestamp == -1 || mt_timestamp == -2) //错误timestamp { if (mt_time == DateTime.MinValue || mt_time == DateTime.MaxValue || mt_time > DateTime.Now) //无效值 { mt_time = DateTime.Now; } mt_timestamp = DateTimeHelper.TimeToStamp(mt_time); } else { mt_time = DateTimeHelper.StampToTime(mt_timestamp); if (mt_time == DateTime.MinValue || mt_time == DateTime.MaxValue || mt_time > DateTime.Now) //无效值 { mt_time = DateTime.Now; } mt_timestamp = DateTimeHelper.TimeToStamp(mt_time); } dr["mt_time"] = mt_time; colVals.Add("mt_timestamp", mt_timestamp.ToString()); int sameType = 0; //相同类型 DataTable saveTableStruct = null; if (isUserId) { saveTableStruct = dtstruct; if (MySQLHelper.Exists("tmo_monitor", colVals)) { sameType = 1; //有相同时间数据 } colVals.Add(mt_valuetype, dr["mt_value"].ToString()); if (MySQLHelper.Exists("tmo_monitor", colVals)) { continue; //判断是否存在相同值 } } else { saveTableStruct = dtstruct1; sameType = 2; //存储到临时接收表 colVals.Add(mt_valuetype, dr["mt_value"].ToString()); if (MySQLHelper.Exists("tmo_monitor_received", colVals)) { continue; //判断是否存在相同值 } colVals.Add("remark", dr.GetDataRowStringValue("dev_type")); } foreach (DataColumn dc in submitTable.Columns) { string colname = dc.ColumnName; if (!saveTableStruct.Columns.Contains(colname)) { continue; //非monitor表中字段跳过 } if (colVals.ContainsKey(colname)) { continue; //已添加字段跳过 } colVals.Add(colname, dr[dc].ToString()); } if (sameType == 0) //插入 { StringBuilder sbsql = new StringBuilder("insert into tmo_monitor("); StringBuilder sbsqlval = new StringBuilder(" values("); foreach (var item in colVals) { sbsql.Append(item.Key + ","); sbsqlval.AppendFormat("{0},", item.Value == String.Empty ? "null" : $"'{item.Value}'"); } sbsql.Append("input_time)"); sbsqlval.Append("SYSDATE())"); sqlList.Add(sbsql.ToString() + sbsqlval.ToString()); } else if (sameType == 1) //修改 { StringBuilder sbsql = new StringBuilder("update tmo_monitor set "); sbsql.AppendFormat(" {0}='{1}' ", mt_valuetype, colVals[mt_valuetype]); sbsql.AppendFormat(", {0}='{1}' ", "mt_isnormal", colVals["mt_isnormal"]); sbsql.AppendFormat(", {0}={1} ", "input_time", "SYSDATE()"); sbsql.AppendFormat("where {0}='{1}' and {2}='{3}' and {4}='{5}'", "mt_code", colVals["mt_code"], "user_id", colVals["user_id"], "mt_timestamp", colVals["mt_timestamp"]); sqlList.Add(sbsql.ToString()); } else if (sameType == 2) //存储到临时接收表 { StringBuilder sbsql = new StringBuilder("insert into tmo_monitor_received("); StringBuilder sbsqlval = new StringBuilder(" values("); foreach (var item in colVals) { sbsql.Append(item.Key + ","); sbsqlval.AppendFormat("'{0}',", item.Value); } sbsql.Append("input_time)"); sbsqlval.Append("SYSDATE())"); sqlList.Add(sbsql.ToString() + sbsqlval.ToString()); } } int count = MySQLHelper.ExecuteSqlTran(sqlList); return(count >= 0); } else { return(true); } } catch (Exception ex) { LogHelper.Log.Error("添加监测数据失败", ex); return(false); } }